[PATCH] D58493: [libsanitizer] Handle assembler-generated dwarf info in backtrace
Tom de Vries via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Feb 21 01:53:32 PST 2019
vries created this revision.
vries added reviewers: kcc, m.ostapenko, jakubjelinek.
Herald added subscribers: Sanitizers, llvm-commits, jdoerfert, aprantl, kubamracek.
Herald added projects: LLVM, Sanitizers.
[ This patch attempts to fix a problem, for which another patch was submitted earlier ( https://reviews.llvm.org/D34149 ). ]
Consider this test-case, which generates a segmentation fault:
...
int
main (void)
{
void *ptr = (void *)0x01;
int value = *((int *) ptr);
return 0;
}
...
Using LD_PRELOAD we can see how libasan handles the segfault:
...
$ LD_PRELOAD=install/lib64/libasan.so ./a.out
...
Focusing just on the backtrace part for main we have:
...
#0 0x4004a6 in main (a.out+0x4004a6)
...
and when compiled with -g, we have instead instead:
...
#0 0x4004a6 in main test.c:5
...
When we compile the test-case to assembly without -g, but compile the
assembly with -g like this:
...
$ gcc test.c -S
$ gcc test.s -gdwarf-2 -c
$ gcc test.o
...
we get this, similar to the case without -g:
...
#0 0x400481 in main (a.out+0x400481)
...
In this case, the executable contains DWARF file and line number information
for the assembly file, but it's not used because the function name is
missing in the DWARF .debug_info.
This patch fixes this, allowing us to get:
...
#0 0x400481 in main test.s:14
...
Repository:
rCRT Compiler Runtime
https://reviews.llvm.org/D58493
Files:
libsanitizer/sanitizer_common/sanitizer_symbolizer_libbacktrace.cc
Index: libsanitizer/sanitizer_common/sanitizer_symbolizer_libbacktrace.cc
===================================================================
--- libsanitizer/sanitizer_common/sanitizer_symbolizer_libbacktrace.cc
+++ libsanitizer/sanitizer_common/sanitizer_symbolizer_libbacktrace.cc
@@ -109,14 +109,13 @@
const char *filename, int lineno,
const char *function) {
SymbolizeCodeCallbackArg *cdata = (SymbolizeCodeCallbackArg *)vdata;
- if (function) {
- AddressInfo *info = cdata->get_new_frame(addr);
+ AddressInfo *info = cdata->get_new_frame(addr);
+ if (filename)
+ info->file = internal_strdup(filename);
+ info->line = lineno;
+ if (function)
info->function = DemangleAlloc(function, /*always_alloc*/ true);
- if (filename)
- info->file = internal_strdup(filename);
- info->line = lineno;
- cdata->frames_symbolized++;
- }
+ cdata->frames_symbolized++;
return 0;
}
@@ -161,7 +160,11 @@
data.frames_symbolized = 0;
backtrace_pcinfo((backtrace_state *)state_, addr, SymbolizeCodePCInfoCallback,
ErrorCallback, &data);
- if (data.frames_symbolized > 0)
+ if (data.frames_symbolized == 1 && data.last->info.function == 0)
+ /* Augment the frame by trying to fill in the missing function with
+ backtrace_syminfo. */
+ data.frames_symbolized = 0;
+ else if (data.frames_symbolized > 0)
return true;
backtrace_syminfo((backtrace_state *)state_, addr, SymbolizeCodeCallback,
ErrorCallback, &data);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D58493.187737.patch
Type: text/x-patch
Size: 1588 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190221/83489e46/attachment.bin>
More information about the llvm-commits
mailing list