summaryrefslogtreecommitdiffstats
path: root/compiler-rt/lib/asan/asan_stack.cc
diff options
context:
space:
mode:
Diffstat (limited to 'compiler-rt/lib/asan/asan_stack.cc')
-rw-r--r--compiler-rt/lib/asan/asan_stack.cc39
1 files changed, 23 insertions, 16 deletions
diff --git a/compiler-rt/lib/asan/asan_stack.cc b/compiler-rt/lib/asan/asan_stack.cc
index 618fc32d5aa..d8611333ade 100644
--- a/compiler-rt/lib/asan/asan_stack.cc
+++ b/compiler-rt/lib/asan/asan_stack.cc
@@ -20,10 +20,10 @@ namespace __asan {
static __asan_symbolize_callback symbolize_callback;
-static const char *StripPathPrefix(const char *filepath) {
- const char *path_prefix = flags()->strip_path_prefix;
- if (filepath == internal_strstr(filepath, path_prefix))
- return filepath + internal_strlen(path_prefix);
+static const char *StripPathPrefix(const char *filepath,
+ const char *strip_file_prefix) {
+ if (filepath == internal_strstr(filepath, strip_file_prefix))
+ return filepath + internal_strlen(strip_file_prefix);
return filepath;
}
@@ -39,7 +39,9 @@ static uptr patch_pc(uptr pc) {
return pc - 1;
}
-void StackTrace::PrintStack(uptr *addr, uptr size) {
+void StackTrace::PrintStack(uptr *addr, uptr size,
+ bool symbolize, const char *strip_file_prefix,
+ SymbolizeCallback symbolize_callback ) {
MemoryMappingLayout proc_maps;
uptr frame_num = 0;
for (uptr i = 0; i < size && addr[i]; i++) {
@@ -50,15 +52,14 @@ void StackTrace::PrintStack(uptr *addr, uptr size) {
// We can't know anything about the string returned by external
// symbolizer, but if it starts with filename, try to strip path prefix
// from it.
- Printf(" #%zu 0x%zx %s\n", frame_num, pc, StripPathPrefix(buff));
+ Printf(" #%zu 0x%zx %s\n", frame_num, pc,
+ StripPathPrefix(buff, strip_file_prefix));
frame_num++;
continue;
}
AddressInfo addr_frames[64];
- uptr addr_frames_num = 0;
- if (flags()->symbolize) {
- addr_frames_num = SymbolizeCode(pc, addr_frames, ARRAY_SIZE(addr_frames));
- }
+ uptr addr_frames_num =
+ symbolize ? SymbolizeCode(pc, addr_frames, ARRAY_SIZE(addr_frames)) : 0;
if (addr_frames_num > 0) {
for (uptr j = 0; j < addr_frames_num; j++) {
AddressInfo &info = addr_frames[j];
@@ -67,11 +68,11 @@ void StackTrace::PrintStack(uptr *addr, uptr size) {
Printf(" in %s", info.function);
}
if (info.file) {
- Printf(" %s:%d:%d", StripPathPrefix(info.file), info.line,
- info.column);
+ Printf(" %s:%d:%d", StripPathPrefix(info.file, strip_file_prefix),
+ info.line, info.column);
} else if (info.module) {
- Printf(" (%s+0x%zx)", StripPathPrefix(info.module),
- info.module_offset);
+ Printf(" (%s+0x%zx)", StripPathPrefix(info.module, strip_file_prefix),
+ info.module_offset);
}
Printf("\n");
info.Clear();
@@ -82,8 +83,8 @@ void StackTrace::PrintStack(uptr *addr, uptr size) {
char filename[4096];
if (proc_maps.GetObjectNameAndOffset(pc, &offset,
filename, sizeof(filename))) {
- Printf(" #%zu 0x%zx (%s+0x%zx)\n",
- frame_num, pc, StripPathPrefix(filename), offset);
+ Printf(" #%zu 0x%zx (%s+0x%zx)\n", frame_num, pc,
+ StripPathPrefix(filename, strip_file_prefix), offset);
} else {
Printf(" #%zu 0x%zx\n", frame_num, pc);
}
@@ -222,6 +223,12 @@ void StackTrace::UncompressStack(StackTrace *stack,
#endif // __WORDSIZE
}
+void PrintStack(StackTrace *stack) {
+ stack->PrintStack(stack->trace, stack->size, flags()->symbolize,
+ flags()->strip_path_prefix, symbolize_callback);
+}
+
+
} // namespace __asan
// ------------------ Interface -------------- {{{1
OpenPOWER on IntegriCloud