summaryrefslogtreecommitdiffstats
path: root/debuggerd
diff options
context:
space:
mode:
Diffstat (limited to 'debuggerd')
-rw-r--r--debuggerd/Android.mk12
-rw-r--r--debuggerd/backtrace.c7
-rw-r--r--debuggerd/crasher.c45
-rw-r--r--debuggerd/tombstone.c64
4 files changed, 44 insertions, 84 deletions
diff --git a/debuggerd/Android.mk b/debuggerd/Android.mk
index e48b9af..15083f4 100644
--- a/debuggerd/Android.mk
+++ b/debuggerd/Android.mk
@@ -23,11 +23,13 @@ ifeq ($(ARCH_ARM_HAVE_VFP_D32),true)
LOCAL_CFLAGS += -DWITH_VFP_D32
endif # ARCH_ARM_HAVE_VFP_D32
-LOCAL_SHARED_LIBRARIES := \
- libcutils \
- libc \
- libcorkscrew \
- libselinux
+LOCAL_SHARED_LIBRARIES := libcutils libc libcorkscrew
+
+ifeq ($(HAVE_SELINUX),true)
+LOCAL_SHARED_LIBRARIES += libselinux
+LOCAL_C_INCLUDES += external/libselinux/include
+LOCAL_CFLAGS += -DHAVE_SELINUX
+endif
include $(BUILD_EXECUTABLE)
diff --git a/debuggerd/backtrace.c b/debuggerd/backtrace.c
index ba76e7d..62f7f32 100644
--- a/debuggerd/backtrace.c
+++ b/debuggerd/backtrace.c
@@ -125,9 +125,10 @@ void dump_backtrace(int fd, pid_t pid, pid_t tid, bool* detach_failed,
char task_path[64];
snprintf(task_path, sizeof(task_path), "/proc/%d/task", pid);
DIR* d = opendir(task_path);
- if (d != NULL) {
- struct dirent* de = NULL;
- while ((de = readdir(d)) != NULL) {
+ if (d) {
+ struct dirent debuf;
+ struct dirent *de;
+ while (!readdir_r(d, &debuf, &de) && de) {
if (!strcmp(de->d_name, ".") || !strcmp(de->d_name, "..")) {
continue;
}
diff --git a/debuggerd/crasher.c b/debuggerd/crasher.c
index 74eaa49..00652e9 100644
--- a/debuggerd/crasher.c
+++ b/debuggerd/crasher.c
@@ -20,7 +20,6 @@
void crash1(void);
void crashnostack(void);
void maybeabort(void);
-int do_action(const char* arg);
static void debuggerd_connect()
{
@@ -75,46 +74,24 @@ int ctest()
return 0;
}
-static void* thread_callback(void* raw_arg)
-{
- return (void*) do_action((const char*) raw_arg);
-}
-
-int do_action_on_thread(const char* arg)
-{
- pthread_t t;
- pthread_create(&t, NULL, thread_callback, (void*) arg);
- void* result = NULL;
- pthread_join(t, &result);
- return (int) result;
-}
-
-int do_action(const char* arg)
+int main(int argc, char **argv)
{
- if(!strncmp(arg, "thread-", strlen("thread-"))) {
- return do_action_on_thread(arg + strlen("thread-"));
- }
-
- if(!strcmp(arg,"nostack")) crashnostack();
- if(!strcmp(arg,"ctest")) return ctest();
- if(!strcmp(arg,"exit")) exit(1);
- if(!strcmp(arg,"abort")) maybeabort();
-
pthread_t thr;
pthread_attr_t attr;
- pthread_attr_init(&attr);
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
- pthread_create(&thr, &attr, test_thread, 0);
- while(1) sleep(1);
-}
-int main(int argc, char **argv)
-{
- fprintf(stderr,"crasher: built at " __TIME__ "!@\n");
+ fprintf(stderr,"crasher: " __TIME__ "!@\n");
fprintf(stderr,"crasher: init pid=%d tid=%d\n", getpid(), gettid());
if(argc > 1) {
- return do_action(argv[1]);
+ if(!strcmp(argv[1],"nostack")) crashnostack();
+ if(!strcmp(argv[1],"ctest")) return ctest();
+ if(!strcmp(argv[1],"exit")) exit(1);
+ if(!strcmp(argv[1],"abort")) maybeabort();
+
+ pthread_attr_init(&attr);
+ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+ pthread_create(&thr, &attr, test_thread, 0);
+ while(1) sleep(1);
} else {
crash1();
// *((int*) 0) = 42;
diff --git a/debuggerd/tombstone.c b/debuggerd/tombstone.c
index e8b3e24..592f4f2 100644
--- a/debuggerd/tombstone.c
+++ b/debuggerd/tombstone.c
@@ -35,7 +35,9 @@
#include <corkscrew/demangle.h>
#include <corkscrew/backtrace.h>
+#ifdef HAVE_SELINUX
#include <selinux/android.h>
+#endif
#include "machine.h"
#include "tombstone.h"
@@ -84,7 +86,6 @@ static const char *get_signame(int sig)
static const char *get_sigcode(int signo, int code)
{
- // Try the signal-specific codes...
switch (signo) {
case SIGILL:
switch (code) {
@@ -123,31 +124,7 @@ static const char *get_sigcode(int signo, int code)
case SEGV_ACCERR: return "SEGV_ACCERR";
}
break;
- case SIGTRAP:
- switch (code) {
- case TRAP_BRKPT: return "TRAP_BRKPT";
- case TRAP_TRACE: return "TRAP_TRACE";
- }
- break;
- }
- // Then the other codes...
- switch (code) {
- case SI_USER: return "SI_USER";
-#if defined(SI_KERNEL)
- case SI_KERNEL: return "SI_KERNEL";
-#endif
- case SI_QUEUE: return "SI_QUEUE";
- case SI_TIMER: return "SI_TIMER";
- case SI_MESGQ: return "SI_MESGQ";
- case SI_ASYNCIO: return "SI_ASYNCIO";
-#if defined(SI_SIGIO)
- case SI_SIGIO: return "SI_SIGIO";
-#endif
-#if defined(SI_TKILL)
- case SI_TKILL: return "SI_TKILL";
-#endif
}
- // Then give up...
return "?";
}
@@ -350,18 +327,6 @@ static void dump_backtrace_and_stack(const ptrace_context_t* context, log_t* log
}
}
-static void dump_map(log_t* log, map_info_t* m, const char* what) {
- if (m != NULL) {
- _LOG(log, false, " %08x-%08x %c%c%c %s\n", m->start, m->end,
- m->is_readable ? 'r' : '-',
- m->is_writable ? 'w' : '-',
- m->is_executable ? 'x' : '-',
- m->name);
- } else {
- _LOG(log, false, " (no %s)\n", what);
- }
-}
-
static void dump_nearby_maps(const ptrace_context_t* context, log_t* log, pid_t tid) {
siginfo_t si;
memset(&si, 0, sizeof(si));
@@ -408,9 +373,21 @@ static void dump_nearby_maps(const ptrace_context_t* context, log_t* log, pid_t
* Show "next" then "match" then "prev" so that the addresses appear in
* ascending order (like /proc/pid/maps).
*/
- dump_map(log, next, "map below");
- dump_map(log, map, "map for address");
- dump_map(log, prev, "map above");
+ if (next != NULL) {
+ _LOG(log, false, " %08x-%08x %s\n", next->start, next->end, next->name);
+ } else {
+ _LOG(log, false, " (no map below)\n");
+ }
+ if (map != NULL) {
+ _LOG(log, false, " %08x-%08x %s\n", map->start, map->end, map->name);
+ } else {
+ _LOG(log, false, " (no map for address)\n");
+ }
+ if (prev != NULL) {
+ _LOG(log, false, " %08x-%08x %s\n", prev->start, prev->end, prev->name);
+ } else {
+ _LOG(log, false, " (no map above)\n");
+ }
}
static void dump_thread(const ptrace_context_t* context, log_t* log, pid_t tid, bool at_fault,
@@ -439,8 +416,9 @@ static bool dump_sibling_thread_report(const ptrace_context_t* context,
}
bool detach_failed = false;
- struct dirent* de;
- while ((de = readdir(d)) != NULL) {
+ struct dirent debuf;
+ struct dirent *de;
+ while (!readdir_r(d, &debuf, &de) && de) {
/* Ignore "." and ".." */
if (!strcmp(de->d_name, ".") || !strcmp(de->d_name, "..")) {
continue;
@@ -718,10 +696,12 @@ char* engrave_tombstone(pid_t pid, pid_t tid, int signal,
mkdir(TOMBSTONE_DIR, 0755);
chown(TOMBSTONE_DIR, AID_SYSTEM, AID_SYSTEM);
+#ifdef HAVE_SELINUX
if (selinux_android_restorecon(TOMBSTONE_DIR) == -1) {
*detach_failed = false;
return NULL;
}
+#endif
int fd;
char* path = find_and_open_tombstone(&fd);