diff options
author | nealsid <nealsid@4c0a9323-5329-0410-9bdc-e9ce6186880e> | 2009-07-02 00:30:44 +0000 |
---|---|---|
committer | nealsid <nealsid@4c0a9323-5329-0410-9bdc-e9ce6186880e> | 2009-07-02 00:30:44 +0000 |
commit | 6e525cbfbba74d702dadf62c1878f3aa453a28c4 (patch) | |
tree | f4cd0e34ee8f31951086b5bd38902126a8f3be76 /src/tools | |
parent | Updated google mock external revision so we can use their own tuple implement... (diff) | |
download | breakpad-6e525cbfbba74d702dadf62c1878f3aa453a28c4.tar.xz |
Add stack-dumping logic to crash_report with -t switch
R=jeremy
A=nealsid
git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@357 4c0a9323-5329-0410-9bdc-e9ce6186880e
Diffstat (limited to 'src/tools')
-rw-r--r-- | src/tools/mac/crash_report/crash_report.mm | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/src/tools/mac/crash_report/crash_report.mm b/src/tools/mac/crash_report/crash_report.mm index b24d8247..344eaf97 100644 --- a/src/tools/mac/crash_report/crash_report.mm +++ b/src/tools/mac/crash_report/crash_report.mm @@ -59,6 +59,7 @@ using google_breakpad::BasicSourceLineResolver; using google_breakpad::CallStack; using google_breakpad::CodeModule; using google_breakpad::CodeModules; +using google_breakpad::Minidump; using google_breakpad::MinidumpProcessor; using google_breakpad::OnDemandSymbolSupplier; using google_breakpad::PathnameStripper; @@ -73,6 +74,7 @@ typedef struct { NSString *minidumpPath; NSString *searchDir; NSString *symbolSearchDir; + BOOL printThreadMemory; } Options; //============================================================================= @@ -234,7 +236,13 @@ static void Start(Options *options) { scoped_ptr<MinidumpProcessor> minidump_processor(new MinidumpProcessor(symbol_supplier.get(), &resolver)); ProcessState process_state; - if (minidump_processor->Process(minidump_file, &process_state) != + scoped_ptr<Minidump> dump(new google_breakpad::Minidump(minidump_file)); + + if (!dump->Read()) { + fprintf(stderr, "Minidump %s could not be read\n", dump->path().c_str()); + return; + } + if (minidump_processor->Process(dump.get(), &process_state) != google_breakpad::PROCESS_OK) { fprintf(stderr, "MinidumpProcessor::Process failed\n"); return; @@ -274,12 +282,20 @@ static void Start(Options *options) { // Print all of the threads in the dump. int thread_count = process_state.threads()->size(); + const std::vector<google_breakpad::MinidumpMemoryRegion*> + *thread_memory_regions = process_state.thread_memory_regions(); + for (int thread_index = 0; thread_index < thread_count; ++thread_index) { if (thread_index != requesting_thread) { // Don't print the crash thread again, it was already printed. printf("\n"); printf("Thread %d\n", thread_index); PrintStack(process_state.threads()->at(thread_index), cpu); + google_breakpad::MinidumpMemoryRegion *thread_stack_bytes = + thread_memory_regions->at(thread_index); + if (options->printThreadMemory) { + thread_stack_bytes->Print(); + } } } @@ -303,9 +319,11 @@ static void Usage(int argc, const char *argv[]) { "If modules cannot be found at the paths stored in the " "minidump file, they will be searched for at " "<module-search-dir>/<path-in-minidump-file>.\n"); - fprintf(stderr, "Usage: %s [-s module-search-dir] [-S symbol-file-search-dir] minidump-file\n", argv[0]); + fprintf(stderr, "Usage: %s [-s module-search-dir] [-S symbol-file-search-dir] " + "minidump-file\n", argv[0]); fprintf(stderr, "\t-s: Specify a search directory to use for missing modules\n" - "\t-S: Specify a search directory to use for symbol files\n" + "\t-S: Specify a search directory to use for symbol files\n" + "\t-t: Print thread stack memory in hex\n" "\t-h: Usage\n" "\t-?: Usage\n"); } @@ -315,7 +333,7 @@ static void SetupOptions(int argc, const char *argv[], Options *options) { extern int optind; char ch; - while ((ch = getopt(argc, (char * const *)argv, "S:s:h?")) != -1) { + while ((ch = getopt(argc, (char * const *)argv, "S:s:ht?")) != -1) { switch (ch) { case 's': options->searchDir = [[NSFileManager defaultManager] @@ -329,6 +347,9 @@ static void SetupOptions(int argc, const char *argv[], Options *options) { length:strlen(optarg)]; break; + case 't': + options->printThreadMemory = YES; + break; case 'h': case '?': Usage(argc, argv); |