[PATCH] Fix data symbolization with libbacktrace
Jakub Jelinek
jakub at redhat.com
Mon Dec 15 11:05:50 PST 2014
Hi!
I've noticed that data symbolization doesn't really work now in GCC.
The problem is that DataInfo doesn't even have an address field (version
in compiler-rt), and in GCC version uses info->start, which is a field
that is supposed to be set by the method, not the address we should resolve.
>From the caller we only have module_offset computed, which is relative to
the start of the library, but libbacktrace actually wants the full address
instead.
The following patch fixes it.
Testcase:
ts.C:
#include <pthread.h>
int v;
int
foo (int x)
{
if (x < 99)
throw x;
v++;
return x;
}
void *
tf (void *)
{
for (int i = 0; i < 100; i++)
try { foo (i); } catch (int) {}
return NULL;
}
int
do_main ()
{
pthread_t th;
if (pthread_create (&th, NULL, tf, NULL))
return 0;
v++;
pthread_join (th, NULL);
return 0;
}
tsm.C:
extern int do_main ();
int
main ()
{
return do_main ();
}
and for both
$CXX -shared -fpic -o ts.so -g ts.C -fsanitize=thread
$CXX -o tsm -g tsm.C ./ts.so -fsanitize=thread
./tsm
and:
$CXX -o ts -g ts.C tsm.C -fsanitize=thread
./ts
it should print meaningful
Location is global 'v' of size 4 at 0x0000006020e0 (ts+0x0000006020e0)
or similar line, not
Location is global '<null>' of size 0 at 0x0000000000000000
--- compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_libbacktrace.h.jj 2014-12-15 19:50:53.598624351 +0100
+++ compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_libbacktrace.h 2014-12-15 19:51:24.811097009 +0100
@@ -35,7 +35,7 @@ class LibbacktraceSymbolizer {
SymbolizedStack *SymbolizeCode(uptr addr, const char *module_name,
uptr module_offset);
- bool SymbolizeData(DataInfo *info);
+ bool SymbolizeData(uptr addr, DataInfo *info);
// May return NULL if demangling failed.
static char *Demangle(const char *name, bool always_alloc = false);
--- compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc.jj 2014-12-15 19:50:53.605624233 +0100
+++ compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc 2014-12-15 19:51:24.812096992 +0100
@@ -596,8 +596,8 @@ class POSIXSymbolizer : public Symbolize
// First, try to use libbacktrace symbolizer (if it's available).
if (libbacktrace_symbolizer_ != 0) {
mu_.CheckLocked();
- if (libbacktrace_symbolizer_->SymbolizeData(info))
- return true;
+ if (libbacktrace_symbolizer_->SymbolizeData(addr, info))
+ return true;
}
const char *str = SendCommand(true, module_name, module_offset);
if (str == 0)
--- compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_libbacktrace.cc.jj 2014-12-15 19:50:53.600624317 +0100
+++ compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_libbacktrace.cc 2014-12-15 19:52:23.602103720 +0100
@@ -173,8 +173,8 @@ SymbolizedStack *LibbacktraceSymbolizer:
return data.first;
}
-bool LibbacktraceSymbolizer::SymbolizeData(DataInfo *info) {
- backtrace_syminfo((backtrace_state *)state_, info->address,
+bool LibbacktraceSymbolizer::SymbolizeData(uptr addr, DataInfo *info) {
+ backtrace_syminfo((backtrace_state *)state_, addr,
SymbolizeDataCallback, ErrorCallback, info);
return true;
}
@@ -192,7 +192,7 @@ SymbolizedStack *LibbacktraceSymbolizer:
return nullptr;
}
-bool LibbacktraceSymbolizer::SymbolizeData(DataInfo *info) {
+bool LibbacktraceSymbolizer::SymbolizeData(uptr addr, DataInfo *info) {
return false;
}
Jakub
More information about the llvm-commits
mailing list