Loading debuggerd/crasher.c +9 −1 Original line number Diff line number Diff line Loading @@ -110,12 +110,19 @@ static void abuse_heap() { free((void*) buf); // GCC is smart enough to warn about this, but we're doing it deliberately. } static void sigsegv_non_null() { int* a = (int *)(&do_action); *a = 42; } static int do_action(const char* arg) { fprintf(stderr,"crasher: init pid=%d tid=%d\n", getpid(), gettid()); if (!strncmp(arg, "thread-", strlen("thread-"))) { return do_action_on_thread(arg + strlen("thread-")); } else if (!strcmp(arg, "SIGSEGV-non-null")) { sigsegv_non_null(); } else if (!strcmp(arg, "smash-stack")) { return smash_stack(42); } else if (!strcmp(arg, "stack-overflow")) { Loading Loading @@ -166,7 +173,8 @@ static int do_action(const char* arg) fprintf(stderr, " LOG_ALWAYS_FATAL call LOG_ALWAYS_FATAL\n"); fprintf(stderr, " LOG_ALWAYS_FATAL_IF call LOG_ALWAYS_FATAL\n"); fprintf(stderr, " SIGPIPE cause a SIGPIPE\n"); fprintf(stderr, " SIGSEGV cause a SIGSEGV (synonym: crash)\n"); fprintf(stderr, " SIGSEGV cause a SIGSEGV at address 0x0 (synonym: crash)\n"); fprintf(stderr, " SIGSEGV-non-null cause a SIGSEGV at a non-zero address\n"); fprintf(stderr, " SIGTRAP cause a SIGTRAP\n"); fprintf(stderr, "prefix any of the above with 'thread-' to not run\n"); fprintf(stderr, "on the process' main thread.\n"); Loading debuggerd/tombstone.cpp +4 −28 Original line number Diff line number Diff line Loading @@ -343,14 +343,10 @@ static void dump_backtrace_and_stack(Backtrace* backtrace, log_t* log) { } } static void dump_map(log_t* log, const backtrace_map_t* map, const char* what) { if (map != NULL) { static void dump_map(log_t* log, const backtrace_map_t* map) { _LOG(log, logtype::MAPS, " %" PRIPTR "-%" PRIPTR " %c%c%c %s\n", map->start, map->end, (map->flags & PROT_READ) ? 'r' : '-', (map->flags & PROT_WRITE) ? 'w' : '-', (map->flags & PROT_EXEC) ? 'x' : '-', map->name.c_str()); } else { _LOG(log, logtype::MAPS, " (no %s)\n", what); } } static void dump_nearby_maps(BacktraceMap* map, log_t* log, pid_t tid) { Loading @@ -370,31 +366,11 @@ static void dump_nearby_maps(BacktraceMap* map, log_t* log, pid_t tid) { return; } _LOG(log, logtype::MAPS, "\nmemory map around fault addr %" PRIPTR ":\n", reinterpret_cast<uintptr_t>(si.si_addr)); _LOG(log, logtype::MAPS, "\nmemory map:\n"); // Search for a match, or for a hole where the match would be. The list // is backward from the file content, so it starts at high addresses. const backtrace_map_t* cur_map = NULL; const backtrace_map_t* next_map = NULL; const backtrace_map_t* prev_map = NULL; for (BacktraceMap::const_iterator it = map->begin(); it != map->end(); ++it) { if (addr >= it->start && addr < it->end) { cur_map = &*it; if (it != map->begin()) { prev_map = &*(it-1); dump_map(log, &*it); } if (++it != map->end()) { next_map = &*it; } break; } } // Show the map address in ascending order (like /proc/pid/maps). dump_map(log, prev_map, "map below"); dump_map(log, cur_map, "map for address"); dump_map(log, next_map, "map above"); } static void dump_thread( Loading Loading
debuggerd/crasher.c +9 −1 Original line number Diff line number Diff line Loading @@ -110,12 +110,19 @@ static void abuse_heap() { free((void*) buf); // GCC is smart enough to warn about this, but we're doing it deliberately. } static void sigsegv_non_null() { int* a = (int *)(&do_action); *a = 42; } static int do_action(const char* arg) { fprintf(stderr,"crasher: init pid=%d tid=%d\n", getpid(), gettid()); if (!strncmp(arg, "thread-", strlen("thread-"))) { return do_action_on_thread(arg + strlen("thread-")); } else if (!strcmp(arg, "SIGSEGV-non-null")) { sigsegv_non_null(); } else if (!strcmp(arg, "smash-stack")) { return smash_stack(42); } else if (!strcmp(arg, "stack-overflow")) { Loading Loading @@ -166,7 +173,8 @@ static int do_action(const char* arg) fprintf(stderr, " LOG_ALWAYS_FATAL call LOG_ALWAYS_FATAL\n"); fprintf(stderr, " LOG_ALWAYS_FATAL_IF call LOG_ALWAYS_FATAL\n"); fprintf(stderr, " SIGPIPE cause a SIGPIPE\n"); fprintf(stderr, " SIGSEGV cause a SIGSEGV (synonym: crash)\n"); fprintf(stderr, " SIGSEGV cause a SIGSEGV at address 0x0 (synonym: crash)\n"); fprintf(stderr, " SIGSEGV-non-null cause a SIGSEGV at a non-zero address\n"); fprintf(stderr, " SIGTRAP cause a SIGTRAP\n"); fprintf(stderr, "prefix any of the above with 'thread-' to not run\n"); fprintf(stderr, "on the process' main thread.\n"); Loading
debuggerd/tombstone.cpp +4 −28 Original line number Diff line number Diff line Loading @@ -343,14 +343,10 @@ static void dump_backtrace_and_stack(Backtrace* backtrace, log_t* log) { } } static void dump_map(log_t* log, const backtrace_map_t* map, const char* what) { if (map != NULL) { static void dump_map(log_t* log, const backtrace_map_t* map) { _LOG(log, logtype::MAPS, " %" PRIPTR "-%" PRIPTR " %c%c%c %s\n", map->start, map->end, (map->flags & PROT_READ) ? 'r' : '-', (map->flags & PROT_WRITE) ? 'w' : '-', (map->flags & PROT_EXEC) ? 'x' : '-', map->name.c_str()); } else { _LOG(log, logtype::MAPS, " (no %s)\n", what); } } static void dump_nearby_maps(BacktraceMap* map, log_t* log, pid_t tid) { Loading @@ -370,31 +366,11 @@ static void dump_nearby_maps(BacktraceMap* map, log_t* log, pid_t tid) { return; } _LOG(log, logtype::MAPS, "\nmemory map around fault addr %" PRIPTR ":\n", reinterpret_cast<uintptr_t>(si.si_addr)); _LOG(log, logtype::MAPS, "\nmemory map:\n"); // Search for a match, or for a hole where the match would be. The list // is backward from the file content, so it starts at high addresses. const backtrace_map_t* cur_map = NULL; const backtrace_map_t* next_map = NULL; const backtrace_map_t* prev_map = NULL; for (BacktraceMap::const_iterator it = map->begin(); it != map->end(); ++it) { if (addr >= it->start && addr < it->end) { cur_map = &*it; if (it != map->begin()) { prev_map = &*(it-1); dump_map(log, &*it); } if (++it != map->end()) { next_map = &*it; } break; } } // Show the map address in ascending order (like /proc/pid/maps). dump_map(log, prev_map, "map below"); dump_map(log, cur_map, "map for address"); dump_map(log, next_map, "map above"); } static void dump_thread( Loading