Added a switch to dump minidump modules in minidump_stackwalk.
In order to figure out what symbols we need associated to a minidump, it is useful to be able to dump all the modules the minidump contains. A=dyen@chromium.org Original Review: https://codereview.chromium.org/1651593002/ BUG=563716 R=dyen@chromium.org Review URL: https://codereview.chromium.org/1650713002 .
This commit is contained in:
		| @@ -71,7 +71,8 @@ using google_breakpad::scoped_ptr; | |||||||
| bool PrintMinidumpProcess(const string &minidump_file, | bool PrintMinidumpProcess(const string &minidump_file, | ||||||
|                           const std::vector<string> &symbol_paths, |                           const std::vector<string> &symbol_paths, | ||||||
|                           bool machine_readable, |                           bool machine_readable, | ||||||
|                           bool output_stack_contents) { |                           bool output_stack_contents, | ||||||
|  |                           bool output_modules_only) { | ||||||
|   scoped_ptr<SimpleSymbolSupplier> symbol_supplier; |   scoped_ptr<SimpleSymbolSupplier> symbol_supplier; | ||||||
|   if (!symbol_paths.empty()) { |   if (!symbol_paths.empty()) { | ||||||
|     // TODO(mmentovai): check existence of symbol_path if specified? |     // TODO(mmentovai): check existence of symbol_path if specified? | ||||||
| @@ -94,7 +95,9 @@ bool PrintMinidumpProcess(const string &minidump_file, | |||||||
|     return false; |     return false; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   if (machine_readable) { |   if (output_modules_only) { | ||||||
|  |     PrintProcessModules(process_state); | ||||||
|  |   } else if (machine_readable) { | ||||||
|     PrintProcessStateMachineReadable(process_state); |     PrintProcessStateMachineReadable(process_state); | ||||||
|   } else { |   } else { | ||||||
|     PrintProcessState(process_state, output_stack_contents, &resolver); |     PrintProcessState(process_state, output_stack_contents, &resolver); | ||||||
| @@ -104,9 +107,10 @@ bool PrintMinidumpProcess(const string &minidump_file, | |||||||
| } | } | ||||||
|  |  | ||||||
| void usage(const char *program_name) { | void usage(const char *program_name) { | ||||||
|   fprintf(stderr, "usage: %s [-m|-s] <minidump-file> [symbol-path ...]\n" |   fprintf(stderr, "usage: %s [-m|-s|-b] <minidump-file> [symbol-path ...]\n" | ||||||
|           "    -m : Output in machine-readable format\n" |           "    -m : Output in machine-readable format\n" | ||||||
|           "    -s : Output stack contents\n", |           "    -s : Output stack contents\n" | ||||||
|  |           "    -b : Output contained full module paths\n", | ||||||
|           program_name); |           program_name); | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -123,6 +127,7 @@ int main(int argc, char **argv) { | |||||||
|   const char *minidump_file; |   const char *minidump_file; | ||||||
|   bool machine_readable = false; |   bool machine_readable = false; | ||||||
|   bool output_stack_contents = false; |   bool output_stack_contents = false; | ||||||
|  |   bool output_modules_only = false; | ||||||
|   int symbol_path_arg; |   int symbol_path_arg; | ||||||
|  |  | ||||||
|   if (strcmp(argv[1], "-m") == 0) { |   if (strcmp(argv[1], "-m") == 0) { | ||||||
| @@ -143,6 +148,15 @@ int main(int argc, char **argv) { | |||||||
|     output_stack_contents = true; |     output_stack_contents = true; | ||||||
|     minidump_file = argv[2]; |     minidump_file = argv[2]; | ||||||
|     symbol_path_arg = 3; |     symbol_path_arg = 3; | ||||||
|  |   } else if (strcmp(argv[1], "-b") == 0) { | ||||||
|  |     if (argc < 3) { | ||||||
|  |       usage(argv[0]); | ||||||
|  |       return 1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     output_modules_only = true; | ||||||
|  |     minidump_file = argv[2]; | ||||||
|  |     symbol_path_arg = 3; | ||||||
|   } else { |   } else { | ||||||
|     minidump_file = argv[1]; |     minidump_file = argv[1]; | ||||||
|     symbol_path_arg = 2; |     symbol_path_arg = 2; | ||||||
| @@ -158,5 +172,6 @@ int main(int argc, char **argv) { | |||||||
|   return PrintMinidumpProcess(minidump_file, |   return PrintMinidumpProcess(minidump_file, | ||||||
|                               symbol_paths, |                               symbol_paths, | ||||||
|                               machine_readable, |                               machine_readable, | ||||||
|                               output_stack_contents) ? 0 : 1; |                               output_stack_contents, | ||||||
|  |                               output_modules_only) ? 0 : 1; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -926,4 +926,13 @@ void PrintProcessStateMachineReadable(const ProcessState& process_state) { | |||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void PrintProcessModules(const ProcessState& process_state) { | ||||||
|  |   const CodeModules* modules = process_state.modules(); | ||||||
|  |   const unsigned int module_count = modules->module_count(); | ||||||
|  |   for (unsigned int i = 0; i < module_count; ++i) { | ||||||
|  |     const CodeModule* module = modules->GetModuleAtSequence(i); | ||||||
|  |     printf("%s\n", module->code_file().c_str()); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
| }  // namespace google_breakpad | }  // namespace google_breakpad | ||||||
|   | |||||||
| @@ -43,6 +43,7 @@ void PrintProcessStateMachineReadable(const ProcessState& process_state); | |||||||
| void PrintProcessState(const ProcessState& process_state, | void PrintProcessState(const ProcessState& process_state, | ||||||
|                        bool output_stack_contents, |                        bool output_stack_contents, | ||||||
|                        SourceLineResolverInterface* resolver); |                        SourceLineResolverInterface* resolver); | ||||||
|  | void PrintProcessModules(const ProcessState& process_state); | ||||||
|  |  | ||||||
| }  // namespace google_breakpad | }  // namespace google_breakpad | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Lei Zhang
					Lei Zhang