Home | History | Annotate | Download | only in test
      1 /*
      2  * Copyright (C) 2015 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #include <stdlib.h>
     18 
     19 #include <memory>
     20 #include <string>
     21 
     22 #include <gtest/gtest.h>
     23 #include <android-base/file.h>
     24 
     25 #include "BacktraceMock.h"
     26 #include "log_fake.h"
     27 #include "utility.h"
     28 
     29 const char g_expected_full_dump[] =
     30 "\nmemory near r1:\n"
     31 #if defined(__LP64__)
     32 "    0000000012345658 0706050403020100 0f0e0d0c0b0a0908  ................\n"
     33 "    0000000012345668 1716151413121110 1f1e1d1c1b1a1918  ................\n"
     34 "    0000000012345678 2726252423222120 2f2e2d2c2b2a2928   !\"#$%&'()*+,-./\n"
     35 "    0000000012345688 3736353433323130 3f3e3d3c3b3a3938  0123456789:;<=>?\n"
     36 "    0000000012345698 4746454443424140 4f4e4d4c4b4a4948  @ABCDEFGHIJKLMNO\n"
     37 "    00000000123456a8 5756555453525150 5f5e5d5c5b5a5958  PQRSTUVWXYZ[\\]^_\n"
     38 "    00000000123456b8 6766656463626160 6f6e6d6c6b6a6968  `abcdefghijklmno\n"
     39 "    00000000123456c8 7776757473727170 7f7e7d7c7b7a7978  pqrstuvwxyz{|}~.\n"
     40 "    00000000123456d8 8786858483828180 8f8e8d8c8b8a8988  ................\n"
     41 "    00000000123456e8 9796959493929190 9f9e9d9c9b9a9998  ................\n"
     42 "    00000000123456f8 a7a6a5a4a3a2a1a0 afaeadacabaaa9a8  ................\n"
     43 "    0000000012345708 b7b6b5b4b3b2b1b0 bfbebdbcbbbab9b8  ................\n"
     44 "    0000000012345718 c7c6c5c4c3c2c1c0 cfcecdcccbcac9c8  ................\n"
     45 "    0000000012345728 d7d6d5d4d3d2d1d0 dfdedddcdbdad9d8  ................\n"
     46 "    0000000012345738 e7e6e5e4e3e2e1e0 efeeedecebeae9e8  ................\n"
     47 "    0000000012345748 f7f6f5f4f3f2f1f0 fffefdfcfbfaf9f8  ................\n";
     48 #else
     49 "    12345658 03020100 07060504 0b0a0908 0f0e0d0c  ................\n"
     50 "    12345668 13121110 17161514 1b1a1918 1f1e1d1c  ................\n"
     51 "    12345678 23222120 27262524 2b2a2928 2f2e2d2c   !\"#$%&'()*+,-./\n"
     52 "    12345688 33323130 37363534 3b3a3938 3f3e3d3c  0123456789:;<=>?\n"
     53 "    12345698 43424140 47464544 4b4a4948 4f4e4d4c  @ABCDEFGHIJKLMNO\n"
     54 "    123456a8 53525150 57565554 5b5a5958 5f5e5d5c  PQRSTUVWXYZ[\\]^_\n"
     55 "    123456b8 63626160 67666564 6b6a6968 6f6e6d6c  `abcdefghijklmno\n"
     56 "    123456c8 73727170 77767574 7b7a7978 7f7e7d7c  pqrstuvwxyz{|}~.\n"
     57 "    123456d8 83828180 87868584 8b8a8988 8f8e8d8c  ................\n"
     58 "    123456e8 93929190 97969594 9b9a9998 9f9e9d9c  ................\n"
     59 "    123456f8 a3a2a1a0 a7a6a5a4 abaaa9a8 afaeadac  ................\n"
     60 "    12345708 b3b2b1b0 b7b6b5b4 bbbab9b8 bfbebdbc  ................\n"
     61 "    12345718 c3c2c1c0 c7c6c5c4 cbcac9c8 cfcecdcc  ................\n"
     62 "    12345728 d3d2d1d0 d7d6d5d4 dbdad9d8 dfdedddc  ................\n"
     63 "    12345738 e3e2e1e0 e7e6e5e4 ebeae9e8 efeeedec  ................\n"
     64 "    12345748 f3f2f1f0 f7f6f5f4 fbfaf9f8 fffefdfc  ................\n";
     65 #endif
     66 
     67 const char g_expected_partial_dump[] = \
     68 "\nmemory near pc:\n"
     69 #if defined(__LP64__)
     70 "    00000000123455e0 0706050403020100 0f0e0d0c0b0a0908  ................\n"
     71 "    00000000123455f0 1716151413121110 1f1e1d1c1b1a1918  ................\n"
     72 "    0000000012345600 2726252423222120 2f2e2d2c2b2a2928   !\"#$%&'()*+,-./\n"
     73 "    0000000012345610 3736353433323130 3f3e3d3c3b3a3938  0123456789:;<=>?\n"
     74 "    0000000012345620 4746454443424140 4f4e4d4c4b4a4948  @ABCDEFGHIJKLMNO\n"
     75 "    0000000012345630 5756555453525150 5f5e5d5c5b5a5958  PQRSTUVWXYZ[\\]^_\n"
     76 "    0000000012345640 6766656463626160 ----------------  `abcdefg........\n"
     77 "    0000000012345650 ---------------- ----------------  ................\n"
     78 "    0000000012345660 ---------------- ----------------  ................\n"
     79 "    0000000012345670 ---------------- ----------------  ................\n"
     80 "    0000000012345680 ---------------- ----------------  ................\n"
     81 "    0000000012345690 ---------------- ----------------  ................\n"
     82 "    00000000123456a0 ---------------- ----------------  ................\n"
     83 "    00000000123456b0 ---------------- ----------------  ................\n"
     84 "    00000000123456c0 ---------------- ----------------  ................\n"
     85 "    00000000123456d0 ---------------- ----------------  ................\n";
     86 #else
     87 "    123455e0 03020100 07060504 0b0a0908 0f0e0d0c  ................\n"
     88 "    123455f0 13121110 17161514 1b1a1918 1f1e1d1c  ................\n"
     89 "    12345600 23222120 27262524 2b2a2928 2f2e2d2c   !\"#$%&'()*+,-./\n"
     90 "    12345610 33323130 37363534 3b3a3938 3f3e3d3c  0123456789:;<=>?\n"
     91 "    12345620 43424140 47464544 4b4a4948 4f4e4d4c  @ABCDEFGHIJKLMNO\n"
     92 "    12345630 53525150 57565554 5b5a5958 5f5e5d5c  PQRSTUVWXYZ[\\]^_\n"
     93 "    12345640 63626160 67666564 -------- --------  `abcdefg........\n"
     94 "    12345650 -------- -------- -------- --------  ................\n"
     95 "    12345660 -------- -------- -------- --------  ................\n"
     96 "    12345670 -------- -------- -------- --------  ................\n"
     97 "    12345680 -------- -------- -------- --------  ................\n"
     98 "    12345690 -------- -------- -------- --------  ................\n"
     99 "    123456a0 -------- -------- -------- --------  ................\n"
    100 "    123456b0 -------- -------- -------- --------  ................\n"
    101 "    123456c0 -------- -------- -------- --------  ................\n"
    102 "    123456d0 -------- -------- -------- --------  ................\n";
    103 #endif
    104 
    105 class DumpMemoryTest : public ::testing::Test {
    106  protected:
    107   virtual void SetUp() {
    108     map_mock_.reset(new BacktraceMapMock());
    109     backtrace_mock_.reset(new BacktraceMock(map_mock_.get()));
    110 
    111     char tmp_file[256];
    112     const char data_template[] = "/data/local/tmp/debuggerd_memory_testXXXXXX";
    113     memcpy(tmp_file, data_template, sizeof(data_template));
    114     int tombstone_fd = mkstemp(tmp_file);
    115     if (tombstone_fd == -1) {
    116       const char tmp_template[] = "/tmp/debuggerd_memory_testXXXXXX";
    117       memcpy(tmp_file, tmp_template, sizeof(tmp_template));
    118       tombstone_fd = mkstemp(tmp_file);
    119       if (tombstone_fd == -1) {
    120         abort();
    121       }
    122     }
    123     if (unlink(tmp_file) == -1) {
    124       abort();
    125     }
    126 
    127     log_.tfd = tombstone_fd;
    128     log_.amfd_data = nullptr;
    129     log_.crashed_tid = 12;
    130     log_.current_tid = 12;
    131     log_.should_retrieve_logcat = false;
    132 
    133     resetLogs();
    134   }
    135 
    136   virtual void TearDown() {
    137     if (log_.tfd >= 0) {
    138       close(log_.tfd);
    139     }
    140   }
    141 
    142   std::unique_ptr<BacktraceMapMock> map_mock_;
    143   std::unique_ptr<BacktraceMock> backtrace_mock_;
    144 
    145   log_t log_;
    146 };
    147 
    148 TEST_F(DumpMemoryTest, aligned_addr) {
    149   uint8_t buffer[256];
    150   for (size_t i = 0; i < sizeof(buffer); i++) {
    151     buffer[i] = i;
    152   }
    153   backtrace_mock_->SetReadData(buffer, sizeof(buffer));
    154 
    155   dump_memory(&log_, backtrace_mock_.get(), 0x12345678, "memory near %.2s:", "r1");
    156 
    157   std::string tombstone_contents;
    158   ASSERT_TRUE(lseek(log_.tfd, 0, SEEK_SET) == 0);
    159   ASSERT_TRUE(android::base::ReadFdToString(log_.tfd, &tombstone_contents));
    160   ASSERT_STREQ(g_expected_full_dump, tombstone_contents.c_str());
    161 
    162   // Verify that the log buf is empty, and no error messages.
    163   ASSERT_STREQ("", getFakeLogBuf().c_str());
    164   ASSERT_STREQ("", getFakeLogPrint().c_str());
    165 }
    166 
    167 TEST_F(DumpMemoryTest, partial_read) {
    168   uint8_t buffer[256];
    169   for (size_t i = 0; i < sizeof(buffer); i++) {
    170     buffer[i] = i;
    171   }
    172   backtrace_mock_->SetReadData(buffer, sizeof(buffer));
    173   backtrace_mock_->SetPartialReadAmount(96);
    174 
    175   dump_memory(&log_, backtrace_mock_.get(), 0x12345679, "memory near %.2s:", "r1");
    176 
    177   std::string tombstone_contents;
    178   ASSERT_TRUE(lseek(log_.tfd, 0, SEEK_SET) == 0);
    179   ASSERT_TRUE(android::base::ReadFdToString(log_.tfd, &tombstone_contents));
    180   ASSERT_STREQ(g_expected_full_dump, tombstone_contents.c_str());
    181 
    182   // Verify that the log buf is empty, and no error messages.
    183   ASSERT_STREQ("", getFakeLogBuf().c_str());
    184   ASSERT_STREQ("", getFakeLogPrint().c_str());
    185 }
    186 
    187 TEST_F(DumpMemoryTest, unaligned_addr) {
    188   uint8_t buffer[256];
    189   for (size_t i = 0; i < sizeof(buffer); i++) {
    190     buffer[i] = i;
    191   }
    192   backtrace_mock_->SetReadData(buffer, sizeof(buffer));
    193 
    194   dump_memory(&log_, backtrace_mock_.get(), 0x12345679, "memory near %.2s:", "r1");
    195 
    196   std::string tombstone_contents;
    197   ASSERT_TRUE(lseek(log_.tfd, 0, SEEK_SET) == 0);
    198   ASSERT_TRUE(android::base::ReadFdToString(log_.tfd, &tombstone_contents));
    199   ASSERT_STREQ(g_expected_full_dump, tombstone_contents.c_str());
    200 
    201   // Verify that the log buf is empty, and no error messages.
    202   ASSERT_STREQ("", getFakeLogBuf().c_str());
    203   ASSERT_STREQ("", getFakeLogPrint().c_str());
    204 }
    205 
    206 TEST_F(DumpMemoryTest, memory_unreadable) {
    207   dump_memory(&log_, backtrace_mock_.get(), 0xa2345678, "memory near pc:");
    208 
    209   std::string tombstone_contents;
    210   ASSERT_TRUE(lseek(log_.tfd, 0, SEEK_SET) == 0);
    211   ASSERT_TRUE(android::base::ReadFdToString(log_.tfd, &tombstone_contents));
    212   const char* expected_dump = \
    213 "\nmemory near pc:\n"
    214 #if defined(__LP64__)
    215 "    00000000a2345658 ---------------- ----------------  ................\n"
    216 "    00000000a2345668 ---------------- ----------------  ................\n"
    217 "    00000000a2345678 ---------------- ----------------  ................\n"
    218 "    00000000a2345688 ---------------- ----------------  ................\n"
    219 "    00000000a2345698 ---------------- ----------------  ................\n"
    220 "    00000000a23456a8 ---------------- ----------------  ................\n"
    221 "    00000000a23456b8 ---------------- ----------------  ................\n"
    222 "    00000000a23456c8 ---------------- ----------------  ................\n"
    223 "    00000000a23456d8 ---------------- ----------------  ................\n"
    224 "    00000000a23456e8 ---------------- ----------------  ................\n"
    225 "    00000000a23456f8 ---------------- ----------------  ................\n"
    226 "    00000000a2345708 ---------------- ----------------  ................\n"
    227 "    00000000a2345718 ---------------- ----------------  ................\n"
    228 "    00000000a2345728 ---------------- ----------------  ................\n"
    229 "    00000000a2345738 ---------------- ----------------  ................\n"
    230 "    00000000a2345748 ---------------- ----------------  ................\n";
    231 #else
    232 "    a2345658 -------- -------- -------- --------  ................\n"
    233 "    a2345668 -------- -------- -------- --------  ................\n"
    234 "    a2345678 -------- -------- -------- --------  ................\n"
    235 "    a2345688 -------- -------- -------- --------  ................\n"
    236 "    a2345698 -------- -------- -------- --------  ................\n"
    237 "    a23456a8 -------- -------- -------- --------  ................\n"
    238 "    a23456b8 -------- -------- -------- --------  ................\n"
    239 "    a23456c8 -------- -------- -------- --------  ................\n"
    240 "    a23456d8 -------- -------- -------- --------  ................\n"
    241 "    a23456e8 -------- -------- -------- --------  ................\n"
    242 "    a23456f8 -------- -------- -------- --------  ................\n"
    243 "    a2345708 -------- -------- -------- --------  ................\n"
    244 "    a2345718 -------- -------- -------- --------  ................\n"
    245 "    a2345728 -------- -------- -------- --------  ................\n"
    246 "    a2345738 -------- -------- -------- --------  ................\n"
    247 "    a2345748 -------- -------- -------- --------  ................\n";
    248 #endif
    249   ASSERT_STREQ(expected_dump, tombstone_contents.c_str());
    250 
    251   // Verify that the log buf is empty, and no error messages.
    252   ASSERT_STREQ("", getFakeLogBuf().c_str());
    253   ASSERT_STREQ("", getFakeLogPrint().c_str());
    254 }
    255 
    256 TEST_F(DumpMemoryTest, memory_partially_unreadable) {
    257   uint8_t buffer[104];
    258   for (size_t i = 0; i < sizeof(buffer); i++) {
    259     buffer[i] = i;
    260   }
    261   backtrace_mock_->SetReadData(buffer, sizeof(buffer));
    262 
    263   dump_memory(&log_, backtrace_mock_.get(), 0x12345600, "memory near pc:");
    264 
    265   std::string tombstone_contents;
    266   ASSERT_TRUE(lseek(log_.tfd, 0, SEEK_SET) == 0);
    267   ASSERT_TRUE(android::base::ReadFdToString(log_.tfd, &tombstone_contents));
    268   ASSERT_STREQ(g_expected_partial_dump, tombstone_contents.c_str());
    269 
    270   // Verify that the log buf is empty, and no error messages.
    271   ASSERT_STREQ("", getFakeLogBuf().c_str());
    272   ASSERT_STREQ("", getFakeLogPrint().c_str());
    273 }
    274 
    275 TEST_F(DumpMemoryTest, memory_partially_unreadable_unaligned_return) {
    276   uint8_t buffer[104];
    277   for (size_t i = 0; i < sizeof(buffer); i++) {
    278     buffer[i] = i;
    279   }
    280   backtrace_mock_->SetReadData(buffer, sizeof(buffer));
    281   backtrace_mock_->SetPartialReadAmount(102);
    282 
    283   dump_memory(&log_, backtrace_mock_.get(), 0x12345600, "memory near pc:");
    284 
    285   std::string tombstone_contents;
    286   ASSERT_TRUE(lseek(log_.tfd, 0, SEEK_SET) == 0);
    287   ASSERT_TRUE(android::base::ReadFdToString(log_.tfd, &tombstone_contents));
    288   ASSERT_STREQ(g_expected_partial_dump, tombstone_contents.c_str());
    289 
    290 #if defined(__LP64__)
    291   ASSERT_STREQ("6 DEBUG Bytes read 102, is not a multiple of 8\n", getFakeLogPrint().c_str());
    292 #else
    293   ASSERT_STREQ("6 DEBUG Bytes read 102, is not a multiple of 4\n", getFakeLogPrint().c_str());
    294 #endif
    295 
    296   // Verify that the log buf is empty, and no error messages.
    297   ASSERT_STREQ("", getFakeLogBuf().c_str());
    298 }
    299 
    300 TEST_F(DumpMemoryTest, memory_partially_unreadable_two_unaligned_reads) {
    301   uint8_t buffer[106];
    302   for (size_t i = 0; i < sizeof(buffer); i++) {
    303     buffer[i] = i;
    304   }
    305   backtrace_mock_->SetReadData(buffer, sizeof(buffer));
    306   backtrace_mock_->SetPartialReadAmount(45);
    307 
    308   dump_memory(&log_, backtrace_mock_.get(), 0x12345600, "memory near pc:");
    309 
    310   std::string tombstone_contents;
    311   ASSERT_TRUE(lseek(log_.tfd, 0, SEEK_SET) == 0);
    312   ASSERT_TRUE(android::base::ReadFdToString(log_.tfd, &tombstone_contents));
    313   ASSERT_STREQ(g_expected_partial_dump, tombstone_contents.c_str());
    314 
    315 #if defined(__LP64__)
    316   ASSERT_STREQ("6 DEBUG Bytes read 45, is not a multiple of 8\n"
    317                "6 DEBUG Bytes after second read 106, is not a multiple of 8\n",
    318                getFakeLogPrint().c_str());
    319 #else
    320   ASSERT_STREQ("6 DEBUG Bytes read 45, is not a multiple of 4\n"
    321                "6 DEBUG Bytes after second read 106, is not a multiple of 4\n",
    322                getFakeLogPrint().c_str());
    323 #endif
    324 
    325   // Verify that the log buf is empty, and no error messages.
    326   ASSERT_STREQ("", getFakeLogBuf().c_str());
    327 }
    328 
    329 TEST_F(DumpMemoryTest, address_low_fence) {
    330   uint8_t buffer[256];
    331   memset(buffer, 0, sizeof(buffer));
    332   backtrace_mock_->SetReadData(buffer, sizeof(buffer));
    333 
    334   dump_memory(&log_, backtrace_mock_.get(), 0x1000, "memory near %.2s:", "r1");
    335 
    336   std::string tombstone_contents;
    337   ASSERT_TRUE(lseek(log_.tfd, 0, SEEK_SET) == 0);
    338   ASSERT_TRUE(android::base::ReadFdToString(log_.tfd, &tombstone_contents));
    339   const char* expected_dump = \
    340 "\nmemory near r1:\n"
    341 #if defined(__LP64__)
    342 "    0000000000001000 0000000000000000 0000000000000000  ................\n"
    343 "    0000000000001010 0000000000000000 0000000000000000  ................\n"
    344 "    0000000000001020 0000000000000000 0000000000000000  ................\n"
    345 "    0000000000001030 0000000000000000 0000000000000000  ................\n"
    346 "    0000000000001040 0000000000000000 0000000000000000  ................\n"
    347 "    0000000000001050 0000000000000000 0000000000000000  ................\n"
    348 "    0000000000001060 0000000000000000 0000000000000000  ................\n"
    349 "    0000000000001070 0000000000000000 0000000000000000  ................\n"
    350 "    0000000000001080 0000000000000000 0000000000000000  ................\n"
    351 "    0000000000001090 0000000000000000 0000000000000000  ................\n"
    352 "    00000000000010a0 0000000000000000 0000000000000000  ................\n"
    353 "    00000000000010b0 0000000000000000 0000000000000000  ................\n"
    354 "    00000000000010c0 0000000000000000 0000000000000000  ................\n"
    355 "    00000000000010d0 0000000000000000 0000000000000000  ................\n"
    356 "    00000000000010e0 0000000000000000 0000000000000000  ................\n"
    357 "    00000000000010f0 0000000000000000 0000000000000000  ................\n";
    358 #else
    359 "    00001000 00000000 00000000 00000000 00000000  ................\n"
    360 "    00001010 00000000 00000000 00000000 00000000  ................\n"
    361 "    00001020 00000000 00000000 00000000 00000000  ................\n"
    362 "    00001030 00000000 00000000 00000000 00000000  ................\n"
    363 "    00001040 00000000 00000000 00000000 00000000  ................\n"
    364 "    00001050 00000000 00000000 00000000 00000000  ................\n"
    365 "    00001060 00000000 00000000 00000000 00000000  ................\n"
    366 "    00001070 00000000 00000000 00000000 00000000  ................\n"
    367 "    00001080 00000000 00000000 00000000 00000000  ................\n"
    368 "    00001090 00000000 00000000 00000000 00000000  ................\n"
    369 "    000010a0 00000000 00000000 00000000 00000000  ................\n"
    370 "    000010b0 00000000 00000000 00000000 00000000  ................\n"
    371 "    000010c0 00000000 00000000 00000000 00000000  ................\n"
    372 "    000010d0 00000000 00000000 00000000 00000000  ................\n"
    373 "    000010e0 00000000 00000000 00000000 00000000  ................\n"
    374 "    000010f0 00000000 00000000 00000000 00000000  ................\n";
    375 #endif
    376   ASSERT_STREQ(expected_dump, tombstone_contents.c_str());
    377 
    378   // Verify that the log buf is empty, and no error messages.
    379   ASSERT_STREQ("", getFakeLogBuf().c_str());
    380   ASSERT_STREQ("", getFakeLogPrint().c_str());
    381 }
    382 
    383 TEST_F(DumpMemoryTest, memory_address_too_low) {
    384   uint8_t buffer[256];
    385   memset(buffer, 0, sizeof(buffer));
    386   backtrace_mock_->SetReadData(buffer, sizeof(buffer));
    387 
    388   dump_memory(&log_, backtrace_mock_.get(), 0, "memory near %.2s:", "r1");
    389 
    390   std::string tombstone_contents;
    391   ASSERT_TRUE(lseek(log_.tfd, 0, SEEK_SET) == 0);
    392   ASSERT_TRUE(android::base::ReadFdToString(log_.tfd, &tombstone_contents));
    393   ASSERT_STREQ("", tombstone_contents.c_str());
    394 
    395   // Verify that the log buf is empty, and no error messages.
    396   ASSERT_STREQ("", getFakeLogBuf().c_str());
    397   ASSERT_STREQ("", getFakeLogPrint().c_str());
    398 }
    399 
    400 TEST_F(DumpMemoryTest, memory_address_too_high) {
    401   uint8_t buffer[256];
    402   memset(buffer, 0, sizeof(buffer));
    403   backtrace_mock_->SetReadData(buffer, sizeof(buffer));
    404 
    405 #if defined(__LP64__)
    406   dump_memory(&log_, backtrace_mock_.get(), 0x4000000000000000UL, "memory near %.2s:", "r1");
    407   dump_memory(&log_, backtrace_mock_.get(), 0x4000000000000000UL - 32, "memory near %.2s:", "r1");
    408   dump_memory(&log_, backtrace_mock_.get(), 0x4000000000000000UL - 216, "memory near %.2s:", "r1");
    409 #else
    410   dump_memory(&log_, backtrace_mock_.get(), 0xffff0000, "memory near %.2s:", "r1");
    411   dump_memory(&log_, backtrace_mock_.get(), 0xffff0000 - 32, "memory near %.2s:", "r1");
    412   dump_memory(&log_, backtrace_mock_.get(), 0xffff0000 - 220, "memory near %.2s:", "r1");
    413 #endif
    414 
    415   std::string tombstone_contents;
    416   ASSERT_TRUE(lseek(log_.tfd, 0, SEEK_SET) == 0);
    417   ASSERT_TRUE(android::base::ReadFdToString(log_.tfd, &tombstone_contents));
    418   ASSERT_STREQ("", tombstone_contents.c_str());
    419 
    420   // Verify that the log buf is empty, and no error messages.
    421   ASSERT_STREQ("", getFakeLogBuf().c_str());
    422   ASSERT_STREQ("", getFakeLogPrint().c_str());
    423 }
    424 
    425 TEST_F(DumpMemoryTest, memory_address_would_overflow) {
    426   uint8_t buffer[256];
    427   memset(buffer, 0, sizeof(buffer));
    428   backtrace_mock_->SetReadData(buffer, sizeof(buffer));
    429 
    430 #if defined(__LP64__)
    431   dump_memory(&log_, backtrace_mock_.get(), 0xfffffffffffffff0, "memory near %.2s:", "r1");
    432 #else
    433   dump_memory(&log_, backtrace_mock_.get(), 0xfffffff0, "memory near %.2s:", "r1");
    434 #endif
    435 
    436   std::string tombstone_contents;
    437   ASSERT_TRUE(lseek(log_.tfd, 0, SEEK_SET) == 0);
    438   ASSERT_TRUE(android::base::ReadFdToString(log_.tfd, &tombstone_contents));
    439   ASSERT_STREQ("", tombstone_contents.c_str());
    440 
    441   // Verify that the log buf is empty, and no error messages.
    442   ASSERT_STREQ("", getFakeLogBuf().c_str());
    443   ASSERT_STREQ("", getFakeLogPrint().c_str());
    444 }
    445 
    446 TEST_F(DumpMemoryTest, memory_address_nearly_too_high) {
    447   uint8_t buffer[256];
    448   for (size_t i = 0; i < sizeof(buffer); i++) {
    449     buffer[i] = i;
    450   }
    451   backtrace_mock_->SetReadData(buffer, sizeof(buffer));
    452 
    453 #if defined(__LP64__)
    454   dump_memory(&log_, backtrace_mock_.get(), 0x4000000000000000UL - 224, "memory near %.2s:", "r4");
    455 #else
    456   dump_memory(&log_, backtrace_mock_.get(), 0xffff0000 - 224, "memory near %.2s:", "r4");
    457 #endif
    458 
    459   std::string tombstone_contents;
    460   ASSERT_TRUE(lseek(log_.tfd, 0, SEEK_SET) == 0);
    461   ASSERT_TRUE(android::base::ReadFdToString(log_.tfd, &tombstone_contents));
    462   const char* expected_dump = \
    463 "\nmemory near r4:\n"
    464 #if defined(__LP64__)
    465 "    3fffffffffffff00 0706050403020100 0f0e0d0c0b0a0908  ................\n"
    466 "    3fffffffffffff10 1716151413121110 1f1e1d1c1b1a1918  ................\n"
    467 "    3fffffffffffff20 2726252423222120 2f2e2d2c2b2a2928   !\"#$%&'()*+,-./\n"
    468 "    3fffffffffffff30 3736353433323130 3f3e3d3c3b3a3938  0123456789:;<=>?\n"
    469 "    3fffffffffffff40 4746454443424140 4f4e4d4c4b4a4948  @ABCDEFGHIJKLMNO\n"
    470 "    3fffffffffffff50 5756555453525150 5f5e5d5c5b5a5958  PQRSTUVWXYZ[\\]^_\n"
    471 "    3fffffffffffff60 6766656463626160 6f6e6d6c6b6a6968  `abcdefghijklmno\n"
    472 "    3fffffffffffff70 7776757473727170 7f7e7d7c7b7a7978  pqrstuvwxyz{|}~.\n"
    473 "    3fffffffffffff80 8786858483828180 8f8e8d8c8b8a8988  ................\n"
    474 "    3fffffffffffff90 9796959493929190 9f9e9d9c9b9a9998  ................\n"
    475 "    3fffffffffffffa0 a7a6a5a4a3a2a1a0 afaeadacabaaa9a8  ................\n"
    476 "    3fffffffffffffb0 b7b6b5b4b3b2b1b0 bfbebdbcbbbab9b8  ................\n"
    477 "    3fffffffffffffc0 c7c6c5c4c3c2c1c0 cfcecdcccbcac9c8  ................\n"
    478 "    3fffffffffffffd0 d7d6d5d4d3d2d1d0 dfdedddcdbdad9d8  ................\n"
    479 "    3fffffffffffffe0 e7e6e5e4e3e2e1e0 efeeedecebeae9e8  ................\n"
    480 "    3ffffffffffffff0 f7f6f5f4f3f2f1f0 fffefdfcfbfaf9f8  ................\n";
    481 #else
    482 "    fffeff00 03020100 07060504 0b0a0908 0f0e0d0c  ................\n"
    483 "    fffeff10 13121110 17161514 1b1a1918 1f1e1d1c  ................\n"
    484 "    fffeff20 23222120 27262524 2b2a2928 2f2e2d2c   !\"#$%&'()*+,-./\n"
    485 "    fffeff30 33323130 37363534 3b3a3938 3f3e3d3c  0123456789:;<=>?\n"
    486 "    fffeff40 43424140 47464544 4b4a4948 4f4e4d4c  @ABCDEFGHIJKLMNO\n"
    487 "    fffeff50 53525150 57565554 5b5a5958 5f5e5d5c  PQRSTUVWXYZ[\\]^_\n"
    488 "    fffeff60 63626160 67666564 6b6a6968 6f6e6d6c  `abcdefghijklmno\n"
    489 "    fffeff70 73727170 77767574 7b7a7978 7f7e7d7c  pqrstuvwxyz{|}~.\n"
    490 "    fffeff80 83828180 87868584 8b8a8988 8f8e8d8c  ................\n"
    491 "    fffeff90 93929190 97969594 9b9a9998 9f9e9d9c  ................\n"
    492 "    fffeffa0 a3a2a1a0 a7a6a5a4 abaaa9a8 afaeadac  ................\n"
    493 "    fffeffb0 b3b2b1b0 b7b6b5b4 bbbab9b8 bfbebdbc  ................\n"
    494 "    fffeffc0 c3c2c1c0 c7c6c5c4 cbcac9c8 cfcecdcc  ................\n"
    495 "    fffeffd0 d3d2d1d0 d7d6d5d4 dbdad9d8 dfdedddc  ................\n"
    496 "    fffeffe0 e3e2e1e0 e7e6e5e4 ebeae9e8 efeeedec  ................\n"
    497 "    fffefff0 f3f2f1f0 f7f6f5f4 fbfaf9f8 fffefdfc  ................\n";
    498 #endif
    499   ASSERT_STREQ(expected_dump, tombstone_contents.c_str());
    500 
    501   // Verify that the log buf is empty, and no error messages.
    502   ASSERT_STREQ("", getFakeLogBuf().c_str());
    503   ASSERT_STREQ("", getFakeLogPrint().c_str());
    504 }
    505 
    506 TEST_F(DumpMemoryTest, first_read_empty) {
    507   uint8_t buffer[256];
    508   for (size_t i = 0; i < sizeof(buffer); i++) {
    509     buffer[i] = i;
    510   }
    511   backtrace_mock_->SetReadData(buffer, sizeof(buffer));
    512   backtrace_mock_->SetPartialReadAmount(0);
    513 
    514   size_t page_size = sysconf(_SC_PAGE_SIZE);
    515   uintptr_t addr = 0x10000020 + page_size - 120;
    516   dump_memory(&log_, backtrace_mock_.get(), addr, "memory near %.2s:", "r4");
    517 
    518   std::string tombstone_contents;
    519   ASSERT_TRUE(lseek(log_.tfd, 0, SEEK_SET) == 0);
    520   ASSERT_TRUE(android::base::ReadFdToString(log_.tfd, &tombstone_contents));
    521   const char* expected_dump = \
    522 "\nmemory near r4:\n"
    523 #if defined(__LP64__)
    524 "    0000000010000f88 ---------------- ----------------  ................\n"
    525 "    0000000010000f98 ---------------- ----------------  ................\n"
    526 "    0000000010000fa8 ---------------- ----------------  ................\n"
    527 "    0000000010000fb8 ---------------- ----------------  ................\n"
    528 "    0000000010000fc8 ---------------- ----------------  ................\n"
    529 "    0000000010000fd8 ---------------- ----------------  ................\n"
    530 "    0000000010000fe8 ---------------- ----------------  ................\n"
    531 "    0000000010000ff8 ---------------- 7f7e7d7c7b7a7978  ........xyz{|}~.\n"
    532 "    0000000010001008 8786858483828180 8f8e8d8c8b8a8988  ................\n"
    533 "    0000000010001018 9796959493929190 9f9e9d9c9b9a9998  ................\n"
    534 "    0000000010001028 a7a6a5a4a3a2a1a0 afaeadacabaaa9a8  ................\n"
    535 "    0000000010001038 b7b6b5b4b3b2b1b0 bfbebdbcbbbab9b8  ................\n"
    536 "    0000000010001048 c7c6c5c4c3c2c1c0 cfcecdcccbcac9c8  ................\n"
    537 "    0000000010001058 d7d6d5d4d3d2d1d0 dfdedddcdbdad9d8  ................\n"
    538 "    0000000010001068 e7e6e5e4e3e2e1e0 efeeedecebeae9e8  ................\n"
    539 "    0000000010001078 f7f6f5f4f3f2f1f0 fffefdfcfbfaf9f8  ................\n";
    540 #else
    541 "    10000f88 -------- -------- -------- --------  ................\n"
    542 "    10000f98 -------- -------- -------- --------  ................\n"
    543 "    10000fa8 -------- -------- -------- --------  ................\n"
    544 "    10000fb8 -------- -------- -------- --------  ................\n"
    545 "    10000fc8 -------- -------- -------- --------  ................\n"
    546 "    10000fd8 -------- -------- -------- --------  ................\n"
    547 "    10000fe8 -------- -------- -------- --------  ................\n"
    548 "    10000ff8 -------- -------- 7b7a7978 7f7e7d7c  ........xyz{|}~.\n"
    549 "    10001008 83828180 87868584 8b8a8988 8f8e8d8c  ................\n"
    550 "    10001018 93929190 97969594 9b9a9998 9f9e9d9c  ................\n"
    551 "    10001028 a3a2a1a0 a7a6a5a4 abaaa9a8 afaeadac  ................\n"
    552 "    10001038 b3b2b1b0 b7b6b5b4 bbbab9b8 bfbebdbc  ................\n"
    553 "    10001048 c3c2c1c0 c7c6c5c4 cbcac9c8 cfcecdcc  ................\n"
    554 "    10001058 d3d2d1d0 d7d6d5d4 dbdad9d8 dfdedddc  ................\n"
    555 "    10001068 e3e2e1e0 e7e6e5e4 ebeae9e8 efeeedec  ................\n"
    556 "    10001078 f3f2f1f0 f7f6f5f4 fbfaf9f8 fffefdfc  ................\n";
    557 #endif
    558   ASSERT_STREQ(expected_dump, tombstone_contents.c_str());
    559 
    560   // Verify that the log buf is empty, and no error messages.
    561   ASSERT_STREQ("", getFakeLogBuf().c_str());
    562   ASSERT_STREQ("", getFakeLogPrint().c_str());
    563 }
    564 
    565 TEST_F(DumpMemoryTest, first_read_empty_second_read_stops) {
    566   uint8_t buffer[224];
    567   for (size_t i = 0; i < sizeof(buffer); i++) {
    568     buffer[i] = i;
    569   }
    570   backtrace_mock_->SetReadData(buffer, sizeof(buffer));
    571   backtrace_mock_->SetPartialReadAmount(0);
    572 
    573   size_t page_size = sysconf(_SC_PAGE_SIZE);
    574   uintptr_t addr = 0x10000020 + page_size - 192;
    575   dump_memory(&log_, backtrace_mock_.get(), addr, "memory near %.2s:", "r4");
    576 
    577   std::string tombstone_contents;
    578   ASSERT_TRUE(lseek(log_.tfd, 0, SEEK_SET) == 0);
    579   ASSERT_TRUE(android::base::ReadFdToString(log_.tfd, &tombstone_contents));
    580   const char* expected_dump = \
    581 "\nmemory near r4:\n"
    582 #if defined(__LP64__)
    583 "    0000000010000f40 ---------------- ----------------  ................\n"
    584 "    0000000010000f50 ---------------- ----------------  ................\n"
    585 "    0000000010000f60 ---------------- ----------------  ................\n"
    586 "    0000000010000f70 ---------------- ----------------  ................\n"
    587 "    0000000010000f80 ---------------- ----------------  ................\n"
    588 "    0000000010000f90 ---------------- ----------------  ................\n"
    589 "    0000000010000fa0 ---------------- ----------------  ................\n"
    590 "    0000000010000fb0 ---------------- ----------------  ................\n"
    591 "    0000000010000fc0 ---------------- ----------------  ................\n"
    592 "    0000000010000fd0 ---------------- ----------------  ................\n"
    593 "    0000000010000fe0 ---------------- ----------------  ................\n"
    594 "    0000000010000ff0 ---------------- ----------------  ................\n"
    595 "    0000000010001000 c7c6c5c4c3c2c1c0 cfcecdcccbcac9c8  ................\n"
    596 "    0000000010001010 d7d6d5d4d3d2d1d0 dfdedddcdbdad9d8  ................\n"
    597 "    0000000010001020 ---------------- ----------------  ................\n"
    598 "    0000000010001030 ---------------- ----------------  ................\n";
    599 #else
    600 "    10000f40 -------- -------- -------- --------  ................\n"
    601 "    10000f50 -------- -------- -------- --------  ................\n"
    602 "    10000f60 -------- -------- -------- --------  ................\n"
    603 "    10000f70 -------- -------- -------- --------  ................\n"
    604 "    10000f80 -------- -------- -------- --------  ................\n"
    605 "    10000f90 -------- -------- -------- --------  ................\n"
    606 "    10000fa0 -------- -------- -------- --------  ................\n"
    607 "    10000fb0 -------- -------- -------- --------  ................\n"
    608 "    10000fc0 -------- -------- -------- --------  ................\n"
    609 "    10000fd0 -------- -------- -------- --------  ................\n"
    610 "    10000fe0 -------- -------- -------- --------  ................\n"
    611 "    10000ff0 -------- -------- -------- --------  ................\n"
    612 "    10001000 c3c2c1c0 c7c6c5c4 cbcac9c8 cfcecdcc  ................\n"
    613 "    10001010 d3d2d1d0 d7d6d5d4 dbdad9d8 dfdedddc  ................\n"
    614 "    10001020 -------- -------- -------- --------  ................\n"
    615 "    10001030 -------- -------- -------- --------  ................\n";
    616 #endif
    617   ASSERT_STREQ(expected_dump, tombstone_contents.c_str());
    618 
    619   // Verify that the log buf is empty, and no error messages.
    620   ASSERT_STREQ("", getFakeLogBuf().c_str());
    621   ASSERT_STREQ("", getFakeLogPrint().c_str());
    622 }
    623 
    624 TEST_F(DumpMemoryTest, first_read_empty_next_page_out_of_range) {
    625   uint8_t buffer[256];
    626   for (size_t i = 0; i < sizeof(buffer); i++) {
    627     buffer[i] = i;
    628   }
    629   backtrace_mock_->SetReadData(buffer, sizeof(buffer));
    630   backtrace_mock_->SetPartialReadAmount(0);
    631 
    632   uintptr_t addr = 0x10000020;
    633   dump_memory(&log_, backtrace_mock_.get(), addr, "memory near %.2s:", "r4");
    634 
    635   std::string tombstone_contents;
    636   ASSERT_TRUE(lseek(log_.tfd, 0, SEEK_SET) == 0);
    637   ASSERT_TRUE(android::base::ReadFdToString(log_.tfd, &tombstone_contents));
    638   const char* expected_dump = \
    639 "\nmemory near r4:\n"
    640 #if defined(__LP64__)
    641 "    0000000010000000 ---------------- ----------------  ................\n"
    642 "    0000000010000010 ---------------- ----------------  ................\n"
    643 "    0000000010000020 ---------------- ----------------  ................\n"
    644 "    0000000010000030 ---------------- ----------------  ................\n"
    645 "    0000000010000040 ---------------- ----------------  ................\n"
    646 "    0000000010000050 ---------------- ----------------  ................\n"
    647 "    0000000010000060 ---------------- ----------------  ................\n"
    648 "    0000000010000070 ---------------- ----------------  ................\n"
    649 "    0000000010000080 ---------------- ----------------  ................\n"
    650 "    0000000010000090 ---------------- ----------------  ................\n"
    651 "    00000000100000a0 ---------------- ----------------  ................\n"
    652 "    00000000100000b0 ---------------- ----------------  ................\n"
    653 "    00000000100000c0 ---------------- ----------------  ................\n"
    654 "    00000000100000d0 ---------------- ----------------  ................\n"
    655 "    00000000100000e0 ---------------- ----------------  ................\n"
    656 "    00000000100000f0 ---------------- ----------------  ................\n";
    657 #else
    658 "    10000000 -------- -------- -------- --------  ................\n"
    659 "    10000010 -------- -------- -------- --------  ................\n"
    660 "    10000020 -------- -------- -------- --------  ................\n"
    661 "    10000030 -------- -------- -------- --------  ................\n"
    662 "    10000040 -------- -------- -------- --------  ................\n"
    663 "    10000050 -------- -------- -------- --------  ................\n"
    664 "    10000060 -------- -------- -------- --------  ................\n"
    665 "    10000070 -------- -------- -------- --------  ................\n"
    666 "    10000080 -------- -------- -------- --------  ................\n"
    667 "    10000090 -------- -------- -------- --------  ................\n"
    668 "    100000a0 -------- -------- -------- --------  ................\n"
    669 "    100000b0 -------- -------- -------- --------  ................\n"
    670 "    100000c0 -------- -------- -------- --------  ................\n"
    671 "    100000d0 -------- -------- -------- --------  ................\n"
    672 "    100000e0 -------- -------- -------- --------  ................\n"
    673 "    100000f0 -------- -------- -------- --------  ................\n";
    674 #endif
    675   ASSERT_STREQ(expected_dump, tombstone_contents.c_str());
    676 
    677   // Verify that the log buf is empty, and no error messages.
    678   ASSERT_STREQ("", getFakeLogBuf().c_str());
    679   ASSERT_STREQ("", getFakeLogPrint().c_str());
    680 }
    681 
    682 TEST_F(DumpMemoryTest, first_read_empty_next_page_out_of_range_fence_post) {
    683   uint8_t buffer[256];
    684   for (size_t i = 0; i < sizeof(buffer); i++) {
    685     buffer[i] = i;
    686   }
    687   backtrace_mock_->SetReadData(buffer, sizeof(buffer));
    688   backtrace_mock_->SetPartialReadAmount(0);
    689 
    690   size_t page_size = sysconf(_SC_PAGE_SIZE);
    691   uintptr_t addr = 0x10000020 + page_size - 256;
    692 
    693   dump_memory(&log_, backtrace_mock_.get(), addr, "memory near %.2s:", "r4");
    694 
    695   std::string tombstone_contents;
    696   ASSERT_TRUE(lseek(log_.tfd, 0, SEEK_SET) == 0);
    697   ASSERT_TRUE(android::base::ReadFdToString(log_.tfd, &tombstone_contents));
    698   const char* expected_dump = \
    699 "\nmemory near r4:\n"
    700 #if defined(__LP64__)
    701 "    0000000010000f00 ---------------- ----------------  ................\n"
    702 "    0000000010000f10 ---------------- ----------------  ................\n"
    703 "    0000000010000f20 ---------------- ----------------  ................\n"
    704 "    0000000010000f30 ---------------- ----------------  ................\n"
    705 "    0000000010000f40 ---------------- ----------------  ................\n"
    706 "    0000000010000f50 ---------------- ----------------  ................\n"
    707 "    0000000010000f60 ---------------- ----------------  ................\n"
    708 "    0000000010000f70 ---------------- ----------------  ................\n"
    709 "    0000000010000f80 ---------------- ----------------  ................\n"
    710 "    0000000010000f90 ---------------- ----------------  ................\n"
    711 "    0000000010000fa0 ---------------- ----------------  ................\n"
    712 "    0000000010000fb0 ---------------- ----------------  ................\n"
    713 "    0000000010000fc0 ---------------- ----------------  ................\n"
    714 "    0000000010000fd0 ---------------- ----------------  ................\n"
    715 "    0000000010000fe0 ---------------- ----------------  ................\n"
    716 "    0000000010000ff0 ---------------- ----------------  ................\n";
    717 #else
    718 "    10000f00 -------- -------- -------- --------  ................\n"
    719 "    10000f10 -------- -------- -------- --------  ................\n"
    720 "    10000f20 -------- -------- -------- --------  ................\n"
    721 "    10000f30 -------- -------- -------- --------  ................\n"
    722 "    10000f40 -------- -------- -------- --------  ................\n"
    723 "    10000f50 -------- -------- -------- --------  ................\n"
    724 "    10000f60 -------- -------- -------- --------  ................\n"
    725 "    10000f70 -------- -------- -------- --------  ................\n"
    726 "    10000f80 -------- -------- -------- --------  ................\n"
    727 "    10000f90 -------- -------- -------- --------  ................\n"
    728 "    10000fa0 -------- -------- -------- --------  ................\n"
    729 "    10000fb0 -------- -------- -------- --------  ................\n"
    730 "    10000fc0 -------- -------- -------- --------  ................\n"
    731 "    10000fd0 -------- -------- -------- --------  ................\n"
    732 "    10000fe0 -------- -------- -------- --------  ................\n"
    733 "    10000ff0 -------- -------- -------- --------  ................\n";
    734 #endif
    735   ASSERT_STREQ(expected_dump, tombstone_contents.c_str());
    736 
    737   // Verify that the log buf is empty, and no error messages.
    738   ASSERT_STREQ("", getFakeLogBuf().c_str());
    739   ASSERT_STREQ("", getFakeLogPrint().c_str());
    740 }
    741