diff options
-rw-r--r-- | compiler-rt/lib/sanitizer_common/sanitizer_symbolizer.cc | 15 | ||||
-rw-r--r-- | compiler-rt/lib/sanitizer_common/sanitizer_symbolizer.h | 1 | ||||
-rw-r--r-- | compiler-rt/lib/tsan/rtl/tsan_report.cc | 7 | ||||
-rw-r--r-- | compiler-rt/lib/tsan/rtl/tsan_report.h | 2 | ||||
-rw-r--r-- | compiler-rt/lib/tsan/rtl/tsan_rtl_report.cc | 6 | ||||
-rw-r--r-- | compiler-rt/lib/tsan/rtl/tsan_symbolize.cc | 8 |
6 files changed, 33 insertions, 6 deletions
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer.cc b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer.cc index 30bcd961164..d52cd07499a 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer.cc +++ b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer.cc @@ -256,6 +256,17 @@ class Symbolizer { // Otherwise, the data was filled by external symbolizer. return actual_frames; } + + bool SymbolizeData(uptr addr, AddressInfo *frame) { + LoadedModule *module = FindModuleForAddress(addr); + if (module == 0) + return false; + const char *module_name = module->full_name(); + uptr module_offset = addr - module->base_address(); + frame->FillAddressAndModuleInfo(addr, module_name, module_offset); + return true; + } + bool InitializeExternalSymbolizer(const char *path_to_symbolizer) { int input_fd, output_fd; if (!StartSymbolizerSubprocess(path_to_symbolizer, &input_fd, &output_fd)) @@ -307,6 +318,10 @@ uptr SymbolizeCode(uptr address, AddressInfo *frames, uptr max_frames) { return symbolizer.SymbolizeCode(address, frames, max_frames); } +bool SymbolizeData(uptr address, AddressInfo *frame) { + return symbolizer.SymbolizeData(address, frame); +} + bool InitializeExternalSymbolizer(const char *path_to_symbolizer) { return symbolizer.InitializeExternalSymbolizer(path_to_symbolizer); } diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer.h b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer.h index 1042c8e9b4f..196e1080f07 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer.h +++ b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer.h @@ -58,6 +58,7 @@ struct AddressInfo { // of descriptions actually filled. // This function should NOT be called from two threads simultaneously. uptr SymbolizeCode(uptr address, AddressInfo *frames, uptr max_frames); +bool SymbolizeData(uptr address, AddressInfo *frame); // Starts external symbolizer program in a subprocess. Sanitizer communicates // with external symbolizer via pipes. diff --git a/compiler-rt/lib/tsan/rtl/tsan_report.cc b/compiler-rt/lib/tsan/rtl/tsan_report.cc index 970501a3ad3..67ae5a95a44 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_report.cc +++ b/compiler-rt/lib/tsan/rtl/tsan_report.cc @@ -80,8 +80,9 @@ static void PrintMop(const ReportMop *mop, bool first) { static void PrintLocation(const ReportLocation *loc) { if (loc->type == ReportLocationGlobal) { - Printf(" Location is global '%s' of size %zu at %zx %s:%d\n", - loc->name, loc->size, loc->addr, loc->file, loc->line); + Printf(" Location is global '%s' of size %zu at %zx %s:%d (%s+%p)\n\n", + loc->name, loc->size, loc->addr, loc->file, loc->line, + loc->module, loc->offset); } else if (loc->type == ReportLocationHeap) { Printf(" Location is heap block of size %zu at %p allocated", loc->size, loc->addr); @@ -91,7 +92,7 @@ static void PrintLocation(const ReportLocation *loc) { Printf(" by thread %d:\n", loc->tid); PrintStack(loc->stack); } else if (loc->type == ReportLocationStack) { - Printf(" Location is stack of thread %d:\n", loc->tid); + Printf(" Location is stack of thread %d:\n\n", loc->tid); } } diff --git a/compiler-rt/lib/tsan/rtl/tsan_report.h b/compiler-rt/lib/tsan/rtl/tsan_report.h index 34dc88f9c19..73f1c443205 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_report.h +++ b/compiler-rt/lib/tsan/rtl/tsan_report.h @@ -58,6 +58,8 @@ struct ReportLocation { ReportLocationType type; uptr addr; uptr size; + char *module; + uptr offset; int tid; char *name; char *file; diff --git a/compiler-rt/lib/tsan/rtl/tsan_rtl_report.cc b/compiler-rt/lib/tsan/rtl/tsan_rtl_report.cc index 7ba9e5848e3..3ca056227d8 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_rtl_report.cc +++ b/compiler-rt/lib/tsan/rtl/tsan_rtl_report.cc @@ -220,9 +220,11 @@ void ScopedReport::AddLocation(uptr addr, uptr size) { loc->type = ReportLocationGlobal; loc->addr = addr; loc->size = size; + loc->module = symb->module ? internal_strdup(symb->module) : 0; + loc->offset = symb->offset; loc->tid = 0; - loc->name = symb->func; - loc->file = symb->file; + loc->name = symb->func ? internal_strdup(symb->func) : 0; + loc->file = symb->file ? internal_strdup(symb->file) : 0; loc->line = symb->line; loc->stack = 0; internal_free(symb); diff --git a/compiler-rt/lib/tsan/rtl/tsan_symbolize.cc b/compiler-rt/lib/tsan/rtl/tsan_symbolize.cc index 7867179eb56..48bee6774b4 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_symbolize.cc +++ b/compiler-rt/lib/tsan/rtl/tsan_symbolize.cc @@ -52,7 +52,7 @@ static ReportStack *NewReportStackEntry(const AddressInfo &info) { } ReportStack *SymbolizeCode(uptr addr) { - if (0 != internal_strcmp(flags()->external_symbolizer_path, "")) { + if (flags()->external_symbolizer_path[0]) { static const uptr kMaxAddrFrames = 16; InternalScopedBuffer<AddressInfo> addr_frames(kMaxAddrFrames); for (uptr i = 0; i < kMaxAddrFrames; i++) @@ -79,6 +79,12 @@ ReportStack *SymbolizeCode(uptr addr) { } ReportStack *SymbolizeData(uptr addr) { + if (flags()->external_symbolizer_path[0]) { + AddressInfo frame; + if (!__sanitizer::SymbolizeData(addr, &frame)) + return 0; + return NewReportStackEntry(frame); + } return SymbolizeDataAddr2Line(addr); } |