summaryrefslogtreecommitdiffstats
path: root/debuggerd
diff options
context:
space:
mode:
authorBrigid Smith <brigidsmith@google.com>2014-07-07 12:33:50 -0700
committerBrigid Smith <brigidsmith@google.com>2014-07-08 10:53:49 -0700
commit8606eaa7700609a2f9f2383b954b4e64dbc4c827 (patch)
tree7f02593853c64580adfae7801557886f7420e199 /debuggerd
parentf6ef1f53ac1b4dd659d23f418042db8dd556b9c2 (diff)
downloadsystem_core-8606eaa7700609a2f9f2383b954b4e64dbc4c827.zip
system_core-8606eaa7700609a2f9f2383b954b4e64dbc4c827.tar.gz
system_core-8606eaa7700609a2f9f2383b954b4e64dbc4c827.tar.bz2
Improving maps output.
Maps output now displays fault address location more intelligently. If the fault is not in a mapped region, it now shows where that address is with respect to the other maps. In addition, the size of the map is now printed as part of the output. Also, crasher now supports an "mmap" option which mmaps/munmaps a region of memory and then attempts to access it, causing a fault address in between mapped regions that can be used to test that new part of the maps output. Change-Id: Ia5e1926802bdfcbbdb7857e3631ddf395ae0c5b8
Diffstat (limited to 'debuggerd')
-rw-r--r--debuggerd/crasher.c6
-rwxr-xr-xdebuggerd/tombstone.cpp34
2 files changed, 25 insertions, 15 deletions
diff --git a/debuggerd/crasher.c b/debuggerd/crasher.c
index e11d9af..9df3c64 100644
--- a/debuggerd/crasher.c
+++ b/debuggerd/crasher.c
@@ -7,6 +7,7 @@
#include <stdlib.h>
#include <string.h>
#include <sys/cdefs.h>
+#include <sys/mman.h>
#include <sys/ptrace.h>
#include <sys/socket.h>
#include <sys/wait.h>
@@ -156,6 +157,10 @@ static int do_action(const char* arg)
return EXIT_SUCCESS;
} else if (!strcmp(arg, "heap-usage")) {
abuse_heap();
+ } else if (!strcmp(arg, "SIGSEGV-unmapped")) {
+ char* map = mmap(NULL, sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
+ munmap(map, sizeof(int));
+ map[0] = '8';
}
fprintf(stderr, "%s OP\n", __progname);
@@ -175,6 +180,7 @@ static int do_action(const char* arg)
fprintf(stderr, " SIGPIPE cause a SIGPIPE\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, " SIGSEGV-unmapped mmap/munmap a region of memory and then attempt to access it\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");
diff --git a/debuggerd/tombstone.cpp b/debuggerd/tombstone.cpp
index dea016d..2bb9efd 100755
--- a/debuggerd/tombstone.cpp
+++ b/debuggerd/tombstone.cpp
@@ -329,10 +329,11 @@ static void dump_backtrace_and_stack(Backtrace* backtrace, log_t* log) {
}
static void dump_map(log_t* log, const backtrace_map_t* map, bool fault_addr) {
- _LOG(log, logtype::MAPS, "%s%" PRIPTR "-%" PRIPTR " %c%c%c %s\n",
- (fault_addr? "--->" : " "), map->start, map->end,
+ _LOG(log, logtype::MAPS, "%s%" PRIPTR "-%" PRIPTR " %c%c%c %7d %s\n",
+ (fault_addr? "--->" : " "), map->start, map->end - 1,
(map->flags & PROT_READ) ? 'r' : '-', (map->flags & PROT_WRITE) ? 'w' : '-',
- (map->flags & PROT_EXEC) ? 'x' : '-', map->name.c_str());
+ (map->flags & PROT_EXEC) ? 'x' : '-',
+ (map->end - map->start), map->name.c_str());
}
static void dump_nearby_maps(BacktraceMap* map, log_t* log, pid_t tid) {
@@ -342,28 +343,31 @@ static void dump_nearby_maps(BacktraceMap* map, log_t* log, pid_t tid) {
_LOG(log, logtype::MAPS, "cannot get siginfo for %d: %s\n", tid, strerror(errno));
return;
}
- if (!signal_has_si_addr(si.si_signo)) {
- return;
- }
+ bool is_running = (si.si_code == SI_USER);
uintptr_t addr = reinterpret_cast<uintptr_t>(si.si_addr);
addr &= ~0xfff; // round to 4K page boundary
- if (addr == 0) { // null-pointer deref
+ if (!is_running && addr == 0) { // null-pointer deref
return;
}
- _LOG(log, logtype::MAPS, "\nmemory map: (fault address prefixed with --->)\n");
+ _LOG(log, logtype::MAPS, "\nmemory map: %s\n", is_running? "" : "(fault address prefixed with --->)");
+
+ if(!is_running && (addr < map->begin()->start)) {
+ _LOG(log, logtype::MAPS, "--->Fault address falls at %" PRIPTR " before any mapped regions\n", addr);
+ }
- bool found_map = false;
+ BacktraceMap::const_iterator prev = map->begin();
for (BacktraceMap::const_iterator it = map->begin(); it != map->end(); ++it) {
- bool in_map = addr >= (*it).start && addr < (*it).end;
- dump_map(log, &*it, in_map);
- if(in_map) {
- found_map = true;
+ if (addr >= (*prev).end && addr < (*it).start) {
+ _LOG(log, logtype::MAPS, "--->Fault address falls at %" PRIPTR " between mapped regions\n", addr);
}
+ prev = it;
+ bool in_map = !is_running && (addr >= (*it).start) && (addr < (*it).end);
+ dump_map(log, &*it, in_map);
}
- if(!found_map) {
- _LOG(log, logtype::ERROR, "\nFault address was not in any map!");
+ if (!is_running && (addr >= (*prev).end)) {
+ _LOG(log, logtype::MAPS, "--->Fault address falls at %" PRIPTR " after any mapped regions\n", addr);
}
}