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 30const 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 68const 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 106class 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 155class 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 197TEST_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 216TEST_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 236TEST_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 255TEST_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 305TEST_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 324TEST_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 349TEST_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 378TEST_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 432TEST_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 449TEST_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 474TEST_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 495TEST_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 555TEST_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 614TEST_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 673TEST_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 731TEST_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