xserver: Branch 'master'

Adam Jackson ajax at kemper.freedesktop.org
Wed Aug 19 12:44:52 PDT 2009


 os/backtrace.c |   23 ++++++++++++++++-------
 1 file changed, 16 insertions(+), 7 deletions(-)

New commits:
commit eb031d4013d36f6aef4aba45840762ae8635cc13
Author: Adam Jackson <ajax at redhat.com>
Date:   Wed Aug 19 15:42:34 2009 -0400

    linux: hand-roll a backtrace printer instead of using backtrace_symbols
    
    Why?  Because backtrace_symbols calls malloc, which you can't do from a
    signal handler.  Face?  Palm.

diff --git a/os/backtrace.c b/os/backtrace.c
index 3cfae3e..a886688 100644
--- a/os/backtrace.c
+++ b/os/backtrace.c
@@ -29,19 +29,28 @@
 #include "misc.h"
 
 #ifdef HAVE_BACKTRACE
+#define _GNU_SOURCE
+#include <dlfcn.h>
 #include <execinfo.h>
 
 void xorg_backtrace(void)
 {
-    void *array[32]; /* deeper nesting than this means something's wrong */
+    void *array[64];
+    char *mod;
     int size, i;
-    char **strings;
+    Dl_info info;
     ErrorF("\nBacktrace:\n");
-    size = backtrace(array, 32);
-    strings = backtrace_symbols(array, size);
-    for (i = 0; i < size; i++)
-        ErrorF("%d: %s\n", i, strings[i]);
-    free(strings);
+    size = backtrace(array, 64);
+    for (i = 0; i < size; i++) {
+	dladdr(array[i], &info);
+	mod = (info.dli_fname && *info.dli_fname) ? info.dli_fname : "(vdso)";
+	if (info.dli_saddr)
+	    ErrorF("%d: %s (%s+0x%lx) [%p]\n", i, mod,
+		   info.dli_sname, array[i] - info.dli_saddr, array[i]);
+	else
+	    ErrorF("%d: %s (%p+0x%lx) [%p]\n", i, mod,
+		   info.dli_fbase, array[i] - info.dli_fbase, array[i]);
+    }
 }
 
 #else /* not glibc or glibc < 2.1 */


More information about the xorg-commit mailing list