Include memory tags in memory dump output.
Tags appear in the addresses printed in the memory dump, which seems like a reasonable place to put them because tagged addresses will also appear in other places in the tombstone, such as registers and the fault address. Bug: 135772972 Change-Id: I52da338347ff6b7503cf5ac80763c540695dc061
This commit is contained in:
parent
b1fcedb928
commit
fe8997aff8
|
@ -18,6 +18,7 @@
|
|||
#include <fcntl.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/capability.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/prctl.h>
|
||||
#include <sys/ptrace.h>
|
||||
#include <sys/resource.h>
|
||||
|
@ -556,6 +557,55 @@ TEST_F(CrasherTest, mte_multiple_causes) {
|
|||
#endif
|
||||
}
|
||||
|
||||
#if defined(__aarch64__) && defined(ANDROID_EXPERIMENTAL_MTE)
|
||||
static uintptr_t CreateTagMapping() {
|
||||
uintptr_t mapping =
|
||||
reinterpret_cast<uintptr_t>(mmap(nullptr, getpagesize(), PROT_READ | PROT_WRITE | PROT_MTE,
|
||||
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0));
|
||||
if (reinterpret_cast<void*>(mapping) == MAP_FAILED) {
|
||||
return 0;
|
||||
}
|
||||
__asm__ __volatile__(".arch_extension mte; stg %0, [%0]"
|
||||
:
|
||||
: "r"(mapping + (1ULL << 56))
|
||||
: "memory");
|
||||
return mapping;
|
||||
}
|
||||
#endif
|
||||
|
||||
TEST_F(CrasherTest, mte_tag_dump) {
|
||||
#if defined(__aarch64__) && defined(ANDROID_EXPERIMENTAL_MTE)
|
||||
if (!mte_supported()) {
|
||||
GTEST_SKIP() << "Requires MTE";
|
||||
}
|
||||
|
||||
int intercept_result;
|
||||
unique_fd output_fd;
|
||||
StartProcess([&]() {
|
||||
SetTagCheckingLevelSync();
|
||||
Trap(reinterpret_cast<void *>(CreateTagMapping()));
|
||||
});
|
||||
|
||||
StartIntercept(&output_fd);
|
||||
FinishCrasher();
|
||||
AssertDeath(SIGTRAP);
|
||||
FinishIntercept(&intercept_result);
|
||||
|
||||
ASSERT_EQ(1, intercept_result) << "tombstoned reported failure";
|
||||
|
||||
std::string result;
|
||||
ConsumeFd(std::move(output_fd), &result);
|
||||
|
||||
ASSERT_MATCH(result, R"(memory near x0:
|
||||
.*
|
||||
.*
|
||||
01.............0 0000000000000000 0000000000000000 ................
|
||||
00.............0)");
|
||||
#else
|
||||
GTEST_SKIP() << "Requires aarch64 + ANDROID_EXPERIMENTAL_MTE";
|
||||
#endif
|
||||
}
|
||||
|
||||
TEST_F(CrasherTest, LD_PRELOAD) {
|
||||
int intercept_result;
|
||||
unique_fd output_fd;
|
||||
|
|
|
@ -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[] = \
|
||||
|
@ -513,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());
|
||||
|
||||
|
|
|
@ -129,8 +129,9 @@ 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;
|
||||
}
|
||||
|
@ -204,8 +205,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;
|
||||
|
|
Loading…
Reference in New Issue