diff options
author | Kostya Serebryany <kcc@google.com> | 2016-09-19 05:10:32 +0000 |
---|---|---|
committer | Kostya Serebryany <kcc@google.com> | 2016-09-19 05:10:32 +0000 |
commit | 82977c3f10ca3e2cbb7ea933807a9ec24eb5d8d9 (patch) | |
tree | 05d366f56a6e015dae5d7baa87a072a9416c46e9 | |
parent | 901649023e88d18a3e5dcf421c594f41f973f33a (diff) |
[sanitizer] add __sanitizer_symbolize_data (can only print the names of the globals for now)
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@281886 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/sanitizer/common_interface_defs.h | 3 | ||||
-rw-r--r-- | lib/asan/asan_win_dll_thunk.cc | 1 | ||||
-rw-r--r-- | lib/sanitizer_common/sanitizer_stacktrace_libcdep.cc | 20 | ||||
-rw-r--r-- | lib/sanitizer_common/sanitizer_stacktrace_printer.cc | 29 | ||||
-rw-r--r-- | lib/sanitizer_common/sanitizer_stacktrace_printer.h | 7 | ||||
-rw-r--r-- | test/sanitizer_common/TestCases/symbolize_pc.cc | 11 |
6 files changed, 67 insertions, 4 deletions
diff --git a/include/sanitizer/common_interface_defs.h b/include/sanitizer/common_interface_defs.h index 0ed2bec2e..0ebe91018 100644 --- a/include/sanitizer/common_interface_defs.h +++ b/include/sanitizer/common_interface_defs.h @@ -123,6 +123,9 @@ extern "C" { // lib/sanitizer_common/sanitizer_stacktrace_printer.h. void __sanitizer_symbolize_pc(void *pc, const char *fmt, char *out_buf, size_t out_buf_size); + // Same as __sanitizer_symbolize_pc, but for data section (i.e. globals). + void __sanitizer_symbolize_data(void *data_ptr, const char *fmt, + char *out_buf, size_t out_buf_size); // Sets the callback to be called right before death on error. // Passing 0 will unset the callback. diff --git a/lib/asan/asan_win_dll_thunk.cc b/lib/asan/asan_win_dll_thunk.cc index 45f0dbbc0..396c48cf1 100644 --- a/lib/asan/asan_win_dll_thunk.cc +++ b/lib/asan/asan_win_dll_thunk.cc @@ -335,6 +335,7 @@ INTERFACE_FUNCTION(__sanitizer_get_unmapped_bytes) INTERFACE_FUNCTION(__sanitizer_maybe_open_cov_file) INTERFACE_FUNCTION(__sanitizer_print_stack_trace) INTERFACE_FUNCTION(__sanitizer_symbolize_pc) +INTERFACE_FUNCTION(__sanitizer_symbolize_data) INTERFACE_FUNCTION(__sanitizer_ptr_cmp) INTERFACE_FUNCTION(__sanitizer_ptr_sub) INTERFACE_FUNCTION(__sanitizer_report_error_summary) diff --git a/lib/sanitizer_common/sanitizer_stacktrace_libcdep.cc b/lib/sanitizer_common/sanitizer_stacktrace_libcdep.cc index 9e03ccb7b..cb2ed4281 100644 --- a/lib/sanitizer_common/sanitizer_stacktrace_libcdep.cc +++ b/lib/sanitizer_common/sanitizer_stacktrace_libcdep.cc @@ -83,14 +83,13 @@ void BufferedStackTrace::Unwind(u32 max_depth, uptr pc, uptr bp, void *context, } } // namespace __sanitizer +using namespace __sanitizer; extern "C" { SANITIZER_INTERFACE_ATTRIBUTE -void __sanitizer_symbolize_pc(__sanitizer::uptr pc, - const char *fmt, char *out_buf, - __sanitizer::uptr out_buf_size) { +void __sanitizer_symbolize_pc(uptr pc, const char *fmt, char *out_buf, + uptr out_buf_size) { if (!out_buf_size) return; - using namespace __sanitizer; pc = StackTrace::GetPreviousInstructionPc(pc); SymbolizedStack *frame = Symbolizer::GetOrInit()->SymbolizePC(pc); if (!frame) { @@ -105,4 +104,17 @@ void __sanitizer_symbolize_pc(__sanitizer::uptr pc, internal_strncpy(out_buf, frame_desc.data(), out_buf_size); out_buf[out_buf_size - 1] = 0; } + +SANITIZER_INTERFACE_ATTRIBUTE +void __sanitizer_symbolize_data(uptr data_addr, const char *fmt, char *out_buf, + uptr out_buf_size) { + if (!out_buf_size) return; + out_buf[0] = 0; + DataInfo DI; + if (!Symbolizer::GetOrInit()->SymbolizeData(data_addr, &DI)) return; + InternalScopedString data_desc(GetPageSizeCached()); + RenderData(&data_desc, fmt, &DI, common_flags()->strip_path_prefix); + internal_strncpy(out_buf, data_desc.data(), out_buf_size); + out_buf[out_buf_size - 1] = 0; +} } // extern "C" diff --git a/lib/sanitizer_common/sanitizer_stacktrace_printer.cc b/lib/sanitizer_common/sanitizer_stacktrace_printer.cc index 669b0ba28..6fba581bd 100644 --- a/lib/sanitizer_common/sanitizer_stacktrace_printer.cc +++ b/lib/sanitizer_common/sanitizer_stacktrace_printer.cc @@ -116,6 +116,35 @@ void RenderFrame(InternalScopedString *buffer, const char *format, int frame_no, } } +void RenderData(InternalScopedString *buffer, const char *format, + const DataInfo *DI, const char *strip_path_prefix) { + for (const char *p = format; *p != '\0'; p++) { + if (*p != '%') { + buffer->append("%c", *p); + continue; + } + p++; + switch (*p) { + case '%': + buffer->append("%%"); + break; + case 's': + buffer->append("%s", StripPathPrefix(DI->file, strip_path_prefix)); + break; + case 'l': + buffer->append("%d", DI->line); + break; + case 'g': + buffer->append("%s", DI->name); + break; + default: + Report("Unsupported specifier in stack frame format: %c (0x%zx)!\n", *p, + *p); + Die(); + } + } +} + void RenderSourceLocation(InternalScopedString *buffer, const char *file, int line, int column, bool vs_style, const char *strip_path_prefix) { diff --git a/lib/sanitizer_common/sanitizer_stacktrace_printer.h b/lib/sanitizer_common/sanitizer_stacktrace_printer.h index 7f6c5c73b..7be1d1977 100644 --- a/lib/sanitizer_common/sanitizer_stacktrace_printer.h +++ b/lib/sanitizer_common/sanitizer_stacktrace_printer.h @@ -59,6 +59,13 @@ void RenderSourceLocation(InternalScopedString *buffer, const char *file, void RenderModuleLocation(InternalScopedString *buffer, const char *module, uptr offset, const char *strip_path_prefix); +// Same as RenderFrame, but for data section (global variables). +// Accepts %s, %l from above. +// Also accepts: +// %g - name of the global variable. +void RenderData(InternalScopedString *buffer, const char *format, + const DataInfo *DI, const char *strip_path_prefix = ""); + } // namespace __sanitizer #endif // SANITIZER_STACKTRACE_PRINTER_H diff --git a/test/sanitizer_common/TestCases/symbolize_pc.cc b/test/sanitizer_common/TestCases/symbolize_pc.cc index 11679d723..d291bd375 100644 --- a/test/sanitizer_common/TestCases/symbolize_pc.cc +++ b/test/sanitizer_common/TestCases/symbolize_pc.cc @@ -5,6 +5,9 @@ // Tests __sanitizer_symbolize_pc. #include <stdio.h> #include <sanitizer/common_interface_defs.h> + +int GLOBAL_VAR_ABC; + void SymbolizeCaller() { char data[100]; __sanitizer_symbolize_pc(__builtin_return_address(0), "%p %F %L", data, @@ -23,8 +26,16 @@ void SymbolizeCaller() { printf("LONG_FORMAT %s\n", data); } +void SymbolizeData() { + char data[100]; + __sanitizer_symbolize_data(&GLOBAL_VAR_ABC, "%g %s:%l", data, sizeof(data)); + printf("GLOBAL: %s\n", data); +} + // CHECK: FIRST_FORMAT 0x{{.*}} in main symbolize_pc.cc:[[@LINE+3]] // CHECK: SECOND_FORMAT FUNC:main LINE:[[@LINE+2]] FILE:symbolize_pc.cc int main() { SymbolizeCaller(); + SymbolizeData(); } +// CHECK: GLOBAL: GLOBAL_VAR_ABC |