diff options
author | Alexey Samsonov <samsonov@google.com> | 2012-06-04 11:20:17 +0000 |
---|---|---|
committer | Alexey Samsonov <samsonov@google.com> | 2012-06-04 11:20:17 +0000 |
commit | 5f2fe37bd979f18703a6b3b5bf71d18fca19b245 (patch) | |
tree | 83df250256cf9429a3da719abda4bd3a1652d107 /lib | |
parent | 3836ff2733d40e1182e301ef7de3eff9469777ae (diff) | |
download | compiler-rt-5f2fe37bd979f18703a6b3b5bf71d18fca19b245.tar.gz |
[ASan] Use ASan option symbolize to turn on internal symbolizer (in development)
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@157924 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/asan/asan_rtl.cc | 2 | ||||
-rw-r--r-- | lib/asan/asan_stack.cc | 27 |
2 files changed, 24 insertions, 5 deletions
diff --git a/lib/asan/asan_rtl.cc b/lib/asan/asan_rtl.cc index cc713d585..b5760a572 100644 --- a/lib/asan/asan_rtl.cc +++ b/lib/asan/asan_rtl.cc @@ -38,7 +38,7 @@ bool FLAG_poison_shadow = 1; s64 FLAG_report_globals = 1; bool FLAG_handle_segv = ASAN_NEEDS_SEGV; bool FLAG_use_sigaltstack = 0; -bool FLAG_symbolize = 1; +bool FLAG_symbolize = 0; s64 FLAG_demangle = 1; s64 FLAG_debug = 0; bool FLAG_replace_cfallocator = 1; // Used on Mac only. diff --git a/lib/asan/asan_stack.cc b/lib/asan/asan_stack.cc index e00688ac0..91d7b13a4 100644 --- a/lib/asan/asan_stack.cc +++ b/lib/asan/asan_stack.cc @@ -17,6 +17,9 @@ #include "asan_stack.h" #include "asan_thread.h" #include "asan_thread_registry.h" +#include "sanitizer_common/sanitizer_symbolizer.h" + +using namespace __sanitizer; // NOLINT #ifdef ASAN_USE_EXTERNAL_SYMBOLIZER extern bool @@ -39,16 +42,32 @@ void AsanStackTrace::PrintStack(uptr *addr, uptr size) { #else // ASAN_USE_EXTERNAL_SYMBOLIZER void AsanStackTrace::PrintStack(uptr *addr, uptr size) { AsanProcMaps proc_maps; + uptr frame_num = 0; for (uptr i = 0; i < size && addr[i]; i++) { proc_maps.Reset(); uptr pc = addr[i]; uptr offset; char filename[4096]; - if (proc_maps.GetObjectNameAndOffset(pc, &offset, - filename, sizeof(filename))) { - Printf(" #%zu 0x%zx (%s+0x%zx)\n", i, pc, filename, offset); + if (FLAG_symbolize) { + AddressInfoList *address_info_list = SymbolizeCode(pc); + for (AddressInfoList *entry = address_info_list; entry; + entry = entry->next) { + AddressInfo info = entry->info; + Printf(" #%zu 0x%zx %s:%d:%d\n", frame_num, pc, + (info.file) ? info.file : "", + info.line, info.column); + frame_num++; + } + address_info_list->Clear(); } else { - Printf(" #%zu 0x%zx\n", i, pc); + if (proc_maps.GetObjectNameAndOffset(pc, &offset, + filename, sizeof(filename))) { + Printf(" #%zu 0x%zx (%s+0x%zx)\n", frame_num, pc, filename, + offset); + } else { + Printf(" #%zu 0x%zx\n", frame_num, pc); + } + frame_num++; } } } |