diff options
Diffstat (limited to 'debuggerd/libdebuggerd')
| -rw-r--r-- | debuggerd/libdebuggerd/backtrace.cpp | 14 | ||||
| -rw-r--r-- | debuggerd/libdebuggerd/include/libdebuggerd/utility.h | 2 | ||||
| -rw-r--r-- | debuggerd/libdebuggerd/test/dump_memory_test.cpp | 387 | ||||
| -rw-r--r-- | debuggerd/libdebuggerd/test/tombstone_test.cpp | 7 | ||||
| -rw-r--r-- | debuggerd/libdebuggerd/tombstone.cpp | 44 | ||||
| -rw-r--r-- | debuggerd/libdebuggerd/utility.cpp | 55 |
6 files changed, 172 insertions, 337 deletions
diff --git a/debuggerd/libdebuggerd/backtrace.cpp b/debuggerd/libdebuggerd/backtrace.cpp index c606970995..f5a873c4d3 100644 --- a/debuggerd/libdebuggerd/backtrace.cpp +++ b/debuggerd/libdebuggerd/backtrace.cpp @@ -27,7 +27,6 @@ #include <string.h> #include <sys/ptrace.h> #include <sys/types.h> -#include <time.h> #include <unistd.h> #include <map> @@ -40,14 +39,10 @@ #include "libdebuggerd/types.h" #include "libdebuggerd/utility.h" +#include "util.h" static void dump_process_header(log_t* log, pid_t pid, const char* process_name) { - time_t t = time(NULL); - struct tm tm; - localtime_r(&t, &tm); - char timestr[64]; - strftime(timestr, sizeof(timestr), "%F %T", &tm); - _LOG(log, logtype::BACKTRACE, "\n\n----- pid %d at %s -----\n", pid, timestr); + _LOG(log, logtype::BACKTRACE, "\n\n----- pid %d at %s -----\n", pid, get_timestamp().c_str()); if (process_name) { _LOG(log, logtype::BACKTRACE, "Cmd line: %s\n", process_name); @@ -106,9 +101,8 @@ void dump_backtrace_header(int output_fd) { log.tfd = output_fd; log.amfd_data = nullptr; - char process_name[128]; - read_with_default("/proc/self/cmdline", process_name, sizeof(process_name), "<unknown>"); - dump_process_header(&log, getpid(), process_name); + pid_t pid = getpid(); + dump_process_header(&log, pid, get_process_name(pid).c_str()); } void dump_backtrace_footer(int output_fd) { diff --git a/debuggerd/libdebuggerd/include/libdebuggerd/utility.h b/debuggerd/libdebuggerd/include/libdebuggerd/utility.h index 7bfcf5d6e8..76155b183d 100644 --- a/debuggerd/libdebuggerd/include/libdebuggerd/utility.h +++ b/debuggerd/libdebuggerd/include/libdebuggerd/utility.h @@ -83,8 +83,6 @@ void log_backtrace(log_t* log, unwindstack::Unwinder* unwinder, const char* pref void dump_memory(log_t* log, unwindstack::Memory* backtrace, uint64_t addr, const std::string&); -void read_with_default(const char* path, char* buf, size_t len, const char* default_value); - void drop_capabilities(); bool signal_has_sender(const siginfo_t*, pid_t caller_pid); diff --git a/debuggerd/libdebuggerd/test/dump_memory_test.cpp b/debuggerd/libdebuggerd/test/dump_memory_test.cpp index be395824b8..f16f578a46 100644 --- a/debuggerd/libdebuggerd/test/dump_memory_test.cpp +++ b/debuggerd/libdebuggerd/test/dump_memory_test.cpp @@ -30,39 +30,39 @@ const char g_expected_full_dump[] = "\nmemory near r1:\n" #if defined(__LP64__) -" 0000000012345658 0706050403020100 0f0e0d0c0b0a0908 ................\n" -" 0000000012345668 1716151413121110 1f1e1d1c1b1a1918 ................\n" -" 0000000012345678 2726252423222120 2f2e2d2c2b2a2928 !\"#$%&'()*+,-./\n" -" 0000000012345688 3736353433323130 3f3e3d3c3b3a3938 0123456789:;<=>?\n" -" 0000000012345698 4746454443424140 4f4e4d4c4b4a4948 @ABCDEFGHIJKLMNO\n" -" 00000000123456a8 5756555453525150 5f5e5d5c5b5a5958 PQRSTUVWXYZ[\\]^_\n" -" 00000000123456b8 6766656463626160 6f6e6d6c6b6a6968 `abcdefghijklmno\n" -" 00000000123456c8 7776757473727170 7f7e7d7c7b7a7978 pqrstuvwxyz{|}~.\n" -" 00000000123456d8 8786858483828180 8f8e8d8c8b8a8988 ................\n" -" 00000000123456e8 9796959493929190 9f9e9d9c9b9a9998 ................\n" -" 00000000123456f8 a7a6a5a4a3a2a1a0 afaeadacabaaa9a8 ................\n" -" 0000000012345708 b7b6b5b4b3b2b1b0 bfbebdbcbbbab9b8 ................\n" -" 0000000012345718 c7c6c5c4c3c2c1c0 cfcecdcccbcac9c8 ................\n" -" 0000000012345728 d7d6d5d4d3d2d1d0 dfdedddcdbdad9d8 ................\n" -" 0000000012345738 e7e6e5e4e3e2e1e0 efeeedecebeae9e8 ................\n" -" 0000000012345748 f7f6f5f4f3f2f1f0 fffefdfcfbfaf9f8 ................\n"; +" 0000000012345650 0706050403020100 0f0e0d0c0b0a0908 ................\n" +" 0000000012345660 1716151413121110 1f1e1d1c1b1a1918 ................\n" +" 0000000012345670 2726252423222120 2f2e2d2c2b2a2928 !\"#$%&'()*+,-./\n" +" 0000000012345680 3736353433323130 3f3e3d3c3b3a3938 0123456789:;<=>?\n" +" 0000000012345690 4746454443424140 4f4e4d4c4b4a4948 @ABCDEFGHIJKLMNO\n" +" 00000000123456a0 5756555453525150 5f5e5d5c5b5a5958 PQRSTUVWXYZ[\\]^_\n" +" 00000000123456b0 6766656463626160 6f6e6d6c6b6a6968 `abcdefghijklmno\n" +" 00000000123456c0 7776757473727170 7f7e7d7c7b7a7978 pqrstuvwxyz{|}~.\n" +" 00000000123456d0 8786858483828180 8f8e8d8c8b8a8988 ................\n" +" 00000000123456e0 9796959493929190 9f9e9d9c9b9a9998 ................\n" +" 00000000123456f0 a7a6a5a4a3a2a1a0 afaeadacabaaa9a8 ................\n" +" 0000000012345700 b7b6b5b4b3b2b1b0 bfbebdbcbbbab9b8 ................\n" +" 0000000012345710 c7c6c5c4c3c2c1c0 cfcecdcccbcac9c8 ................\n" +" 0000000012345720 d7d6d5d4d3d2d1d0 dfdedddcdbdad9d8 ................\n" +" 0000000012345730 e7e6e5e4e3e2e1e0 efeeedecebeae9e8 ................\n" +" 0000000012345740 f7f6f5f4f3f2f1f0 fffefdfcfbfaf9f8 ................\n"; #else -" 12345658 03020100 07060504 0b0a0908 0f0e0d0c ................\n" -" 12345668 13121110 17161514 1b1a1918 1f1e1d1c ................\n" -" 12345678 23222120 27262524 2b2a2928 2f2e2d2c !\"#$%&'()*+,-./\n" -" 12345688 33323130 37363534 3b3a3938 3f3e3d3c 0123456789:;<=>?\n" -" 12345698 43424140 47464544 4b4a4948 4f4e4d4c @ABCDEFGHIJKLMNO\n" -" 123456a8 53525150 57565554 5b5a5958 5f5e5d5c PQRSTUVWXYZ[\\]^_\n" -" 123456b8 63626160 67666564 6b6a6968 6f6e6d6c `abcdefghijklmno\n" -" 123456c8 73727170 77767574 7b7a7978 7f7e7d7c pqrstuvwxyz{|}~.\n" -" 123456d8 83828180 87868584 8b8a8988 8f8e8d8c ................\n" -" 123456e8 93929190 97969594 9b9a9998 9f9e9d9c ................\n" -" 123456f8 a3a2a1a0 a7a6a5a4 abaaa9a8 afaeadac ................\n" -" 12345708 b3b2b1b0 b7b6b5b4 bbbab9b8 bfbebdbc ................\n" -" 12345718 c3c2c1c0 c7c6c5c4 cbcac9c8 cfcecdcc ................\n" -" 12345728 d3d2d1d0 d7d6d5d4 dbdad9d8 dfdedddc ................\n" -" 12345738 e3e2e1e0 e7e6e5e4 ebeae9e8 efeeedec ................\n" -" 12345748 f3f2f1f0 f7f6f5f4 fbfaf9f8 fffefdfc ................\n"; +" 12345650 03020100 07060504 0b0a0908 0f0e0d0c ................\n" +" 12345660 13121110 17161514 1b1a1918 1f1e1d1c ................\n" +" 12345670 23222120 27262524 2b2a2928 2f2e2d2c !\"#$%&'()*+,-./\n" +" 12345680 33323130 37363534 3b3a3938 3f3e3d3c 0123456789:;<=>?\n" +" 12345690 43424140 47464544 4b4a4948 4f4e4d4c @ABCDEFGHIJKLMNO\n" +" 123456a0 53525150 57565554 5b5a5958 5f5e5d5c PQRSTUVWXYZ[\\]^_\n" +" 123456b0 63626160 67666564 6b6a6968 6f6e6d6c `abcdefghijklmno\n" +" 123456c0 73727170 77767574 7b7a7978 7f7e7d7c pqrstuvwxyz{|}~.\n" +" 123456d0 83828180 87868584 8b8a8988 8f8e8d8c ................\n" +" 123456e0 93929190 97969594 9b9a9998 9f9e9d9c ................\n" +" 123456f0 a3a2a1a0 a7a6a5a4 abaaa9a8 afaeadac ................\n" +" 12345700 b3b2b1b0 b7b6b5b4 bbbab9b8 bfbebdbc ................\n" +" 12345710 c3c2c1c0 c7c6c5c4 cbcac9c8 cfcecdcc ................\n" +" 12345720 d3d2d1d0 d7d6d5d4 dbdad9d8 dfdedddc ................\n" +" 12345730 e3e2e1e0 e7e6e5e4 ebeae9e8 efeeedec ................\n" +" 12345740 f3f2f1f0 f7f6f5f4 fbfaf9f8 fffefdfc ................\n"; #endif const char g_expected_partial_dump[] = \ @@ -112,7 +112,10 @@ class MemoryMock : public unwindstack::Memory { if (last_read_addr_ > 0) { offset = addr - last_read_addr_; } - size_t bytes_available = buffer_.size() - offset; + size_t bytes_available = 0; + if (offset < buffer_.size()) { + bytes_available = buffer_.size() - offset; + } if (partial_read_) { bytes = std::min(bytes, bytes_partial_read_); @@ -258,44 +261,7 @@ TEST_F(DumpMemoryTest, memory_unreadable) { std::string tombstone_contents; ASSERT_TRUE(lseek(log_.tfd, 0, SEEK_SET) == 0); ASSERT_TRUE(android::base::ReadFdToString(log_.tfd, &tombstone_contents)); - const char* expected_dump = \ -"\nmemory near pc:\n" -#if defined(__LP64__) -" 00000000a2345658 ---------------- ---------------- ................\n" -" 00000000a2345668 ---------------- ---------------- ................\n" -" 00000000a2345678 ---------------- ---------------- ................\n" -" 00000000a2345688 ---------------- ---------------- ................\n" -" 00000000a2345698 ---------------- ---------------- ................\n" -" 00000000a23456a8 ---------------- ---------------- ................\n" -" 00000000a23456b8 ---------------- ---------------- ................\n" -" 00000000a23456c8 ---------------- ---------------- ................\n" -" 00000000a23456d8 ---------------- ---------------- ................\n" -" 00000000a23456e8 ---------------- ---------------- ................\n" -" 00000000a23456f8 ---------------- ---------------- ................\n" -" 00000000a2345708 ---------------- ---------------- ................\n" -" 00000000a2345718 ---------------- ---------------- ................\n" -" 00000000a2345728 ---------------- ---------------- ................\n" -" 00000000a2345738 ---------------- ---------------- ................\n" -" 00000000a2345748 ---------------- ---------------- ................\n"; -#else -" a2345658 -------- -------- -------- -------- ................\n" -" a2345668 -------- -------- -------- -------- ................\n" -" a2345678 -------- -------- -------- -------- ................\n" -" a2345688 -------- -------- -------- -------- ................\n" -" a2345698 -------- -------- -------- -------- ................\n" -" a23456a8 -------- -------- -------- -------- ................\n" -" a23456b8 -------- -------- -------- -------- ................\n" -" a23456c8 -------- -------- -------- -------- ................\n" -" a23456d8 -------- -------- -------- -------- ................\n" -" a23456e8 -------- -------- -------- -------- ................\n" -" a23456f8 -------- -------- -------- -------- ................\n" -" a2345708 -------- -------- -------- -------- ................\n" -" a2345718 -------- -------- -------- -------- ................\n" -" a2345728 -------- -------- -------- -------- ................\n" -" a2345738 -------- -------- -------- -------- ................\n" -" a2345748 -------- -------- -------- -------- ................\n"; -#endif - ASSERT_STREQ(expected_dump, tombstone_contents.c_str()); + ASSERT_STREQ("", tombstone_contents.c_str()); // Verify that the log buf is empty, and no error messages. ASSERT_STREQ("", getFakeLogBuf().c_str()); @@ -429,57 +395,17 @@ TEST_F(DumpMemoryTest, address_low_fence) { ASSERT_STREQ("", getFakeLogPrint().c_str()); } -TEST_F(DumpMemoryTest, memory_address_too_low) { - uint8_t buffer[256]; - memset(buffer, 0, sizeof(buffer)); - memory_mock_->SetReadData(buffer, sizeof(buffer)); - - dump_memory(&log_, memory_mock_.get(), 0, "memory near r1"); - - std::string tombstone_contents; - ASSERT_TRUE(lseek(log_.tfd, 0, SEEK_SET) == 0); - ASSERT_TRUE(android::base::ReadFdToString(log_.tfd, &tombstone_contents)); - ASSERT_STREQ("", tombstone_contents.c_str()); - - // Verify that the log buf is empty, and no error messages. - ASSERT_STREQ("", getFakeLogBuf().c_str()); - ASSERT_STREQ("", getFakeLogPrint().c_str()); -} - TEST_F(DumpMemoryTest, memory_address_too_high) { uint8_t buffer[256]; memset(buffer, 0, sizeof(buffer)); memory_mock_->SetReadData(buffer, sizeof(buffer)); #if defined(__LP64__) - dump_memory(&log_, memory_mock_.get(), 0x4000000000000000UL, "memory near r1"); - dump_memory(&log_, memory_mock_.get(), 0x4000000000000000UL - 32, "memory near r1"); - dump_memory(&log_, memory_mock_.get(), 0x4000000000000000UL - 216, "memory near r1"); -#else - dump_memory(&log_, memory_mock_.get(), 0xffff0000, "memory near r1"); - dump_memory(&log_, memory_mock_.get(), 0xffff0000 - 32, "memory near r1"); - dump_memory(&log_, memory_mock_.get(), 0xffff0000 - 220, "memory near r1"); -#endif - - std::string tombstone_contents; - ASSERT_TRUE(lseek(log_.tfd, 0, SEEK_SET) == 0); - ASSERT_TRUE(android::base::ReadFdToString(log_.tfd, &tombstone_contents)); - ASSERT_STREQ("", tombstone_contents.c_str()); - - // Verify that the log buf is empty, and no error messages. - ASSERT_STREQ("", getFakeLogBuf().c_str()); - ASSERT_STREQ("", getFakeLogPrint().c_str()); -} - -TEST_F(DumpMemoryTest, memory_address_would_overflow) { - uint8_t buffer[256]; - memset(buffer, 0, sizeof(buffer)); - memory_mock_->SetReadData(buffer, sizeof(buffer)); - -#if defined(__LP64__) - dump_memory(&log_, memory_mock_.get(), 0xfffffffffffffff0, "memory near r1"); + dump_memory(&log_, memory_mock_.get(), -32, "memory near r1"); + dump_memory(&log_, memory_mock_.get(), -208, "memory near r1"); #else - dump_memory(&log_, memory_mock_.get(), 0xfffffff0, "memory near r1"); + dump_memory(&log_, memory_mock_.get(), 0x100000000 - 32, "memory near r1"); + dump_memory(&log_, memory_mock_.get(), 0x100000000 - 208, "memory near r1"); #endif std::string tombstone_contents; @@ -500,9 +426,9 @@ TEST_F(DumpMemoryTest, memory_address_nearly_too_high) { memory_mock_->SetReadData(buffer, sizeof(buffer)); #if defined(__LP64__) - dump_memory(&log_, memory_mock_.get(), 0x4000000000000000UL - 224, "memory near r4"); + dump_memory(&log_, memory_mock_.get(), -224, "memory near r4"); #else - dump_memory(&log_, memory_mock_.get(), 0xffff0000 - 224, "memory near r4"); + dump_memory(&log_, memory_mock_.get(), 0x100000000 - 224, "memory near r4"); #endif std::string tombstone_contents; @@ -510,40 +436,57 @@ TEST_F(DumpMemoryTest, memory_address_nearly_too_high) { ASSERT_TRUE(android::base::ReadFdToString(log_.tfd, &tombstone_contents)); const char* expected_dump = \ "\nmemory near r4:\n" -#if defined(__LP64__) -" 3fffffffffffff00 0706050403020100 0f0e0d0c0b0a0908 ................\n" -" 3fffffffffffff10 1716151413121110 1f1e1d1c1b1a1918 ................\n" -" 3fffffffffffff20 2726252423222120 2f2e2d2c2b2a2928 !\"#$%&'()*+,-./\n" -" 3fffffffffffff30 3736353433323130 3f3e3d3c3b3a3938 0123456789:;<=>?\n" -" 3fffffffffffff40 4746454443424140 4f4e4d4c4b4a4948 @ABCDEFGHIJKLMNO\n" -" 3fffffffffffff50 5756555453525150 5f5e5d5c5b5a5958 PQRSTUVWXYZ[\\]^_\n" -" 3fffffffffffff60 6766656463626160 6f6e6d6c6b6a6968 `abcdefghijklmno\n" -" 3fffffffffffff70 7776757473727170 7f7e7d7c7b7a7978 pqrstuvwxyz{|}~.\n" -" 3fffffffffffff80 8786858483828180 8f8e8d8c8b8a8988 ................\n" -" 3fffffffffffff90 9796959493929190 9f9e9d9c9b9a9998 ................\n" -" 3fffffffffffffa0 a7a6a5a4a3a2a1a0 afaeadacabaaa9a8 ................\n" -" 3fffffffffffffb0 b7b6b5b4b3b2b1b0 bfbebdbcbbbab9b8 ................\n" -" 3fffffffffffffc0 c7c6c5c4c3c2c1c0 cfcecdcccbcac9c8 ................\n" -" 3fffffffffffffd0 d7d6d5d4d3d2d1d0 dfdedddcdbdad9d8 ................\n" -" 3fffffffffffffe0 e7e6e5e4e3e2e1e0 efeeedecebeae9e8 ................\n" -" 3ffffffffffffff0 f7f6f5f4f3f2f1f0 fffefdfcfbfaf9f8 ................\n"; +#if defined(__aarch64__) +" 00ffffffffffff00 0706050403020100 0f0e0d0c0b0a0908 ................\n" +" 00ffffffffffff10 1716151413121110 1f1e1d1c1b1a1918 ................\n" +" 00ffffffffffff20 2726252423222120 2f2e2d2c2b2a2928 !\"#$%&'()*+,-./\n" +" 00ffffffffffff30 3736353433323130 3f3e3d3c3b3a3938 0123456789:;<=>?\n" +" 00ffffffffffff40 4746454443424140 4f4e4d4c4b4a4948 @ABCDEFGHIJKLMNO\n" +" 00ffffffffffff50 5756555453525150 5f5e5d5c5b5a5958 PQRSTUVWXYZ[\\]^_\n" +" 00ffffffffffff60 6766656463626160 6f6e6d6c6b6a6968 `abcdefghijklmno\n" +" 00ffffffffffff70 7776757473727170 7f7e7d7c7b7a7978 pqrstuvwxyz{|}~.\n" +" 00ffffffffffff80 8786858483828180 8f8e8d8c8b8a8988 ................\n" +" 00ffffffffffff90 9796959493929190 9f9e9d9c9b9a9998 ................\n" +" 00ffffffffffffa0 a7a6a5a4a3a2a1a0 afaeadacabaaa9a8 ................\n" +" 00ffffffffffffb0 b7b6b5b4b3b2b1b0 bfbebdbcbbbab9b8 ................\n" +" 00ffffffffffffc0 c7c6c5c4c3c2c1c0 cfcecdcccbcac9c8 ................\n" +" 00ffffffffffffd0 d7d6d5d4d3d2d1d0 dfdedddcdbdad9d8 ................\n" +" 00ffffffffffffe0 e7e6e5e4e3e2e1e0 efeeedecebeae9e8 ................\n" +" 00fffffffffffff0 f7f6f5f4f3f2f1f0 fffefdfcfbfaf9f8 ................\n"; +#elif defined(__LP64__) +" ffffffffffffff00 0706050403020100 0f0e0d0c0b0a0908 ................\n" +" ffffffffffffff10 1716151413121110 1f1e1d1c1b1a1918 ................\n" +" ffffffffffffff20 2726252423222120 2f2e2d2c2b2a2928 !\"#$%&'()*+,-./\n" +" ffffffffffffff30 3736353433323130 3f3e3d3c3b3a3938 0123456789:;<=>?\n" +" ffffffffffffff40 4746454443424140 4f4e4d4c4b4a4948 @ABCDEFGHIJKLMNO\n" +" ffffffffffffff50 5756555453525150 5f5e5d5c5b5a5958 PQRSTUVWXYZ[\\]^_\n" +" ffffffffffffff60 6766656463626160 6f6e6d6c6b6a6968 `abcdefghijklmno\n" +" ffffffffffffff70 7776757473727170 7f7e7d7c7b7a7978 pqrstuvwxyz{|}~.\n" +" ffffffffffffff80 8786858483828180 8f8e8d8c8b8a8988 ................\n" +" ffffffffffffff90 9796959493929190 9f9e9d9c9b9a9998 ................\n" +" ffffffffffffffa0 a7a6a5a4a3a2a1a0 afaeadacabaaa9a8 ................\n" +" ffffffffffffffb0 b7b6b5b4b3b2b1b0 bfbebdbcbbbab9b8 ................\n" +" ffffffffffffffc0 c7c6c5c4c3c2c1c0 cfcecdcccbcac9c8 ................\n" +" ffffffffffffffd0 d7d6d5d4d3d2d1d0 dfdedddcdbdad9d8 ................\n" +" ffffffffffffffe0 e7e6e5e4e3e2e1e0 efeeedecebeae9e8 ................\n" +" fffffffffffffff0 f7f6f5f4f3f2f1f0 fffefdfcfbfaf9f8 ................\n"; #else -" fffeff00 03020100 07060504 0b0a0908 0f0e0d0c ................\n" -" fffeff10 13121110 17161514 1b1a1918 1f1e1d1c ................\n" -" fffeff20 23222120 27262524 2b2a2928 2f2e2d2c !\"#$%&'()*+,-./\n" -" fffeff30 33323130 37363534 3b3a3938 3f3e3d3c 0123456789:;<=>?\n" -" fffeff40 43424140 47464544 4b4a4948 4f4e4d4c @ABCDEFGHIJKLMNO\n" -" fffeff50 53525150 57565554 5b5a5958 5f5e5d5c PQRSTUVWXYZ[\\]^_\n" -" fffeff60 63626160 67666564 6b6a6968 6f6e6d6c `abcdefghijklmno\n" -" fffeff70 73727170 77767574 7b7a7978 7f7e7d7c pqrstuvwxyz{|}~.\n" -" fffeff80 83828180 87868584 8b8a8988 8f8e8d8c ................\n" -" fffeff90 93929190 97969594 9b9a9998 9f9e9d9c ................\n" -" fffeffa0 a3a2a1a0 a7a6a5a4 abaaa9a8 afaeadac ................\n" -" fffeffb0 b3b2b1b0 b7b6b5b4 bbbab9b8 bfbebdbc ................\n" -" fffeffc0 c3c2c1c0 c7c6c5c4 cbcac9c8 cfcecdcc ................\n" -" fffeffd0 d3d2d1d0 d7d6d5d4 dbdad9d8 dfdedddc ................\n" -" fffeffe0 e3e2e1e0 e7e6e5e4 ebeae9e8 efeeedec ................\n" -" fffefff0 f3f2f1f0 f7f6f5f4 fbfaf9f8 fffefdfc ................\n"; +" ffffff00 03020100 07060504 0b0a0908 0f0e0d0c ................\n" +" ffffff10 13121110 17161514 1b1a1918 1f1e1d1c ................\n" +" ffffff20 23222120 27262524 2b2a2928 2f2e2d2c !\"#$%&'()*+,-./\n" +" ffffff30 33323130 37363534 3b3a3938 3f3e3d3c 0123456789:;<=>?\n" +" ffffff40 43424140 47464544 4b4a4948 4f4e4d4c @ABCDEFGHIJKLMNO\n" +" ffffff50 53525150 57565554 5b5a5958 5f5e5d5c PQRSTUVWXYZ[\\]^_\n" +" ffffff60 63626160 67666564 6b6a6968 6f6e6d6c `abcdefghijklmno\n" +" ffffff70 73727170 77767574 7b7a7978 7f7e7d7c pqrstuvwxyz{|}~.\n" +" ffffff80 83828180 87868584 8b8a8988 8f8e8d8c ................\n" +" ffffff90 93929190 97969594 9b9a9998 9f9e9d9c ................\n" +" ffffffa0 a3a2a1a0 a7a6a5a4 abaaa9a8 afaeadac ................\n" +" ffffffb0 b3b2b1b0 b7b6b5b4 bbbab9b8 bfbebdbc ................\n" +" ffffffc0 c3c2c1c0 c7c6c5c4 cbcac9c8 cfcecdcc ................\n" +" ffffffd0 d3d2d1d0 d7d6d5d4 dbdad9d8 dfdedddc ................\n" +" ffffffe0 e3e2e1e0 e7e6e5e4 ebeae9e8 efeeedec ................\n" +" fffffff0 f3f2f1f0 f7f6f5f4 fbfaf9f8 fffefdfc ................\n"; #endif ASSERT_STREQ(expected_dump, tombstone_contents.c_str()); @@ -570,39 +513,41 @@ TEST_F(DumpMemoryTest, first_read_empty) { const char* expected_dump = \ "\nmemory near r4:\n" #if defined(__LP64__) -" 0000000010000f88 ---------------- ---------------- ................\n" -" 0000000010000f98 ---------------- ---------------- ................\n" -" 0000000010000fa8 ---------------- ---------------- ................\n" -" 0000000010000fb8 ---------------- ---------------- ................\n" -" 0000000010000fc8 ---------------- ---------------- ................\n" -" 0000000010000fd8 ---------------- ---------------- ................\n" -" 0000000010000fe8 ---------------- ---------------- ................\n" -" 0000000010000ff8 ---------------- 7f7e7d7c7b7a7978 ........xyz{|}~.\n" -" 0000000010001008 8786858483828180 8f8e8d8c8b8a8988 ................\n" -" 0000000010001018 9796959493929190 9f9e9d9c9b9a9998 ................\n" -" 0000000010001028 a7a6a5a4a3a2a1a0 afaeadacabaaa9a8 ................\n" -" 0000000010001038 b7b6b5b4b3b2b1b0 bfbebdbcbbbab9b8 ................\n" -" 0000000010001048 c7c6c5c4c3c2c1c0 cfcecdcccbcac9c8 ................\n" -" 0000000010001058 d7d6d5d4d3d2d1d0 dfdedddcdbdad9d8 ................\n" -" 0000000010001068 e7e6e5e4e3e2e1e0 efeeedecebeae9e8 ................\n" -" 0000000010001078 f7f6f5f4f3f2f1f0 fffefdfcfbfaf9f8 ................\n"; +R"( 0000000010000f80 ---------------- ---------------- ................ + 0000000010000f90 ---------------- ---------------- ................ + 0000000010000fa0 ---------------- ---------------- ................ + 0000000010000fb0 ---------------- ---------------- ................ + 0000000010000fc0 ---------------- ---------------- ................ + 0000000010000fd0 ---------------- ---------------- ................ + 0000000010000fe0 ---------------- ---------------- ................ + 0000000010000ff0 ---------------- ---------------- ................ + 0000000010001000 8786858483828180 8f8e8d8c8b8a8988 ................ + 0000000010001010 9796959493929190 9f9e9d9c9b9a9998 ................ + 0000000010001020 a7a6a5a4a3a2a1a0 afaeadacabaaa9a8 ................ + 0000000010001030 b7b6b5b4b3b2b1b0 bfbebdbcbbbab9b8 ................ + 0000000010001040 c7c6c5c4c3c2c1c0 cfcecdcccbcac9c8 ................ + 0000000010001050 d7d6d5d4d3d2d1d0 dfdedddcdbdad9d8 ................ + 0000000010001060 e7e6e5e4e3e2e1e0 efeeedecebeae9e8 ................ + 0000000010001070 f7f6f5f4f3f2f1f0 fffefdfcfbfaf9f8 ................ +)"; #else -" 10000f88 -------- -------- -------- -------- ................\n" -" 10000f98 -------- -------- -------- -------- ................\n" -" 10000fa8 -------- -------- -------- -------- ................\n" -" 10000fb8 -------- -------- -------- -------- ................\n" -" 10000fc8 -------- -------- -------- -------- ................\n" -" 10000fd8 -------- -------- -------- -------- ................\n" -" 10000fe8 -------- -------- -------- -------- ................\n" -" 10000ff8 -------- -------- 7b7a7978 7f7e7d7c ........xyz{|}~.\n" -" 10001008 83828180 87868584 8b8a8988 8f8e8d8c ................\n" -" 10001018 93929190 97969594 9b9a9998 9f9e9d9c ................\n" -" 10001028 a3a2a1a0 a7a6a5a4 abaaa9a8 afaeadac ................\n" -" 10001038 b3b2b1b0 b7b6b5b4 bbbab9b8 bfbebdbc ................\n" -" 10001048 c3c2c1c0 c7c6c5c4 cbcac9c8 cfcecdcc ................\n" -" 10001058 d3d2d1d0 d7d6d5d4 dbdad9d8 dfdedddc ................\n" -" 10001068 e3e2e1e0 e7e6e5e4 ebeae9e8 efeeedec ................\n" -" 10001078 f3f2f1f0 f7f6f5f4 fbfaf9f8 fffefdfc ................\n"; +R"( 10000f80 -------- -------- -------- -------- ................ + 10000f90 -------- -------- -------- -------- ................ + 10000fa0 -------- -------- -------- -------- ................ + 10000fb0 -------- -------- -------- -------- ................ + 10000fc0 -------- -------- -------- -------- ................ + 10000fd0 -------- -------- -------- -------- ................ + 10000fe0 -------- -------- -------- -------- ................ + 10000ff0 -------- -------- -------- -------- ................ + 10001000 83828180 87868584 8b8a8988 8f8e8d8c ................ + 10001010 93929190 97969594 9b9a9998 9f9e9d9c ................ + 10001020 a3a2a1a0 a7a6a5a4 abaaa9a8 afaeadac ................ + 10001030 b3b2b1b0 b7b6b5b4 bbbab9b8 bfbebdbc ................ + 10001040 c3c2c1c0 c7c6c5c4 cbcac9c8 cfcecdcc ................ + 10001050 d3d2d1d0 d7d6d5d4 dbdad9d8 dfdedddc ................ + 10001060 e3e2e1e0 e7e6e5e4 ebeae9e8 efeeedec ................ + 10001070 f3f2f1f0 f7f6f5f4 fbfaf9f8 fffefdfc ................ +)"; #endif ASSERT_STREQ(expected_dump, tombstone_contents.c_str()); @@ -684,44 +629,7 @@ TEST_F(DumpMemoryTest, first_read_empty_next_page_out_of_range) { std::string tombstone_contents; ASSERT_TRUE(lseek(log_.tfd, 0, SEEK_SET) == 0); ASSERT_TRUE(android::base::ReadFdToString(log_.tfd, &tombstone_contents)); - const char* expected_dump = \ -"\nmemory near r4:\n" -#if defined(__LP64__) -" 0000000010000000 ---------------- ---------------- ................\n" -" 0000000010000010 ---------------- ---------------- ................\n" -" 0000000010000020 ---------------- ---------------- ................\n" -" 0000000010000030 ---------------- ---------------- ................\n" -" 0000000010000040 ---------------- ---------------- ................\n" -" 0000000010000050 ---------------- ---------------- ................\n" -" 0000000010000060 ---------------- ---------------- ................\n" -" 0000000010000070 ---------------- ---------------- ................\n" -" 0000000010000080 ---------------- ---------------- ................\n" -" 0000000010000090 ---------------- ---------------- ................\n" -" 00000000100000a0 ---------------- ---------------- ................\n" -" 00000000100000b0 ---------------- ---------------- ................\n" -" 00000000100000c0 ---------------- ---------------- ................\n" -" 00000000100000d0 ---------------- ---------------- ................\n" -" 00000000100000e0 ---------------- ---------------- ................\n" -" 00000000100000f0 ---------------- ---------------- ................\n"; -#else -" 10000000 -------- -------- -------- -------- ................\n" -" 10000010 -------- -------- -------- -------- ................\n" -" 10000020 -------- -------- -------- -------- ................\n" -" 10000030 -------- -------- -------- -------- ................\n" -" 10000040 -------- -------- -------- -------- ................\n" -" 10000050 -------- -------- -------- -------- ................\n" -" 10000060 -------- -------- -------- -------- ................\n" -" 10000070 -------- -------- -------- -------- ................\n" -" 10000080 -------- -------- -------- -------- ................\n" -" 10000090 -------- -------- -------- -------- ................\n" -" 100000a0 -------- -------- -------- -------- ................\n" -" 100000b0 -------- -------- -------- -------- ................\n" -" 100000c0 -------- -------- -------- -------- ................\n" -" 100000d0 -------- -------- -------- -------- ................\n" -" 100000e0 -------- -------- -------- -------- ................\n" -" 100000f0 -------- -------- -------- -------- ................\n"; -#endif - ASSERT_STREQ(expected_dump, tombstone_contents.c_str()); + ASSERT_STREQ("", tombstone_contents.c_str()); // Verify that the log buf is empty, and no error messages. ASSERT_STREQ("", getFakeLogBuf().c_str()); @@ -744,44 +652,7 @@ TEST_F(DumpMemoryTest, first_read_empty_next_page_out_of_range_fence_post) { std::string tombstone_contents; ASSERT_TRUE(lseek(log_.tfd, 0, SEEK_SET) == 0); ASSERT_TRUE(android::base::ReadFdToString(log_.tfd, &tombstone_contents)); - const char* expected_dump = \ -"\nmemory near r4:\n" -#if defined(__LP64__) -" 0000000010000f00 ---------------- ---------------- ................\n" -" 0000000010000f10 ---------------- ---------------- ................\n" -" 0000000010000f20 ---------------- ---------------- ................\n" -" 0000000010000f30 ---------------- ---------------- ................\n" -" 0000000010000f40 ---------------- ---------------- ................\n" -" 0000000010000f50 ---------------- ---------------- ................\n" -" 0000000010000f60 ---------------- ---------------- ................\n" -" 0000000010000f70 ---------------- ---------------- ................\n" -" 0000000010000f80 ---------------- ---------------- ................\n" -" 0000000010000f90 ---------------- ---------------- ................\n" -" 0000000010000fa0 ---------------- ---------------- ................\n" -" 0000000010000fb0 ---------------- ---------------- ................\n" -" 0000000010000fc0 ---------------- ---------------- ................\n" -" 0000000010000fd0 ---------------- ---------------- ................\n" -" 0000000010000fe0 ---------------- ---------------- ................\n" -" 0000000010000ff0 ---------------- ---------------- ................\n"; -#else -" 10000f00 -------- -------- -------- -------- ................\n" -" 10000f10 -------- -------- -------- -------- ................\n" -" 10000f20 -------- -------- -------- -------- ................\n" -" 10000f30 -------- -------- -------- -------- ................\n" -" 10000f40 -------- -------- -------- -------- ................\n" -" 10000f50 -------- -------- -------- -------- ................\n" -" 10000f60 -------- -------- -------- -------- ................\n" -" 10000f70 -------- -------- -------- -------- ................\n" -" 10000f80 -------- -------- -------- -------- ................\n" -" 10000f90 -------- -------- -------- -------- ................\n" -" 10000fa0 -------- -------- -------- -------- ................\n" -" 10000fb0 -------- -------- -------- -------- ................\n" -" 10000fc0 -------- -------- -------- -------- ................\n" -" 10000fd0 -------- -------- -------- -------- ................\n" -" 10000fe0 -------- -------- -------- -------- ................\n" -" 10000ff0 -------- -------- -------- -------- ................\n"; -#endif - ASSERT_STREQ(expected_dump, tombstone_contents.c_str()); + ASSERT_STREQ("", tombstone_contents.c_str()); // Verify that the log buf is empty, and no error messages. ASSERT_STREQ("", getFakeLogBuf().c_str()); diff --git a/debuggerd/libdebuggerd/test/tombstone_test.cpp b/debuggerd/libdebuggerd/test/tombstone_test.cpp index aec8c60308..b42d70ce83 100644 --- a/debuggerd/libdebuggerd/test/tombstone_test.cpp +++ b/debuggerd/libdebuggerd/test/tombstone_test.cpp @@ -359,13 +359,6 @@ TEST_F(TombstoneTest, dump_thread_info_uid) { ASSERT_STREQ(expected.c_str(), amfd_data_.c_str()); } -TEST_F(TombstoneTest, dump_timestamp) { - setenv("TZ", "UTC", 1); - tzset(); - dump_timestamp(&log_, 0); - ASSERT_STREQ("Timestamp: 1970-01-01 00:00:00+0000\n", amfd_data_.c_str()); -} - class GwpAsanCrashDataTest : public GwpAsanCrashData { public: GwpAsanCrashDataTest( diff --git a/debuggerd/libdebuggerd/tombstone.cpp b/debuggerd/libdebuggerd/tombstone.cpp index ab65dd15a1..7af99c94c1 100644 --- a/debuggerd/libdebuggerd/tombstone.cpp +++ b/debuggerd/libdebuggerd/tombstone.cpp @@ -58,6 +58,7 @@ #include "libdebuggerd/open_files_list.h" #include "libdebuggerd/scudo.h" #include "libdebuggerd/utility.h" +#include "util.h" #include "gwp_asan/common.h" #include "gwp_asan/crash_handler.h" @@ -80,15 +81,6 @@ static void dump_header_info(log_t* log) { _LOG(log, logtype::HEADER, "ABI: '%s'\n", ABI_STRING); } -static void dump_timestamp(log_t* log, time_t time) { - struct tm tm; - localtime_r(&time, &tm); - - char buf[strlen("1970-01-01 00:00:00+0830") + 1]; - strftime(buf, sizeof(buf), "%F %T%z", &tm); - _LOG(log, logtype::HEADER, "Timestamp: %s\n", buf); -} - static std::string get_stack_overflow_cause(uint64_t fault_addr, uint64_t sp, unwindstack::Maps* maps) { static constexpr uint64_t kMaxDifferenceBytes = 256; @@ -182,12 +174,8 @@ static void dump_signal_info(log_t* log, const ThreadInfo& thread_info, } static void dump_thread_info(log_t* log, const ThreadInfo& thread_info) { - // Blacklist logd, logd.reader, logd.writer, logd.auditd, logd.control ... - // TODO: Why is this controlled by thread name? - if (thread_info.thread_name == "logd" || - android::base::StartsWith(thread_info.thread_name, "logd.")) { - log->should_retrieve_logcat = false; - } + // Don't try to collect logs from the threads that implement the logging system itself. + if (thread_info.uid == AID_LOGD) log->should_retrieve_logcat = false; _LOG(log, logtype::HEADER, "pid: %d, tid: %d, name: %s >>> %s <<<\n", thread_info.pid, thread_info.tid, thread_info.thread_name.c_str(), thread_info.process_name.c_str()); @@ -507,10 +495,9 @@ static void dump_log_file(log_t* log, pid_t pid, const char* filename, unsigned // (although in this case the pid is redundant). char timeBuf[32]; time_t sec = static_cast<time_t>(log_entry.entry.sec); - struct tm tmBuf; - struct tm* ptm; - ptm = localtime_r(&sec, &tmBuf); - strftime(timeBuf, sizeof(timeBuf), "%m-%d %H:%M:%S", ptm); + tm tm; + localtime_r(&sec, &tm); + strftime(timeBuf, sizeof(timeBuf), "%m-%d %H:%M:%S", &tm); char* msg = log_entry.msg(); if (msg == nullptr) { @@ -571,23 +558,20 @@ void engrave_tombstone_ucontext(int tombstone_fd, uint64_t abort_msg_address, si log.tfd = tombstone_fd; log.amfd_data = nullptr; - char thread_name[16]; - char process_name[128]; - - read_with_default("/proc/self/comm", thread_name, sizeof(thread_name), "<unknown>"); - read_with_default("/proc/self/cmdline", process_name, sizeof(process_name), "<unknown>"); + std::string thread_name = get_thread_name(tid); + std::string process_name = get_process_name(pid); std::unique_ptr<unwindstack::Regs> regs( unwindstack::Regs::CreateFromUcontext(unwindstack::Regs::CurrentArch(), ucontext)); std::map<pid_t, ThreadInfo> threads; - threads[gettid()] = ThreadInfo{ + threads[tid] = ThreadInfo{ .registers = std::move(regs), .uid = uid, .tid = tid, - .thread_name = thread_name, + .thread_name = thread_name.c_str(), .pid = pid, - .process_name = process_name, + .process_name = process_name.c_str(), .siginfo = siginfo, }; @@ -606,8 +590,8 @@ void engrave_tombstone(unique_fd output_fd, unwindstack::Unwinder* unwinder, const std::map<pid_t, ThreadInfo>& threads, pid_t target_thread, const ProcessInfo& process_info, OpenFilesList* open_files, std::string* amfd_data) { - // don't copy log messages to tombstone unless this is a dev device - bool want_logs = android::base::GetBoolProperty("ro.debuggable", false); + // Don't copy log messages to tombstone unless this is a development device. + bool want_logs = GetBoolProperty("ro.debuggable", false); log_t log; log.current_tid = target_thread; @@ -617,7 +601,7 @@ void engrave_tombstone(unique_fd output_fd, unwindstack::Unwinder* unwinder, _LOG(&log, logtype::HEADER, "*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***\n"); dump_header_info(&log); - dump_timestamp(&log, time(nullptr)); + _LOG(&log, logtype::HEADER, "Timestamp: %s\n", get_timestamp().c_str()); auto it = threads.find(target_thread); if (it == threads.end()) { diff --git a/debuggerd/libdebuggerd/utility.cpp b/debuggerd/libdebuggerd/utility.cpp index c8a3431b70..4e6df09c9a 100644 --- a/debuggerd/libdebuggerd/utility.cpp +++ b/debuggerd/libdebuggerd/utility.cpp @@ -44,7 +44,6 @@ using android::base::unique_fd; -// Whitelist output desired in the logcat output. bool is_allowed_in_logcat(enum logtype ltype) { if ((ltype == HEADER) || (ltype == REGISTERS) @@ -129,24 +128,23 @@ void _VLOG(log_t* log, enum logtype ltype, const char* fmt, va_list ap) { #define MEMORY_BYTES_PER_LINE 16 void dump_memory(log_t* log, unwindstack::Memory* memory, uint64_t addr, const std::string& label) { - // Align the address to sizeof(long) and start 32 bytes before the address. - addr &= ~(sizeof(long) - 1); + // Align the address to the number of bytes per line to avoid confusing memory tag output if + // memory is tagged and we start from a misaligned address. Start 32 bytes before the address. + addr &= ~(MEMORY_BYTES_PER_LINE - 1); if (addr >= 4128) { addr -= 32; } - // Don't bother if the address looks too low, or looks too high. - if (addr < 4096 || -#if defined(__LP64__) - addr > 0x4000000000000000UL - MEMORY_BYTES_TO_DUMP) { -#else - addr > 0xffff0000 - MEMORY_BYTES_TO_DUMP) { -#endif + // We don't want the address tag to appear in the addresses in the memory dump. + addr = untag_address(addr); + + // Don't bother if the address would overflow, taking tag bits into account. Note that + // untag_address truncates to 32 bits on 32-bit platforms as a side effect of returning a + // uintptr_t, so this also checks for 32-bit overflow. + if (untag_address(addr + MEMORY_BYTES_TO_DUMP - 1) < addr) { return; } - _LOG(log, logtype::MEMORY, "\n%s:\n", label.c_str()); - // Dump 256 bytes uintptr_t data[MEMORY_BYTES_TO_DUMP/sizeof(uintptr_t)]; memset(data, 0, MEMORY_BYTES_TO_DUMP); @@ -187,6 +185,15 @@ void dump_memory(log_t* log, unwindstack::Memory* memory, uint64_t addr, const s } } + // If we were unable to read anything, it probably means that the register doesn't contain a + // valid pointer. In that case, skip the output for this register entirely rather than emitting 16 + // lines of dashes. + if (bytes == 0) { + return; + } + + _LOG(log, logtype::MEMORY, "\n%s:\n", label.c_str()); + // Dump the code around memory as: // addr contents ascii // 0000000000008d34 ef000000e8bd0090 e1b00000512fff1e ............../Q @@ -197,8 +204,13 @@ void dump_memory(log_t* log, unwindstack::Memory* memory, uint64_t addr, const s size_t current = 0; size_t total_bytes = start + bytes; for (size_t line = 0; line < MEMORY_BYTES_TO_DUMP / MEMORY_BYTES_PER_LINE; line++) { + uint64_t tagged_addr = addr; + long tag = memory->ReadTag(addr); + if (tag >= 0) { + tagged_addr |= static_cast<uint64_t>(tag) << 56; + } std::string logline; - android::base::StringAppendF(&logline, " %" PRIPTR, addr); + android::base::StringAppendF(&logline, " %" PRIPTR, tagged_addr); addr += MEMORY_BYTES_PER_LINE; std::string ascii; @@ -226,23 +238,6 @@ void dump_memory(log_t* log, unwindstack::Memory* memory, uint64_t addr, const s } } -void read_with_default(const char* path, char* buf, size_t len, const char* default_value) { - unique_fd fd(open(path, O_RDONLY | O_CLOEXEC)); - if (fd != -1) { - int rc = TEMP_FAILURE_RETRY(read(fd.get(), buf, len - 1)); - if (rc != -1) { - buf[rc] = '\0'; - - // Trim trailing newlines. - if (rc > 0 && buf[rc - 1] == '\n') { - buf[rc - 1] = '\0'; - } - return; - } - } - strcpy(buf, default_value); -} - void drop_capabilities() { __user_cap_header_struct capheader; memset(&capheader, 0, sizeof(capheader)); |
