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