OSDN Git Service

Log the thread id and name for fatal signals.
authorMarco Nelissen <marcone@google.com>
Wed, 7 Mar 2012 17:04:18 +0000 (09:04 -0800)
committerMarco Nelissen <marcone@google.com>
Wed, 7 Mar 2012 20:32:15 +0000 (12:32 -0800)
This adds the thread id and name to the "Fatal signal" logging,
making it easier to track down where in process it actually crashed.

Change-Id: I17a365042b2f10b161debe98bc2e7070af055dfb

linker/debugger.c

index ef8286c..40411b1 100644 (file)
@@ -32,6 +32,7 @@
 #include <ctype.h>
 #include <signal.h>
 #include <sys/mman.h>
+#include <sys/prctl.h>
 #include <errno.h>
 
 #include "linker.h"
@@ -46,6 +47,8 @@ void notify_gdb_of_libraries();
         ret = (cond); \
     } while (ret < 0 && errno == EINTR)
 
+// see man(2) prctl, specifically the section about PR_GET_NAME
+#define MAX_TASK_NAME_LEN (16)
 
 static int socket_abstract_client(const char *name, int type)
 {
@@ -100,6 +103,7 @@ static int socket_abstract_client(const char *name, int type)
 static void logSignalSummary(int signum, const siginfo_t* info)
 {
     char buffer[128];
+    char threadname[MAX_TASK_NAME_LEN + 1]; // one more for termination
 
     char* signame;
     switch (signum) {
@@ -113,9 +117,16 @@ static void logSignalSummary(int signum, const siginfo_t* info)
         default:        signame = "???";        break;
     }
 
+    if (prctl(PR_GET_NAME, (unsigned long)threadname, 0, 0, 0) != 0) {
+        strcpy(threadname, "<name unknown>");
+    } else {
+        // short names are null terminated by prctl, but the manpage
+        // implies that 16 byte names are not.
+        threadname[MAX_TASK_NAME_LEN] = 0;
+    }
     format_buffer(buffer, sizeof(buffer),
-        "Fatal signal %d (%s) at 0x%08x (code=%d)",
-        signum, signame, info->si_addr, info->si_code);
+        "Fatal signal %d (%s) at 0x%08x (code=%d), thread %d (%s)",
+        signum, signame, info->si_addr, info->si_code, gettid(), threadname);
 
     __libc_android_log_write(ANDROID_LOG_FATAL, "libc", buffer);
 }