<div dir="ltr">Submitted as r224308, thanks!</div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Dec 15, 2014 at 11:05 AM, Jakub Jelinek <span dir="ltr"><<a href="mailto:jakub@redhat.com" target="_blank">jakub@redhat.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi!<br>
<br>
I've noticed that data symbolization doesn't really work now in GCC.<br>
The problem is that DataInfo doesn't even have an address field (version<br>
in compiler-rt), and in GCC version uses info->start, which is a field<br>
that is supposed to be set by the method, not the address we should resolve.<br>
>From the caller we only have module_offset computed, which is relative to<br>
the start of the library, but libbacktrace actually wants the full address<br>
instead.<br>
<br>
The following patch fixes it.<br>
<br>
Testcase:<br>
<br>
ts.C:<br>
<br>
#include <pthread.h><br>
<br>
int v;<br>
<br>
int<br>
foo (int x)<br>
{<br>
  if (x < 99)<br>
    throw x;<br>
  v++;<br>
  return x;<br>
}<br>
<br>
void *<br>
tf (void *)<br>
{<br>
  for (int i = 0; i < 100; i++)<br>
    try { foo (i); } catch (int) {}<br>
  return NULL;<br>
}<br>
<br>
int<br>
do_main ()<br>
{<br>
  pthread_t th;<br>
  if (pthread_create (&th, NULL, tf, NULL))<br>
    return 0;<br>
  v++;<br>
  pthread_join (th, NULL);<br>
  return 0;<br>
}<br>
<br>
tsm.C:<br>
<br>
extern int do_main ();<br>
int<br>
main ()<br>
{<br>
  return do_main ();<br>
}<br>
<br>
and for both<br>
$CXX -shared -fpic -o ts.so -g ts.C -fsanitize=thread<br>
$CXX -o tsm -g tsm.C ./ts.so -fsanitize=thread<br>
./tsm<br>
and:<br>
$CXX -o ts -g ts.C tsm.C -fsanitize=thread<br>
./ts<br>
<br>
it should print meaningful<br>
  Location is global 'v' of size 4 at 0x0000006020e0 (ts+0x0000006020e0)<br>
or similar line, not<br>
  Location is global '<null>' of size 0 at 0x0000000000000000<br>
<br>
--- compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_libbacktrace.h.jj     2014-12-15 19:50:53.598624351 +0100<br>
+++ compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_libbacktrace.h        2014-12-15 19:51:24.811097009 +0100<br>
@@ -35,7 +35,7 @@ class LibbacktraceSymbolizer {<br>
   SymbolizedStack *SymbolizeCode(uptr addr, const char *module_name,<br>
                                  uptr module_offset);<br>
<br>
-  bool SymbolizeData(DataInfo *info);<br>
+  bool SymbolizeData(uptr addr, DataInfo *info);<br>
<br>
   // May return NULL if demangling failed.<br>
   static char *Demangle(const char *name, bool always_alloc = false);<br>
--- compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc.jj   2014-12-15 19:50:53.605624233 +0100<br>
+++ compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc      2014-12-15 19:51:24.812096992 +0100<br>
@@ -596,8 +596,8 @@ class POSIXSymbolizer : public Symbolize<br>
     // First, try to use libbacktrace symbolizer (if it's available).<br>
     if (libbacktrace_symbolizer_ != 0) {<br>
       mu_.CheckLocked();<br>
-      if (libbacktrace_symbolizer_->SymbolizeData(info))<br>
-        return true;<br>
+      if (libbacktrace_symbolizer_->SymbolizeData(addr, info))<br>
+       return true;<br>
     }<br>
     const char *str = SendCommand(true, module_name, module_offset);<br>
     if (str == 0)<br>
--- compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_libbacktrace.cc.jj    2014-12-15 19:50:53.600624317 +0100<br>
+++ compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_libbacktrace.cc       2014-12-15 19:52:23.602103720 +0100<br>
@@ -173,8 +173,8 @@ SymbolizedStack *LibbacktraceSymbolizer:<br>
   return data.first;<br>
 }<br>
<br>
-bool LibbacktraceSymbolizer::SymbolizeData(DataInfo *info) {<br>
-  backtrace_syminfo((backtrace_state *)state_, info->address,<br>
+bool LibbacktraceSymbolizer::SymbolizeData(uptr addr, DataInfo *info) {<br>
+  backtrace_syminfo((backtrace_state *)state_, addr,<br>
                     SymbolizeDataCallback, ErrorCallback, info);<br>
   return true;<br>
 }<br>
@@ -192,7 +192,7 @@ SymbolizedStack *LibbacktraceSymbolizer:<br>
   return nullptr;<br>
 }<br>
<br>
-bool LibbacktraceSymbolizer::SymbolizeData(DataInfo *info) {<br>
+bool LibbacktraceSymbolizer::SymbolizeData(uptr addr, DataInfo *info) {<br>
   return false;<br>
 }<br>
<span class="HOEnZb"><font color="#888888"><br>
<br>
        Jakub<br>
</font></span></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature"><div dir="ltr">Alexey Samsonov<br><a href="mailto:vonosmas@gmail.com" target="_blank">vonosmas@gmail.com</a></div></div>
</div>