blob: 04b7e129e51fc9c7c666962874b9f617da80069b [file] [log] [blame]
mmentovai7daf2462006-09-20 21:16:16 +00001// Copyright (c) 2006, Google Inc.
2// All rights reserved.
brynerd5e66382006-09-08 02:35:53 +00003//
mmentovai7daf2462006-09-20 21:16:16 +00004// Redistribution and use in source and binary forms, with or without
5// modification, are permitted provided that the following conditions are
6// met:
brynerd5e66382006-09-08 02:35:53 +00007//
mmentovai7daf2462006-09-20 21:16:16 +00008// * Redistributions of source code must retain the above copyright
9// notice, this list of conditions and the following disclaimer.
10// * Redistributions in binary form must reproduce the above
11// copyright notice, this list of conditions and the following disclaimer
12// in the documentation and/or other materials provided with the
13// distribution.
ivan.penkov@gmail.com8695cc02013-05-11 00:23:41 +000014// * Neither the name of Google Inc. nor the names of its
mmentovai7daf2462006-09-20 21:16:16 +000015// contributors may be used to endorse or promote products derived from
16// this software without specific prior written permission.
brynerd5e66382006-09-08 02:35:53 +000017//
mmentovai7daf2462006-09-20 21:16:16 +000018// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
brynerd5e66382006-09-08 02:35:53 +000029
mmentovaie5dc6082007-02-14 19:51:05 +000030#include "google_breakpad/processor/minidump_processor.h"
ted.mielczareke1930982010-06-25 16:57:07 +000031
32#include <assert.h>
ted.mielczareke1930982010-06-25 16:57:07 +000033
Joshua Perazaa7b621f2020-04-27 14:58:17 -070034#include <algorithm>
ivan.penkov@gmail.com8695cc02013-05-11 00:23:41 +000035#include <string>
36
ted.mielczarek@gmail.com63c5d982013-01-17 15:53:56 +000037#include "common/scoped_ptr.h"
Yunxiao Ma46359272016-04-05 15:45:30 -040038#include "common/stdio_wrapper.h"
ivan.penkov@gmail.com8695cc02013-05-11 00:23:41 +000039#include "common/using_std_string.h"
mmentovaie5dc6082007-02-14 19:51:05 +000040#include "google_breakpad/processor/call_stack.h"
41#include "google_breakpad/processor/minidump.h"
42#include "google_breakpad/processor/process_state.h"
nealsid8d2c5182010-08-24 14:28:10 +000043#include "google_breakpad/processor/exploitability.h"
SiyangXie@gmail.combab77002012-10-10 21:41:52 +000044#include "google_breakpad/processor/stack_frame_symbolizer.h"
mmentovaiaf3c43f2007-05-17 18:34:37 +000045#include "processor/logging.h"
brynerd5e66382006-09-08 02:35:53 +000046#include "processor/stackwalker_x86.h"
mark@chromium.orgcd6f9052015-04-10 22:05:29 +000047#include "processor/symbolic_constants_win.h"
brynerd5e66382006-09-08 02:35:53 +000048
mmentovaie5dc6082007-02-14 19:51:05 +000049namespace google_breakpad {
brynerd5e66382006-09-08 02:35:53 +000050
Mike Frysinger09b05692020-06-23 18:55:43 -040051MinidumpProcessor::MinidumpProcessor(SymbolSupplier* supplier,
52 SourceLineResolverInterface* resolver)
SiyangXie@gmail.combab77002012-10-10 21:41:52 +000053 : frame_symbolizer_(new StackFrameSymbolizer(supplier, resolver)),
54 own_frame_symbolizer_(true),
Liu.andrew.x@gmail.comf0735402015-08-21 16:22:19 +000055 enable_exploitability_(false),
56 enable_objdump_(false) {
nealsid8d2c5182010-08-24 14:28:10 +000057}
58
Mike Frysinger09b05692020-06-23 18:55:43 -040059MinidumpProcessor::MinidumpProcessor(SymbolSupplier* supplier,
60 SourceLineResolverInterface* resolver,
nealsid8d2c5182010-08-24 14:28:10 +000061 bool enable_exploitability)
SiyangXie@gmail.combab77002012-10-10 21:41:52 +000062 : frame_symbolizer_(new StackFrameSymbolizer(supplier, resolver)),
63 own_frame_symbolizer_(true),
Liu.andrew.x@gmail.comf0735402015-08-21 16:22:19 +000064 enable_exploitability_(enable_exploitability),
65 enable_objdump_(false) {
brynerd5e66382006-09-08 02:35:53 +000066}
67
Mike Frysinger09b05692020-06-23 18:55:43 -040068MinidumpProcessor::MinidumpProcessor(StackFrameSymbolizer* frame_symbolizer,
SiyangXie@gmail.combab77002012-10-10 21:41:52 +000069 bool enable_exploitability)
70 : frame_symbolizer_(frame_symbolizer),
71 own_frame_symbolizer_(false),
Liu.andrew.x@gmail.comf0735402015-08-21 16:22:19 +000072 enable_exploitability_(enable_exploitability),
73 enable_objdump_(false) {
SiyangXie@gmail.combab77002012-10-10 21:41:52 +000074 assert(frame_symbolizer_);
75}
76
brynercce34922006-09-19 21:58:41 +000077MinidumpProcessor::~MinidumpProcessor() {
SiyangXie@gmail.combab77002012-10-10 21:41:52 +000078 if (own_frame_symbolizer_) delete frame_symbolizer_;
brynerd5e66382006-09-08 02:35:53 +000079}
80
nealsidb56cfa02009-05-29 00:53:02 +000081ProcessResult MinidumpProcessor::Process(
Mike Frysinger09b05692020-06-23 18:55:43 -040082 Minidump* dump, ProcessState* process_state) {
nealsidb56cfa02009-05-29 00:53:02 +000083 assert(dump);
84 assert(process_state);
brynerd5e66382006-09-08 02:35:53 +000085
brynerf33b8d22006-12-08 04:13:51 +000086 process_state->Clear();
mmentovaie5468b82006-10-24 19:31:21 +000087
Mike Frysinger09b05692020-06-23 18:55:43 -040088 const MDRawHeader* header = dump->header();
nealsidb56cfa02009-05-29 00:53:02 +000089 if (!header) {
90 BPLOG(ERROR) << "Minidump " << dump->path() << " has no header";
91 return PROCESS_ERROR_NO_MINIDUMP_HEADER;
92 }
waylonisdaf42112006-12-06 04:58:27 +000093 process_state->time_date_stamp_ = header->time_date_stamp;
94
ivanpe@chromium.org63919582014-11-25 22:45:23 +000095 bool has_process_create_time =
96 GetProcessCreateTime(dump, &process_state->process_create_time_);
97
nealsidb56cfa02009-05-29 00:53:02 +000098 bool has_cpu_info = GetCPUInfo(dump, &process_state->system_info_);
99 bool has_os_info = GetOSInfo(dump, &process_state->system_info_);
mmentovaie5468b82006-10-24 19:31:21 +0000100
ted.mielczarek@gmail.comaeffe102013-03-06 14:04:42 +0000101 uint32_t dump_thread_id = 0;
mmentovai76f052f2006-11-06 23:00:19 +0000102 bool has_dump_thread = false;
ted.mielczarek@gmail.comaeffe102013-03-06 14:04:42 +0000103 uint32_t requesting_thread_id = 0;
mmentovai76f052f2006-11-06 23:00:19 +0000104 bool has_requesting_thread = false;
105
Mike Frysinger09b05692020-06-23 18:55:43 -0400106 MinidumpBreakpadInfo* breakpad_info = dump->GetBreakpadInfo();
mmentovaie5dc6082007-02-14 19:51:05 +0000107 if (breakpad_info) {
108 has_dump_thread = breakpad_info->GetDumpThreadID(&dump_thread_id);
mmentovai76f052f2006-11-06 23:00:19 +0000109 has_requesting_thread =
mmentovaie5dc6082007-02-14 19:51:05 +0000110 breakpad_info->GetRequestingThreadID(&requesting_thread_id);
mmentovai76f052f2006-11-06 23:00:19 +0000111 }
112
Mike Frysinger09b05692020-06-23 18:55:43 -0400113 MinidumpException* exception = dump->GetException();
mmentovaie5468b82006-10-24 19:31:21 +0000114 if (exception) {
115 process_state->crashed_ = true;
mmentovai76f052f2006-11-06 23:00:19 +0000116 has_requesting_thread = exception->GetThreadID(&requesting_thread_id);
mmentovaie5468b82006-10-24 19:31:21 +0000117
118 process_state->crash_reason_ = GetCrashReason(
nealsidb56cfa02009-05-29 00:53:02 +0000119 dump, &process_state->crash_address_);
Joshua Peraza4e15f7d2020-01-03 12:00:23 -0800120
121 process_state->exception_record_.set_code(
122 exception->exception()->exception_record.exception_code,
123 // TODO(ivanpe): Populate description.
124 /* description = */ "");
125 process_state->exception_record_.set_flags(
126 exception->exception()->exception_record.exception_flags,
127 // TODO(ivanpe): Populate description.
128 /* description = */ "");
129 process_state->exception_record_.set_nested_exception_record_address(
130 exception->exception()->exception_record.exception_record);
131 process_state->exception_record_.set_address(process_state->crash_address_);
Joshua Perazaa7b621f2020-04-27 14:58:17 -0700132 const uint32_t num_parameters =
133 std::min(exception->exception()->exception_record.number_parameters,
134 MD_EXCEPTION_MAXIMUM_PARAMETERS);
135 for (uint32_t i = 0; i < num_parameters; ++i) {
Joshua Peraza4e15f7d2020-01-03 12:00:23 -0800136 process_state->exception_record_.add_parameter(
137 exception->exception()->exception_record.exception_information[i],
138 // TODO(ivanpe): Populate description.
139 /* description = */ "");
140 }
brynerd5e66382006-09-08 02:35:53 +0000141 }
142
cdn@chromium.orgcec12872010-09-22 02:37:19 +0000143 // This will just return an empty string if it doesn't exist.
144 process_state->assertion_ = GetAssertion(dump);
ted.mielczarek0314e482009-12-02 17:43:57 +0000145
Mike Frysinger09b05692020-06-23 18:55:43 -0400146 MinidumpModuleList* module_list = dump->GetModuleList();
mmentovaidb3342a2006-12-05 22:52:28 +0000147
148 // Put a copy of the module list into ProcessState object. This is not
149 // necessarily a MinidumpModuleList, but it adheres to the CodeModules
150 // interface, which is all that ProcessState needs to expose.
Ivan Penkov24f59312016-06-20 11:14:47 -0700151 if (module_list) {
mmentovaidb3342a2006-12-05 22:52:28 +0000152 process_state->modules_ = module_list->Copy();
Ivan Penkov24f59312016-06-20 11:14:47 -0700153 process_state->shrunk_range_modules_ =
154 process_state->modules_->GetShrunkRangeModules();
155 for (unsigned int i = 0;
156 i < process_state->shrunk_range_modules_.size();
157 i++) {
158 linked_ptr<const CodeModule> module =
159 process_state->shrunk_range_modules_[i];
160 BPLOG(INFO) << "The range for module " << module->code_file()
161 << " was shrunk down by " << HexString(
162 module->shrink_down_delta()) << " bytes. ";
163 }
164 }
mmentovaidb3342a2006-12-05 22:52:28 +0000165
Mike Frysinger09b05692020-06-23 18:55:43 -0400166 MinidumpUnloadedModuleList* unloaded_module_list =
Joshua Peraza0924d422017-01-19 11:18:41 -0800167 dump->GetUnloadedModuleList();
168 if (unloaded_module_list) {
169 process_state->unloaded_modules_ = unloaded_module_list->Copy();
170 }
171
Mike Frysinger09b05692020-06-23 18:55:43 -0400172 MinidumpMemoryList* memory_list = dump->GetMemoryList();
ivan.penkov@gmail.comd3944342013-06-27 20:34:30 +0000173 if (memory_list) {
174 BPLOG(INFO) << "Found " << memory_list->region_count()
175 << " memory regions.";
176 }
177
Mike Frysinger09b05692020-06-23 18:55:43 -0400178 MinidumpThreadList* threads = dump->GetThreadList();
brynerd5e66382006-09-08 02:35:53 +0000179 if (!threads) {
nealsidb56cfa02009-05-29 00:53:02 +0000180 BPLOG(ERROR) << "Minidump " << dump->path() << " has no thread list";
181 return PROCESS_ERROR_NO_THREAD_LIST;
brynerd5e66382006-09-08 02:35:53 +0000182 }
183
nealsidb56cfa02009-05-29 00:53:02 +0000184 BPLOG(INFO) << "Minidump " << dump->path() << " has " <<
ivanpe@chromium.org63919582014-11-25 22:45:23 +0000185 (has_cpu_info ? "" : "no ") << "CPU info, " <<
186 (has_os_info ? "" : "no ") << "OS info, " <<
187 (breakpad_info != NULL ? "" : "no ") << "Breakpad info, " <<
188 (exception != NULL ? "" : "no ") << "exception, " <<
189 (module_list != NULL ? "" : "no ") << "module list, " <<
190 (threads != NULL ? "" : "no ") << "thread list, " <<
191 (has_dump_thread ? "" : "no ") << "dump thread, " <<
192 (has_requesting_thread ? "" : "no ") << "requesting thread, and " <<
193 (has_process_create_time ? "" : "no ") << "process create time";
mmentovaiaf3c43f2007-05-17 18:34:37 +0000194
mmentovai6ed453a2007-05-25 19:10:19 +0000195 bool interrupted = false;
mmentovai76f052f2006-11-06 23:00:19 +0000196 bool found_requesting_thread = false;
mmentovaie5468b82006-10-24 19:31:21 +0000197 unsigned int thread_count = threads->thread_count();
SiyangXie@gmail.combab77002012-10-10 21:41:52 +0000198
199 // Reset frame_symbolizer_ at the beginning of stackwalk for each minidump.
200 frame_symbolizer_->Reset();
201
mmentovaie5468b82006-10-24 19:31:21 +0000202 for (unsigned int thread_index = 0;
203 thread_index < thread_count;
204 ++thread_index) {
mmentovaiaf3c43f2007-05-17 18:34:37 +0000205 char thread_string_buffer[64];
206 snprintf(thread_string_buffer, sizeof(thread_string_buffer), "%d/%d",
207 thread_index, thread_count);
nealsidb56cfa02009-05-29 00:53:02 +0000208 string thread_string = dump->path() + ":" + thread_string_buffer;
mmentovaiaf3c43f2007-05-17 18:34:37 +0000209
Mike Frysinger09b05692020-06-23 18:55:43 -0400210 MinidumpThread* thread = threads->GetThreadAtIndex(thread_index);
mmentovaie5468b82006-10-24 19:31:21 +0000211 if (!thread) {
mmentovaiaf3c43f2007-05-17 18:34:37 +0000212 BPLOG(ERROR) << "Could not get thread for " << thread_string;
nealsidb56cfa02009-05-29 00:53:02 +0000213 return PROCESS_ERROR_GETTING_THREAD;
mmentovaie5468b82006-10-24 19:31:21 +0000214 }
215
ted.mielczarek@gmail.comaeffe102013-03-06 14:04:42 +0000216 uint32_t thread_id;
mmentovai76f052f2006-11-06 23:00:19 +0000217 if (!thread->GetThreadID(&thread_id)) {
mmentovaiaf3c43f2007-05-17 18:34:37 +0000218 BPLOG(ERROR) << "Could not get thread ID for " << thread_string;
nealsidb56cfa02009-05-29 00:53:02 +0000219 return PROCESS_ERROR_GETTING_THREAD_ID;
mmentovai76f052f2006-11-06 23:00:19 +0000220 }
221
mmentovaiaf3c43f2007-05-17 18:34:37 +0000222 thread_string += " id " + HexString(thread_id);
223 BPLOG(INFO) << "Looking at thread " << thread_string;
224
mmentovai76f052f2006-11-06 23:00:19 +0000225 // If this thread is the thread that produced the minidump, don't process
226 // it. Because of the problems associated with a thread producing a
227 // dump of itself (when both its context and its stack are in flux),
228 // processing that stack wouldn't provide much useful data.
229 if (has_dump_thread && thread_id == dump_thread_id) {
230 continue;
231 }
232
Mike Frysinger09b05692020-06-23 18:55:43 -0400233 MinidumpContext* context = thread->GetContext();
mmentovaif944ba32006-10-26 23:09:02 +0000234
mmentovai76f052f2006-11-06 23:00:19 +0000235 if (has_requesting_thread && thread_id == requesting_thread_id) {
236 if (found_requesting_thread) {
237 // There can't be more than one requesting thread.
mmentovaiaf3c43f2007-05-17 18:34:37 +0000238 BPLOG(ERROR) << "Duplicate requesting thread: " << thread_string;
nealsidb56cfa02009-05-29 00:53:02 +0000239 return PROCESS_ERROR_DUPLICATE_REQUESTING_THREADS;
mmentovaie5468b82006-10-24 19:31:21 +0000240 }
241
mmentovai76f052f2006-11-06 23:00:19 +0000242 // Use processed_state->threads_.size() instead of thread_index.
243 // thread_index points to the thread index in the minidump, which
244 // might be greater than the thread index in the threads vector if
245 // any of the minidump's threads are skipped and not placed into the
246 // processed threads vector. The thread vector's current size will
247 // be the index of the current thread when it's pushed into the
248 // vector.
249 process_state->requesting_thread_ = process_state->threads_.size();
mmentovaif944ba32006-10-26 23:09:02 +0000250
mmentovai76f052f2006-11-06 23:00:19 +0000251 found_requesting_thread = true;
252
253 if (process_state->crashed_) {
254 // Use the exception record's context for the crashed thread, instead
255 // of the thread's own context. For the crashed thread, the thread's
256 // own context is the state inside the exception handler. Using it
257 // would not result in the expected stack trace from the time of the
jschuh@chromium.org5f4fa552009-10-19 18:10:49 +0000258 // crash. If the exception context is invalid, however, we fall back
259 // on the thread context.
Mike Frysinger09b05692020-06-23 18:55:43 -0400260 MinidumpContext* ctx = exception->GetContext();
jschuh@chromium.org5f4fa552009-10-19 18:10:49 +0000261 context = ctx ? ctx : thread->GetContext();
mmentovai76f052f2006-11-06 23:00:19 +0000262 }
mmentovaie5468b82006-10-24 19:31:21 +0000263 }
264
ivan.penkov@gmail.comd3944342013-06-27 20:34:30 +0000265 // If the memory region for the stack cannot be read using the RVA stored
266 // in the memory descriptor inside MINIDUMP_THREAD, try to locate and use
267 // a memory region (containing the stack) from the minidump memory list.
Mike Frysinger09b05692020-06-23 18:55:43 -0400268 MinidumpMemoryRegion* thread_memory = thread->GetMemory();
ivan.penkov@gmail.comd3944342013-06-27 20:34:30 +0000269 if (!thread_memory && memory_list) {
270 uint64_t start_stack_memory_range = thread->GetStartOfStackMemoryRange();
271 if (start_stack_memory_range) {
272 thread_memory = memory_list->GetMemoryRegionForAddress(
273 start_stack_memory_range);
274 }
275 }
mmentovaie5468b82006-10-24 19:31:21 +0000276 if (!thread_memory) {
mmentovaiaf3c43f2007-05-17 18:34:37 +0000277 BPLOG(ERROR) << "No memory region for " << thread_string;
mmentovaie5468b82006-10-24 19:31:21 +0000278 }
279
mmentovaidb3342a2006-12-05 22:52:28 +0000280 // Use process_state->modules_ instead of module_list, because the
281 // |modules| argument will be used to populate the |module| fields in
282 // the returned StackFrame objects, which will be placed into the
283 // returned ProcessState object. module_list's lifetime is only as
284 // long as the Minidump object: it will be deleted when this function
285 // returns. process_state->modules_ is owned by the ProcessState object
286 // (just like the StackFrame objects), and is much more suitable for this
287 // task.
mmentovaie5468b82006-10-24 19:31:21 +0000288 scoped_ptr<Stackwalker> stackwalker(
mmentovai97d392d2007-01-10 22:47:56 +0000289 Stackwalker::StackwalkerForCPU(process_state->system_info(),
290 context,
mmentovaie5468b82006-10-24 19:31:21 +0000291 thread_memory,
mmentovaidb3342a2006-12-05 22:52:28 +0000292 process_state->modules_,
Joshua Peraza0924d422017-01-19 11:18:41 -0800293 process_state->unloaded_modules_,
SiyangXie@gmail.combab77002012-10-10 21:41:52 +0000294 frame_symbolizer_));
mmentovaie5468b82006-10-24 19:31:21 +0000295
brynerf33b8d22006-12-08 04:13:51 +0000296 scoped_ptr<CallStack> stack(new CallStack());
ted.mielczarek@gmail.comfc6f7002012-11-06 16:50:01 +0000297 if (stackwalker.get()) {
ivan.penkov@gmail.com60b5f7c2013-03-06 19:32:13 +0000298 if (!stackwalker->Walk(stack.get(),
ivan.penkov@gmail.com8819ab02013-07-11 01:36:06 +0000299 &process_state->modules_without_symbols_,
300 &process_state->modules_with_corrupt_symbols_)) {
ivan.penkov@gmail.com60b5f7c2013-03-06 19:32:13 +0000301 BPLOG(INFO) << "Stackwalker interrupt (missing symbols?) at "
302 << thread_string;
ted.mielczarek@gmail.comfc6f7002012-11-06 16:50:01 +0000303 interrupted = true;
304 }
305 } else {
306 // Threads with missing CPU contexts will hit this, but
307 // don't abort processing the rest of the dump just for
308 // one bad thread.
309 BPLOG(ERROR) << "No stackwalker for " << thread_string;
mmentovaie5468b82006-10-24 19:31:21 +0000310 }
Sebastien Marchandd9c53222016-04-01 10:11:10 -0400311 stack->set_tid(thread_id);
mmentovaie5468b82006-10-24 19:31:21 +0000312 process_state->threads_.push_back(stack.release());
nealsid6e525cb2009-07-02 00:30:44 +0000313 process_state->thread_memory_regions_.push_back(thread_memory);
mmentovaie5468b82006-10-24 19:31:21 +0000314 }
315
mmentovai6ed453a2007-05-25 19:10:19 +0000316 if (interrupted) {
nealsidb56cfa02009-05-29 00:53:02 +0000317 BPLOG(INFO) << "Processing interrupted for " << dump->path();
318 return PROCESS_SYMBOL_SUPPLIER_INTERRUPTED;
mmentovai6ed453a2007-05-25 19:10:19 +0000319 }
320
mmentovai76f052f2006-11-06 23:00:19 +0000321 // If a requesting thread was indicated, it must be present.
322 if (has_requesting_thread && !found_requesting_thread) {
waylonis3a9a38a2007-02-01 23:54:05 +0000323 // Don't mark as an error, but invalidate the requesting thread
mmentovaiaf3c43f2007-05-17 18:34:37 +0000324 BPLOG(ERROR) << "Minidump indicated requesting thread " <<
nealsidb56cfa02009-05-29 00:53:02 +0000325 HexString(requesting_thread_id) << ", not found in " <<
326 dump->path();
waylonis3a9a38a2007-02-01 23:54:05 +0000327 process_state->requesting_thread_ = -1;
brynerd5e66382006-09-08 02:35:53 +0000328 }
329
nealsid8d2c5182010-08-24 14:28:10 +0000330 // Exploitability defaults to EXPLOITABILITY_NOT_ANALYZED
331 process_state->exploitability_ = EXPLOITABILITY_NOT_ANALYZED;
332
333 // If an exploitability run was requested we perform the platform specific
334 // rating.
335 if (enable_exploitability_) {
336 scoped_ptr<Exploitability> exploitability(
Liu.andrew.x@gmail.comf0735402015-08-21 16:22:19 +0000337 Exploitability::ExploitabilityForPlatform(dump,
338 process_state,
339 enable_objdump_));
nealsid8d2c5182010-08-24 14:28:10 +0000340 // The engine will be null if the platform is not supported
341 if (exploitability != NULL) {
342 process_state->exploitability_ = exploitability->CheckExploitability();
343 } else {
344 process_state->exploitability_ = EXPLOITABILITY_ERR_NOENGINE;
345 }
346 }
347
nealsidb56cfa02009-05-29 00:53:02 +0000348 BPLOG(INFO) << "Processed " << dump->path();
brynerf33b8d22006-12-08 04:13:51 +0000349 return PROCESS_OK;
mmentovaie5468b82006-10-24 19:31:21 +0000350}
351
nealsidb56cfa02009-05-29 00:53:02 +0000352ProcessResult MinidumpProcessor::Process(
Mike Frysinger09b05692020-06-23 18:55:43 -0400353 const string& minidump_file, ProcessState* process_state) {
nealsidb56cfa02009-05-29 00:53:02 +0000354 BPLOG(INFO) << "Processing minidump in file " << minidump_file;
355
356 Minidump dump(minidump_file);
357 if (!dump.Read()) {
358 BPLOG(ERROR) << "Minidump " << dump.path() << " could not be read";
359 return PROCESS_ERROR_MINIDUMP_NOT_FOUND;
cdn@chromium.orgcec12872010-09-22 02:37:19 +0000360 }
nealsidb56cfa02009-05-29 00:53:02 +0000361
362 return Process(&dump, process_state);
363}
364
mmentovaie5468b82006-10-24 19:31:21 +0000365// Returns the MDRawSystemInfo from a minidump, or NULL if system info is
mmentovai80e98392006-10-25 21:25:41 +0000366// not available from the minidump. If system_info is non-NULL, it is used
mmentovaie5468b82006-10-24 19:31:21 +0000367// to pass back the MinidumpSystemInfo object.
Mike Frysinger09b05692020-06-23 18:55:43 -0400368static const MDRawSystemInfo* GetSystemInfo(Minidump* dump,
369 MinidumpSystemInfo** system_info) {
370 MinidumpSystemInfo* minidump_system_info = dump->GetSystemInfo();
mmentovaie5468b82006-10-24 19:31:21 +0000371 if (!minidump_system_info)
mmentovaid119a922006-10-23 19:24:58 +0000372 return NULL;
mmentovaie5468b82006-10-24 19:31:21 +0000373
374 if (system_info)
375 *system_info = minidump_system_info;
376
377 return minidump_system_info->system_info();
378}
379
Gabriele Svelto44384d82019-01-30 09:26:07 +0100380static uint64_t GetAddressForArchitecture(const MDCPUArchitecture architecture,
381 size_t raw_address)
382{
383 switch (architecture) {
384 case MD_CPU_ARCHITECTURE_X86:
385 case MD_CPU_ARCHITECTURE_MIPS:
386 case MD_CPU_ARCHITECTURE_PPC:
387 case MD_CPU_ARCHITECTURE_SHX:
388 case MD_CPU_ARCHITECTURE_ARM:
389 case MD_CPU_ARCHITECTURE_X86_WIN64:
390 // 32-bit architectures, mask the upper bits.
391 return raw_address & 0xffffffffULL;
392
393 default:
394 // All other architectures either have 64-bit pointers or it's impossible
395 // to tell from the minidump (e.g. MSIL or SPARC) so use 64-bits anyway.
396 return raw_address;
397 }
398}
399
digit@chromium.org593eff42013-04-24 10:06:14 +0000400// Extract CPU info string from ARM-specific MDRawSystemInfo structure.
401// raw_info: pointer to source MDRawSystemInfo.
402// cpu_info: address of target string, cpu info text will be appended to it.
403static void GetARMCpuInfo(const MDRawSystemInfo* raw_info,
ivan.penkov@gmail.com8695cc02013-05-11 00:23:41 +0000404 string* cpu_info) {
digit@chromium.org593eff42013-04-24 10:06:14 +0000405 assert(raw_info != NULL && cpu_info != NULL);
406
407 // Write ARM architecture version.
408 char cpu_string[32];
409 snprintf(cpu_string, sizeof(cpu_string), "ARMv%d",
410 raw_info->processor_level);
411 cpu_info->append(cpu_string);
412
413 // There is no good list of implementer id values, but the following
414 // pages provide some help:
415 // http://comments.gmane.org/gmane.linux.linaro.devel/6903
416 // http://forum.xda-developers.com/archive/index.php/t-480226.html
417 const struct {
418 uint32_t id;
419 const char* name;
420 } vendors[] = {
421 { 0x41, "ARM" },
422 { 0x51, "Qualcomm" },
423 { 0x56, "Marvell" },
424 { 0x69, "Intel/Marvell" },
425 };
426 const struct {
427 uint32_t id;
428 const char* name;
429 } parts[] = {
430 { 0x4100c050, "Cortex-A5" },
431 { 0x4100c080, "Cortex-A8" },
432 { 0x4100c090, "Cortex-A9" },
433 { 0x4100c0f0, "Cortex-A15" },
434 { 0x4100c140, "Cortex-R4" },
435 { 0x4100c150, "Cortex-R5" },
436 { 0x4100b360, "ARM1136" },
437 { 0x4100b560, "ARM1156" },
438 { 0x4100b760, "ARM1176" },
439 { 0x4100b020, "ARM11-MPCore" },
440 { 0x41009260, "ARM926" },
441 { 0x41009460, "ARM946" },
442 { 0x41009660, "ARM966" },
443 { 0x510006f0, "Krait" },
444 { 0x510000f0, "Scorpion" },
445 };
446
447 const struct {
448 uint32_t hwcap;
449 const char* name;
450 } features[] = {
451 { MD_CPU_ARM_ELF_HWCAP_SWP, "swp" },
452 { MD_CPU_ARM_ELF_HWCAP_HALF, "half" },
453 { MD_CPU_ARM_ELF_HWCAP_THUMB, "thumb" },
454 { MD_CPU_ARM_ELF_HWCAP_26BIT, "26bit" },
455 { MD_CPU_ARM_ELF_HWCAP_FAST_MULT, "fastmult" },
456 { MD_CPU_ARM_ELF_HWCAP_FPA, "fpa" },
457 { MD_CPU_ARM_ELF_HWCAP_VFP, "vfpv2" },
458 { MD_CPU_ARM_ELF_HWCAP_EDSP, "edsp" },
459 { MD_CPU_ARM_ELF_HWCAP_JAVA, "java" },
460 { MD_CPU_ARM_ELF_HWCAP_IWMMXT, "iwmmxt" },
461 { MD_CPU_ARM_ELF_HWCAP_CRUNCH, "crunch" },
462 { MD_CPU_ARM_ELF_HWCAP_THUMBEE, "thumbee" },
463 { MD_CPU_ARM_ELF_HWCAP_NEON, "neon" },
464 { MD_CPU_ARM_ELF_HWCAP_VFPv3, "vfpv3" },
465 { MD_CPU_ARM_ELF_HWCAP_VFPv3D16, "vfpv3d16" },
466 { MD_CPU_ARM_ELF_HWCAP_TLS, "tls" },
467 { MD_CPU_ARM_ELF_HWCAP_VFPv4, "vfpv4" },
468 { MD_CPU_ARM_ELF_HWCAP_IDIVA, "idiva" },
469 { MD_CPU_ARM_ELF_HWCAP_IDIVT, "idivt" },
470 };
471
472 uint32_t cpuid = raw_info->cpu.arm_cpu_info.cpuid;
473 if (cpuid != 0) {
474 // Extract vendor name from CPUID
475 const char* vendor = NULL;
476 uint32_t vendor_id = (cpuid >> 24) & 0xff;
477 for (size_t i = 0; i < sizeof(vendors)/sizeof(vendors[0]); ++i) {
478 if (vendors[i].id == vendor_id) {
479 vendor = vendors[i].name;
480 break;
481 }
482 }
483 cpu_info->append(" ");
484 if (vendor) {
485 cpu_info->append(vendor);
486 } else {
487 snprintf(cpu_string, sizeof(cpu_string), "vendor(0x%x)", vendor_id);
488 cpu_info->append(cpu_string);
489 }
490
491 // Extract part name from CPUID
492 uint32_t part_id = (cpuid & 0xff00fff0);
493 const char* part = NULL;
494 for (size_t i = 0; i < sizeof(parts)/sizeof(parts[0]); ++i) {
495 if (parts[i].id == part_id) {
496 part = parts[i].name;
497 break;
498 }
499 }
500 cpu_info->append(" ");
501 if (part != NULL) {
502 cpu_info->append(part);
503 } else {
504 snprintf(cpu_string, sizeof(cpu_string), "part(0x%x)", part_id);
505 cpu_info->append(cpu_string);
506 }
507 }
508 uint32_t elf_hwcaps = raw_info->cpu.arm_cpu_info.elf_hwcaps;
509 if (elf_hwcaps != 0) {
510 cpu_info->append(" features: ");
511 const char* comma = "";
512 for (size_t i = 0; i < sizeof(features)/sizeof(features[0]); ++i) {
513 if (elf_hwcaps & features[i].hwcap) {
514 cpu_info->append(comma);
515 cpu_info->append(features[i].name);
516 comma = ",";
517 }
518 }
519 }
520}
521
mmentovaie5468b82006-10-24 19:31:21 +0000522// static
Mike Frysinger09b05692020-06-23 18:55:43 -0400523bool MinidumpProcessor::GetCPUInfo(Minidump* dump, SystemInfo* info) {
mmentovai97d392d2007-01-10 22:47:56 +0000524 assert(dump);
525 assert(info);
526
527 info->cpu.clear();
528 info->cpu_info.clear();
mmentovaie5468b82006-10-24 19:31:21 +0000529
Mike Frysinger09b05692020-06-23 18:55:43 -0400530 MinidumpSystemInfo* system_info;
531 const MDRawSystemInfo* raw_system_info = GetSystemInfo(dump, &system_info);
mmentovaie5468b82006-10-24 19:31:21 +0000532 if (!raw_system_info)
mmentovaiaf3c43f2007-05-17 18:34:37 +0000533 return false;
mmentovaie5468b82006-10-24 19:31:21 +0000534
mmentovaie5468b82006-10-24 19:31:21 +0000535 switch (raw_system_info->processor_architecture) {
ted.mielczarek8eb71112007-10-31 19:20:31 +0000536 case MD_CPU_ARCHITECTURE_X86:
537 case MD_CPU_ARCHITECTURE_AMD64: {
nealsidb56cfa02009-05-29 00:53:02 +0000538 if (raw_system_info->processor_architecture ==
ted.mielczarek8eb71112007-10-31 19:20:31 +0000539 MD_CPU_ARCHITECTURE_X86)
540 info->cpu = "x86";
541 else
542 info->cpu = "amd64";
543
Mike Frysinger09b05692020-06-23 18:55:43 -0400544 const string* cpu_vendor = system_info->GetCPUVendor();
mmentovai97d392d2007-01-10 22:47:56 +0000545 if (cpu_vendor) {
546 info->cpu_info = *cpu_vendor;
547 info->cpu_info.append(" ");
mmentovaie5468b82006-10-24 19:31:21 +0000548 }
mmentovai97d392d2007-01-10 22:47:56 +0000549
550 char x86_info[36];
551 snprintf(x86_info, sizeof(x86_info), "family %u model %u stepping %u",
552 raw_system_info->processor_level,
553 raw_system_info->processor_revision >> 8,
554 raw_system_info->processor_revision & 0xff);
555 info->cpu_info.append(x86_info);
mmentovaie5468b82006-10-24 19:31:21 +0000556 break;
557 }
558
559 case MD_CPU_ARCHITECTURE_PPC: {
mmentovai97d392d2007-01-10 22:47:56 +0000560 info->cpu = "ppc";
mmentovaie5468b82006-10-24 19:31:21 +0000561 break;
562 }
563
thestig@chromium.org0c759c62013-04-12 23:24:02 +0000564 case MD_CPU_ARCHITECTURE_PPC64: {
565 info->cpu = "ppc64";
566 break;
567 }
568
mmentovaiea2bba92007-09-26 18:28:05 +0000569 case MD_CPU_ARCHITECTURE_SPARC: {
570 info->cpu = "sparc";
571 break;
572 }
573
ted.mielczarek9276b0d2009-12-19 21:43:53 +0000574 case MD_CPU_ARCHITECTURE_ARM: {
575 info->cpu = "arm";
digit@chromium.org593eff42013-04-24 10:06:14 +0000576 GetARMCpuInfo(raw_system_info, &info->cpu_info);
ted.mielczarek9276b0d2009-12-19 21:43:53 +0000577 break;
578 }
579
Gabriele Svelto13b234c2019-01-29 23:08:29 +0100580 case MD_CPU_ARCHITECTURE_ARM64:
Joshua Peraza627ef0c2018-07-31 13:30:11 -0700581 case MD_CPU_ARCHITECTURE_ARM64_OLD: {
mark@chromium.orge9165f42013-11-23 01:45:20 +0000582 info->cpu = "arm64";
583 break;
584 }
585
gordana.cmiljanovic@imgtec.comf78839c2013-09-11 11:37:04 +0000586 case MD_CPU_ARCHITECTURE_MIPS: {
587 info->cpu = "mips";
588 break;
589 }
Mike Frysinger76c51742016-02-06 18:58:39 -0500590 case MD_CPU_ARCHITECTURE_MIPS64: {
591 info->cpu = "mips64";
592 break;
593 }
gordana.cmiljanovic@imgtec.comf78839c2013-09-11 11:37:04 +0000594
mmentovaie5468b82006-10-24 19:31:21 +0000595 default: {
596 // Assign the numeric architecture ID into the CPU string.
597 char cpu_string[7];
598 snprintf(cpu_string, sizeof(cpu_string), "0x%04x",
599 raw_system_info->processor_architecture);
mmentovai97d392d2007-01-10 22:47:56 +0000600 info->cpu = cpu_string;
mmentovaie5468b82006-10-24 19:31:21 +0000601 break;
602 }
brynerd5e66382006-09-08 02:35:53 +0000603 }
mmentovaiaf3c43f2007-05-17 18:34:37 +0000604
ted.mielczarek90e050e2007-05-30 12:14:09 +0000605 info->cpu_count = raw_system_info->number_of_processors;
606
mmentovaiaf3c43f2007-05-17 18:34:37 +0000607 return true;
mmentovaie5468b82006-10-24 19:31:21 +0000608}
609
610// static
Mike Frysinger09b05692020-06-23 18:55:43 -0400611bool MinidumpProcessor::GetOSInfo(Minidump* dump, SystemInfo* info) {
mmentovai97d392d2007-01-10 22:47:56 +0000612 assert(dump);
613 assert(info);
614
615 info->os.clear();
616 info->os_short.clear();
617 info->os_version.clear();
mmentovaie5468b82006-10-24 19:31:21 +0000618
Mike Frysinger09b05692020-06-23 18:55:43 -0400619 MinidumpSystemInfo* system_info;
620 const MDRawSystemInfo* raw_system_info = GetSystemInfo(dump, &system_info);
mmentovaie5468b82006-10-24 19:31:21 +0000621 if (!raw_system_info)
mmentovaiaf3c43f2007-05-17 18:34:37 +0000622 return false;
mmentovaie5468b82006-10-24 19:31:21 +0000623
mmentovai97d392d2007-01-10 22:47:56 +0000624 info->os_short = system_info->GetOS();
625
mmentovaie5468b82006-10-24 19:31:21 +0000626 switch (raw_system_info->platform_id) {
627 case MD_OS_WIN32_NT: {
mmentovai97d392d2007-01-10 22:47:56 +0000628 info->os = "Windows NT";
mmentovaie5468b82006-10-24 19:31:21 +0000629 break;
630 }
631
632 case MD_OS_WIN32_WINDOWS: {
mmentovai97d392d2007-01-10 22:47:56 +0000633 info->os = "Windows";
mmentovaie5468b82006-10-24 19:31:21 +0000634 break;
635 }
636
637 case MD_OS_MAC_OS_X: {
mmentovai97d392d2007-01-10 22:47:56 +0000638 info->os = "Mac OS X";
mmentovaie5468b82006-10-24 19:31:21 +0000639 break;
640 }
641
qsr@chromium.orgb9583792011-10-11 14:17:02 +0000642 case MD_OS_IOS: {
643 info->os = "iOS";
644 break;
645 }
646
mmentovaie5468b82006-10-24 19:31:21 +0000647 case MD_OS_LINUX: {
mmentovai97d392d2007-01-10 22:47:56 +0000648 info->os = "Linux";
mmentovaie5468b82006-10-24 19:31:21 +0000649 break;
650 }
651
mmentovaiea2bba92007-09-26 18:28:05 +0000652 case MD_OS_SOLARIS: {
653 info->os = "Solaris";
654 break;
655 }
656
digit@chromium.org8d967072012-07-04 11:56:26 +0000657 case MD_OS_ANDROID: {
658 info->os = "Android";
659 break;
660 }
661
thestig@chromium.org0bdc7142013-04-25 20:36:31 +0000662 case MD_OS_PS3: {
663 info->os = "PS3";
mseaborn@chromium.org85c35262013-05-06 23:33:02 +0000664 break;
665 }
666
667 case MD_OS_NACL: {
668 info->os = "NaCl";
669 break;
thestig@chromium.org0bdc7142013-04-25 20:36:31 +0000670 }
671
Ivan Penkov4a6d7c72019-07-11 18:34:48 -0700672 case MD_OS_FUCHSIA: {
673 info->os = "Fuchsia";
674 break;
675 }
676
mmentovaie5468b82006-10-24 19:31:21 +0000677 default: {
678 // Assign the numeric platform ID into the OS string.
679 char os_string[11];
680 snprintf(os_string, sizeof(os_string), "0x%08x",
681 raw_system_info->platform_id);
mmentovai97d392d2007-01-10 22:47:56 +0000682 info->os = os_string;
mmentovaie5468b82006-10-24 19:31:21 +0000683 break;
684 }
mmentovai960e5272006-09-25 18:29:48 +0000685 }
686
mmentovai97d392d2007-01-10 22:47:56 +0000687 char os_version_string[33];
688 snprintf(os_version_string, sizeof(os_version_string), "%u.%u.%u",
689 raw_system_info->major_version,
690 raw_system_info->minor_version,
691 raw_system_info->build_number);
692 info->os_version = os_version_string;
mmentovaie5468b82006-10-24 19:31:21 +0000693
Mike Frysinger09b05692020-06-23 18:55:43 -0400694 const string* csd_version = system_info->GetCSDVersion();
mmentovai97d392d2007-01-10 22:47:56 +0000695 if (csd_version) {
696 info->os_version.append(" ");
697 info->os_version.append(*csd_version);
mmentovaie5468b82006-10-24 19:31:21 +0000698 }
mmentovaiaf3c43f2007-05-17 18:34:37 +0000699
700 return true;
mmentovaie5468b82006-10-24 19:31:21 +0000701}
702
703// static
ivanpe@chromium.org63919582014-11-25 22:45:23 +0000704bool MinidumpProcessor::GetProcessCreateTime(Minidump* dump,
705 uint32_t* process_create_time) {
706 assert(dump);
707 assert(process_create_time);
708
709 *process_create_time = 0;
710
711 MinidumpMiscInfo* minidump_misc_info = dump->GetMiscInfo();
712 if (!minidump_misc_info) {
713 return false;
714 }
715
716 const MDRawMiscInfo* md_raw_misc_info = minidump_misc_info->misc_info();
717 if (!md_raw_misc_info) {
718 return false;
719 }
720
721 if (!(md_raw_misc_info->flags1 & MD_MISCINFO_FLAGS1_PROCESS_TIMES)) {
722 return false;
723 }
724
725 *process_create_time = md_raw_misc_info->process_create_time;
726 return true;
727}
728
729// static
Mike Frysinger09b05692020-06-23 18:55:43 -0400730string MinidumpProcessor::GetCrashReason(Minidump* dump, uint64_t* address) {
731 MinidumpException* exception = dump->GetException();
mmentovaie5468b82006-10-24 19:31:21 +0000732 if (!exception)
733 return "";
734
Mike Frysinger09b05692020-06-23 18:55:43 -0400735 const MDRawExceptionStream* raw_exception = exception->exception();
mmentovaie5468b82006-10-24 19:31:21 +0000736 if (!raw_exception)
737 return "";
738
739 if (address)
740 *address = raw_exception->exception_record.exception_address;
741
742 // The reason value is OS-specific and possibly CPU-specific. Set up
743 // sensible numeric defaults for the reason string in case we can't
744 // map the codes to a string (because there's no system info, or because
745 // it's an unrecognized platform, or because it's an unrecognized code.)
746 char reason_string[24];
Ivan Penkov4a6d7c72019-07-11 18:34:48 -0700747 char flags_string[11];
ted.mielczarek@gmail.comaeffe102013-03-06 14:04:42 +0000748 uint32_t exception_code = raw_exception->exception_record.exception_code;
749 uint32_t exception_flags = raw_exception->exception_record.exception_flags;
Ivan Penkov4a6d7c72019-07-11 18:34:48 -0700750 snprintf(flags_string, sizeof(flags_string), "0x%08x", exception_flags);
751 snprintf(reason_string, sizeof(reason_string), "0x%08x / %s", exception_code,
752 flags_string);
mmentovaie5468b82006-10-24 19:31:21 +0000753 string reason = reason_string;
754
Mike Frysinger09b05692020-06-23 18:55:43 -0400755 const MDRawSystemInfo* raw_system_info = GetSystemInfo(dump, NULL);
mmentovaie5468b82006-10-24 19:31:21 +0000756 if (!raw_system_info)
757 return reason;
758
mmentovai80e98392006-10-25 21:25:41 +0000759 switch (raw_system_info->platform_id) {
Ivan Penkov4a6d7c72019-07-11 18:34:48 -0700760 case MD_OS_FUCHSIA: {
761 switch (exception_code) {
762 case MD_EXCEPTION_CODE_FUCHSIA_GENERAL:
763 reason = "GENERAL / ";
764 reason.append(flags_string);
765 break;
766 case MD_EXCEPTION_CODE_FUCHSIA_FATAL_PAGE_FAULT:
767 reason = "FATAL_PAGE_FAULT / ";
768 reason.append(flags_string);
769 break;
770 case MD_EXCEPTION_CODE_FUCHSIA_UNDEFINED_INSTRUCTION:
771 reason = "UNDEFINED_INSTRUCTION / ";
772 reason.append(flags_string);
773 break;
774 case MD_EXCEPTION_CODE_FUCHSIA_SW_BREAKPOINT:
775 reason = "SW_BREAKPOINT / ";
776 reason.append(flags_string);
777 break;
778 case MD_EXCEPTION_CODE_FUCHSIA_HW_BREAKPOINT:
779 reason = "HW_BREAKPOINT / ";
780 reason.append(flags_string);
781 break;
782 case MD_EXCEPTION_CODE_FUCHSIA_UNALIGNED_ACCESS:
783 reason = "UNALIGNED_ACCESS / ";
784 reason.append(flags_string);
785 break;
786 case MD_EXCEPTION_CODE_FUCHSIA_THREAD_STARTING:
787 reason = "THREAD_STARTING / ";
788 reason.append(flags_string);
789 break;
790 case MD_EXCEPTION_CODE_FUCHSIA_THREAD_EXITING:
791 reason = "THREAD_EXITING / ";
792 reason.append(flags_string);
793 break;
794 case MD_EXCEPTION_CODE_FUCHSIA_POLICY_ERROR:
795 reason = "POLICY_ERROR / ";
796 reason.append(flags_string);
797 break;
798 case MD_EXCEPTION_CODE_FUCHSIA_PROCESS_STARTING:
799 reason = "PROCESS_STARTING / ";
800 reason.append(flags_string);
801 break;
802 default:
803 BPLOG(INFO) << "Unknown exception reason " << reason;
804 }
805 break;
806 }
807
qsr@chromium.orgb9583792011-10-11 14:17:02 +0000808 case MD_OS_MAC_OS_X:
809 case MD_OS_IOS: {
waylonisdaf42112006-12-06 04:58:27 +0000810 switch (exception_code) {
811 case MD_EXCEPTION_MAC_BAD_ACCESS:
812 reason = "EXC_BAD_ACCESS / ";
813 switch (exception_flags) {
814 case MD_EXCEPTION_CODE_MAC_INVALID_ADDRESS:
815 reason.append("KERN_INVALID_ADDRESS");
816 break;
817 case MD_EXCEPTION_CODE_MAC_PROTECTION_FAILURE:
818 reason.append("KERN_PROTECTION_FAILURE");
819 break;
820 case MD_EXCEPTION_CODE_MAC_NO_ACCESS:
821 reason.append("KERN_NO_ACCESS");
822 break;
823 case MD_EXCEPTION_CODE_MAC_MEMORY_FAILURE:
824 reason.append("KERN_MEMORY_FAILURE");
825 break;
826 case MD_EXCEPTION_CODE_MAC_MEMORY_ERROR:
827 reason.append("KERN_MEMORY_ERROR");
828 break;
Mark Mentovaif6fe7cc2019-11-22 12:51:43 -0500829 case MD_EXCEPTION_CODE_MAC_CODESIGN_ERROR:
830 reason.append("KERN_CODESIGN_ERROR");
831 break;
waylonisdaf42112006-12-06 04:58:27 +0000832 default:
qsr@chromium.org6446cfc2012-09-25 08:30:48 +0000833 // arm and ppc overlap
834 if (raw_system_info->processor_architecture ==
mark@chromium.orge9165f42013-11-23 01:45:20 +0000835 MD_CPU_ARCHITECTURE_ARM ||
836 raw_system_info->processor_architecture ==
Joshua Peraza627ef0c2018-07-31 13:30:11 -0700837 MD_CPU_ARCHITECTURE_ARM64_OLD) {
qsr@chromium.org6446cfc2012-09-25 08:30:48 +0000838 switch (exception_flags) {
839 case MD_EXCEPTION_CODE_MAC_ARM_DA_ALIGN:
840 reason.append("EXC_ARM_DA_ALIGN");
841 break;
842 case MD_EXCEPTION_CODE_MAC_ARM_DA_DEBUG:
843 reason.append("EXC_ARM_DA_DEBUG");
844 break;
845 default:
846 reason.append(flags_string);
847 BPLOG(INFO) << "Unknown exception reason " << reason;
848 break;
849 }
850 } else if (raw_system_info->processor_architecture ==
851 MD_CPU_ARCHITECTURE_PPC) {
852 switch (exception_flags) {
853 case MD_EXCEPTION_CODE_MAC_PPC_VM_PROT_READ:
854 reason.append("EXC_PPC_VM_PROT_READ");
855 break;
856 case MD_EXCEPTION_CODE_MAC_PPC_BADSPACE:
857 reason.append("EXC_PPC_BADSPACE");
858 break;
859 case MD_EXCEPTION_CODE_MAC_PPC_UNALIGNED:
860 reason.append("EXC_PPC_UNALIGNED");
861 break;
862 default:
863 reason.append(flags_string);
864 BPLOG(INFO) << "Unknown exception reason " << reason;
865 break;
866 }
Ted Mielczarekd091e512016-03-29 15:32:47 -0400867 } else if (raw_system_info->processor_architecture ==
868 MD_CPU_ARCHITECTURE_X86 ||
869 raw_system_info->processor_architecture ==
870 MD_CPU_ARCHITECTURE_AMD64) {
871 switch (exception_flags) {
872 case MD_EXCEPTION_CODE_MAC_X86_GENERAL_PROTECTION_FAULT:
873 reason.append("EXC_I386_GPFLT");
874 break;
875 default:
876 reason.append(flags_string);
877 BPLOG(INFO) << "Unknown exception reason " << reason;
878 break;
879 }
qsr@chromium.org6446cfc2012-09-25 08:30:48 +0000880 } else {
881 reason.append(flags_string);
882 BPLOG(INFO) << "Unknown exception reason " << reason;
883 }
waylonisdaf42112006-12-06 04:58:27 +0000884 break;
885 }
886 break;
887 case MD_EXCEPTION_MAC_BAD_INSTRUCTION:
888 reason = "EXC_BAD_INSTRUCTION / ";
889 switch (raw_system_info->processor_architecture) {
mark@chromium.orge9165f42013-11-23 01:45:20 +0000890 case MD_CPU_ARCHITECTURE_ARM:
Joshua Peraza627ef0c2018-07-31 13:30:11 -0700891 case MD_CPU_ARCHITECTURE_ARM64_OLD: {
qsr@chromium.org6446cfc2012-09-25 08:30:48 +0000892 switch (exception_flags) {
893 case MD_EXCEPTION_CODE_MAC_ARM_UNDEFINED:
894 reason.append("EXC_ARM_UNDEFINED");
895 break;
896 default:
897 reason.append(flags_string);
898 BPLOG(INFO) << "Unknown exception reason " << reason;
899 break;
900 }
901 break;
902 }
waylonisdaf42112006-12-06 04:58:27 +0000903 case MD_CPU_ARCHITECTURE_PPC: {
904 switch (exception_flags) {
905 case MD_EXCEPTION_CODE_MAC_PPC_INVALID_SYSCALL:
906 reason.append("EXC_PPC_INVALID_SYSCALL");
907 break;
908 case MD_EXCEPTION_CODE_MAC_PPC_UNIMPLEMENTED_INSTRUCTION:
909 reason.append("EXC_PPC_UNIPL_INST");
910 break;
911 case MD_EXCEPTION_CODE_MAC_PPC_PRIVILEGED_INSTRUCTION:
912 reason.append("EXC_PPC_PRIVINST");
913 break;
914 case MD_EXCEPTION_CODE_MAC_PPC_PRIVILEGED_REGISTER:
915 reason.append("EXC_PPC_PRIVREG");
916 break;
917 case MD_EXCEPTION_CODE_MAC_PPC_TRACE:
918 reason.append("EXC_PPC_TRACE");
919 break;
920 case MD_EXCEPTION_CODE_MAC_PPC_PERFORMANCE_MONITOR:
921 reason.append("EXC_PPC_PERFMON");
922 break;
923 default:
924 reason.append(flags_string);
mmentovaiaf3c43f2007-05-17 18:34:37 +0000925 BPLOG(INFO) << "Unknown exception reason " << reason;
waylonisdaf42112006-12-06 04:58:27 +0000926 break;
927 }
928 break;
929 }
Ted Mielczarekd091e512016-03-29 15:32:47 -0400930 case MD_CPU_ARCHITECTURE_AMD64:
waylonisdaf42112006-12-06 04:58:27 +0000931 case MD_CPU_ARCHITECTURE_X86: {
932 switch (exception_flags) {
933 case MD_EXCEPTION_CODE_MAC_X86_INVALID_OPERATION:
934 reason.append("EXC_I386_INVOP");
935 break;
936 case MD_EXCEPTION_CODE_MAC_X86_INVALID_TASK_STATE_SEGMENT:
Ted Mielczarekd091e512016-03-29 15:32:47 -0400937 reason.append("EXC_I386_INVTSSFLT");
waylonisdaf42112006-12-06 04:58:27 +0000938 break;
939 case MD_EXCEPTION_CODE_MAC_X86_SEGMENT_NOT_PRESENT:
Ted Mielczarekd091e512016-03-29 15:32:47 -0400940 reason.append("EXC_I386_SEGNPFLT");
waylonisdaf42112006-12-06 04:58:27 +0000941 break;
942 case MD_EXCEPTION_CODE_MAC_X86_STACK_FAULT:
Ted Mielczarekd091e512016-03-29 15:32:47 -0400943 reason.append("EXC_I386_STKFLT");
waylonisdaf42112006-12-06 04:58:27 +0000944 break;
945 case MD_EXCEPTION_CODE_MAC_X86_GENERAL_PROTECTION_FAULT:
Ted Mielczarekd091e512016-03-29 15:32:47 -0400946 reason.append("EXC_I386_GPFLT");
waylonisdaf42112006-12-06 04:58:27 +0000947 break;
948 case MD_EXCEPTION_CODE_MAC_X86_ALIGNMENT_FAULT:
Ted Mielczarekd091e512016-03-29 15:32:47 -0400949 reason.append("EXC_I386_ALIGNFLT");
waylonisdaf42112006-12-06 04:58:27 +0000950 break;
951 default:
952 reason.append(flags_string);
mmentovaiaf3c43f2007-05-17 18:34:37 +0000953 BPLOG(INFO) << "Unknown exception reason " << reason;
waylonisdaf42112006-12-06 04:58:27 +0000954 break;
955 }
956 break;
957 }
958 default:
959 reason.append(flags_string);
mmentovaiaf3c43f2007-05-17 18:34:37 +0000960 BPLOG(INFO) << "Unknown exception reason " << reason;
waylonisdaf42112006-12-06 04:58:27 +0000961 break;
962 }
963 break;
964 case MD_EXCEPTION_MAC_ARITHMETIC:
965 reason = "EXC_ARITHMETIC / ";
966 switch (raw_system_info->processor_architecture) {
967 case MD_CPU_ARCHITECTURE_PPC: {
968 switch (exception_flags) {
969 case MD_EXCEPTION_CODE_MAC_PPC_OVERFLOW:
970 reason.append("EXC_PPC_OVERFLOW");
971 break;
972 case MD_EXCEPTION_CODE_MAC_PPC_ZERO_DIVIDE:
973 reason.append("EXC_PPC_ZERO_DIVIDE");
974 break;
975 case MD_EXCEPTION_CODE_MAC_PPC_FLOAT_INEXACT:
976 reason.append("EXC_FLT_INEXACT");
977 break;
978 case MD_EXCEPTION_CODE_MAC_PPC_FLOAT_ZERO_DIVIDE:
979 reason.append("EXC_PPC_FLT_ZERO_DIVIDE");
980 break;
981 case MD_EXCEPTION_CODE_MAC_PPC_FLOAT_UNDERFLOW:
982 reason.append("EXC_PPC_FLT_UNDERFLOW");
983 break;
984 case MD_EXCEPTION_CODE_MAC_PPC_FLOAT_OVERFLOW:
985 reason.append("EXC_PPC_FLT_OVERFLOW");
986 break;
987 case MD_EXCEPTION_CODE_MAC_PPC_FLOAT_NOT_A_NUMBER:
988 reason.append("EXC_PPC_FLT_NOT_A_NUMBER");
989 break;
990 case MD_EXCEPTION_CODE_MAC_PPC_NO_EMULATION:
991 reason.append("EXC_PPC_NOEMULATION");
992 break;
993 case MD_EXCEPTION_CODE_MAC_PPC_ALTIVEC_ASSIST:
994 reason.append("EXC_PPC_ALTIVECASSIST");
Nico Weberfd99ff42018-01-31 11:38:18 -0500995 break;
waylonisdaf42112006-12-06 04:58:27 +0000996 default:
997 reason.append(flags_string);
mmentovaiaf3c43f2007-05-17 18:34:37 +0000998 BPLOG(INFO) << "Unknown exception reason " << reason;
waylonisdaf42112006-12-06 04:58:27 +0000999 break;
1000 }
1001 break;
1002 }
Ted Mielczarekd091e512016-03-29 15:32:47 -04001003 case MD_CPU_ARCHITECTURE_AMD64:
waylonisdaf42112006-12-06 04:58:27 +00001004 case MD_CPU_ARCHITECTURE_X86: {
1005 switch (exception_flags) {
1006 case MD_EXCEPTION_CODE_MAC_X86_DIV:
1007 reason.append("EXC_I386_DIV");
1008 break;
1009 case MD_EXCEPTION_CODE_MAC_X86_INTO:
1010 reason.append("EXC_I386_INTO");
1011 break;
1012 case MD_EXCEPTION_CODE_MAC_X86_NOEXT:
1013 reason.append("EXC_I386_NOEXT");
1014 break;
1015 case MD_EXCEPTION_CODE_MAC_X86_EXTOVR:
1016 reason.append("EXC_I386_EXTOVR");
1017 break;
1018 case MD_EXCEPTION_CODE_MAC_X86_EXTERR:
1019 reason.append("EXC_I386_EXTERR");
1020 break;
1021 case MD_EXCEPTION_CODE_MAC_X86_EMERR:
1022 reason.append("EXC_I386_EMERR");
1023 break;
1024 case MD_EXCEPTION_CODE_MAC_X86_BOUND:
1025 reason.append("EXC_I386_BOUND");
1026 break;
1027 case MD_EXCEPTION_CODE_MAC_X86_SSEEXTERR:
1028 reason.append("EXC_I386_SSEEXTERR");
1029 break;
1030 default:
1031 reason.append(flags_string);
mmentovaiaf3c43f2007-05-17 18:34:37 +00001032 BPLOG(INFO) << "Unknown exception reason " << reason;
waylonisdaf42112006-12-06 04:58:27 +00001033 break;
1034 }
1035 break;
1036 }
1037 default:
1038 reason.append(flags_string);
mmentovaiaf3c43f2007-05-17 18:34:37 +00001039 BPLOG(INFO) << "Unknown exception reason " << reason;
waylonisdaf42112006-12-06 04:58:27 +00001040 break;
1041 }
1042 break;
1043 case MD_EXCEPTION_MAC_EMULATION:
1044 reason = "EXC_EMULATION / ";
1045 reason.append(flags_string);
1046 break;
1047 case MD_EXCEPTION_MAC_SOFTWARE:
1048 reason = "EXC_SOFTWARE / ";
1049 switch (exception_flags) {
qsr@chromium.org1e8d2d52012-03-13 20:02:40 +00001050 case MD_EXCEPTION_CODE_MAC_ABORT:
1051 reason.append("SIGABRT");
1052 break;
1053 case MD_EXCEPTION_CODE_MAC_NS_EXCEPTION:
1054 reason.append("UNCAUGHT_NS_EXCEPTION");
1055 break;
waylonisdaf42112006-12-06 04:58:27 +00001056 // These are ppc only but shouldn't be a problem as they're
1057 // unused on x86
1058 case MD_EXCEPTION_CODE_MAC_PPC_TRAP:
1059 reason.append("EXC_PPC_TRAP");
1060 break;
1061 case MD_EXCEPTION_CODE_MAC_PPC_MIGRATE:
1062 reason.append("EXC_PPC_MIGRATE");
1063 break;
1064 default:
1065 reason.append(flags_string);
mmentovaiaf3c43f2007-05-17 18:34:37 +00001066 BPLOG(INFO) << "Unknown exception reason " << reason;
waylonisdaf42112006-12-06 04:58:27 +00001067 break;
1068 }
1069 break;
1070 case MD_EXCEPTION_MAC_BREAKPOINT:
1071 reason = "EXC_BREAKPOINT / ";
1072 switch (raw_system_info->processor_architecture) {
mark@chromium.orge9165f42013-11-23 01:45:20 +00001073 case MD_CPU_ARCHITECTURE_ARM:
Joshua Peraza627ef0c2018-07-31 13:30:11 -07001074 case MD_CPU_ARCHITECTURE_ARM64_OLD: {
qsr@chromium.org6446cfc2012-09-25 08:30:48 +00001075 switch (exception_flags) {
1076 case MD_EXCEPTION_CODE_MAC_ARM_DA_ALIGN:
1077 reason.append("EXC_ARM_DA_ALIGN");
1078 break;
1079 case MD_EXCEPTION_CODE_MAC_ARM_DA_DEBUG:
1080 reason.append("EXC_ARM_DA_DEBUG");
1081 break;
1082 case MD_EXCEPTION_CODE_MAC_ARM_BREAKPOINT:
1083 reason.append("EXC_ARM_BREAKPOINT");
1084 break;
1085 default:
1086 reason.append(flags_string);
1087 BPLOG(INFO) << "Unknown exception reason " << reason;
1088 break;
1089 }
1090 break;
1091 }
waylonisdaf42112006-12-06 04:58:27 +00001092 case MD_CPU_ARCHITECTURE_PPC: {
1093 switch (exception_flags) {
1094 case MD_EXCEPTION_CODE_MAC_PPC_BREAKPOINT:
1095 reason.append("EXC_PPC_BREAKPOINT");
1096 break;
1097 default:
1098 reason.append(flags_string);
mmentovaiaf3c43f2007-05-17 18:34:37 +00001099 BPLOG(INFO) << "Unknown exception reason " << reason;
waylonisdaf42112006-12-06 04:58:27 +00001100 break;
1101 }
1102 break;
1103 }
Ted Mielczarekd091e512016-03-29 15:32:47 -04001104 case MD_CPU_ARCHITECTURE_AMD64:
waylonisdaf42112006-12-06 04:58:27 +00001105 case MD_CPU_ARCHITECTURE_X86: {
1106 switch (exception_flags) {
1107 case MD_EXCEPTION_CODE_MAC_X86_SGL:
1108 reason.append("EXC_I386_SGL");
1109 break;
1110 case MD_EXCEPTION_CODE_MAC_X86_BPT:
1111 reason.append("EXC_I386_BPT");
1112 break;
1113 default:
1114 reason.append(flags_string);
mmentovaiaf3c43f2007-05-17 18:34:37 +00001115 BPLOG(INFO) << "Unknown exception reason " << reason;
waylonisdaf42112006-12-06 04:58:27 +00001116 break;
1117 }
1118 break;
1119 }
1120 default:
1121 reason.append(flags_string);
mmentovaiaf3c43f2007-05-17 18:34:37 +00001122 BPLOG(INFO) << "Unknown exception reason " << reason;
waylonisdaf42112006-12-06 04:58:27 +00001123 break;
1124 }
1125 break;
1126 case MD_EXCEPTION_MAC_SYSCALL:
1127 reason = "EXC_SYSCALL / ";
1128 reason.append(flags_string);
1129 break;
1130 case MD_EXCEPTION_MAC_MACH_SYSCALL:
1131 reason = "EXC_MACH_SYSCALL / ";
1132 reason.append(flags_string);
1133 break;
1134 case MD_EXCEPTION_MAC_RPC_ALERT:
1135 reason = "EXC_RPC_ALERT / ";
1136 reason.append(flags_string);
1137 break;
Pierre-Antoine Manzagol4eb76cb2016-11-10 09:03:31 -05001138 case MD_EXCEPTION_MAC_SIMULATED:
1139 reason = "Simulated Exception";
1140 break;
waylonisdaf42112006-12-06 04:58:27 +00001141 }
1142 break;
1143 }
1144
mmentovaie5468b82006-10-24 19:31:21 +00001145 case MD_OS_WIN32_NT:
1146 case MD_OS_WIN32_WINDOWS: {
waylonisdaf42112006-12-06 04:58:27 +00001147 switch (exception_code) {
mmentovaie5468b82006-10-24 19:31:21 +00001148 case MD_EXCEPTION_CODE_WIN_CONTROL_C:
1149 reason = "DBG_CONTROL_C";
1150 break;
1151 case MD_EXCEPTION_CODE_WIN_GUARD_PAGE_VIOLATION:
1152 reason = "EXCEPTION_GUARD_PAGE";
1153 break;
1154 case MD_EXCEPTION_CODE_WIN_DATATYPE_MISALIGNMENT:
1155 reason = "EXCEPTION_DATATYPE_MISALIGNMENT";
1156 break;
1157 case MD_EXCEPTION_CODE_WIN_BREAKPOINT:
1158 reason = "EXCEPTION_BREAKPOINT";
1159 break;
1160 case MD_EXCEPTION_CODE_WIN_SINGLE_STEP:
1161 reason = "EXCEPTION_SINGLE_STEP";
1162 break;
1163 case MD_EXCEPTION_CODE_WIN_ACCESS_VIOLATION:
1164 // For EXCEPTION_ACCESS_VIOLATION, Windows puts the address that
1165 // caused the fault in exception_information[1].
1166 // exception_information[0] is 0 if the violation was caused by
mark@chromium.orgcd6f9052015-04-10 22:05:29 +00001167 // an attempt to read data, 1 if it was an attempt to write data,
1168 // and 8 if this was a data execution violation.
mmentovaie5468b82006-10-24 19:31:21 +00001169 // This information is useful in addition to the code address, which
1170 // will be present in the crash thread's instruction field anyway.
nealsid4f182c72010-06-04 16:59:23 +00001171 if (raw_exception->exception_record.number_parameters >= 1) {
cdn@chromium.orgcec12872010-09-22 02:37:19 +00001172 MDAccessViolationTypeWin av_type =
1173 static_cast<MDAccessViolationTypeWin>
1174 (raw_exception->exception_record.exception_information[0]);
1175 switch (av_type) {
1176 case MD_ACCESS_VIOLATION_WIN_READ:
nealsid4f182c72010-06-04 16:59:23 +00001177 reason = "EXCEPTION_ACCESS_VIOLATION_READ";
1178 break;
cdn@chromium.orgcec12872010-09-22 02:37:19 +00001179 case MD_ACCESS_VIOLATION_WIN_WRITE:
nealsid4f182c72010-06-04 16:59:23 +00001180 reason = "EXCEPTION_ACCESS_VIOLATION_WRITE";
1181 break;
cdn@chromium.orgcec12872010-09-22 02:37:19 +00001182 case MD_ACCESS_VIOLATION_WIN_EXEC:
nealsid4f182c72010-06-04 16:59:23 +00001183 reason = "EXCEPTION_ACCESS_VIOLATION_EXEC";
1184 break;
1185 default:
1186 reason = "EXCEPTION_ACCESS_VIOLATION";
1187 break;
1188 }
1189 } else {
1190 reason = "EXCEPTION_ACCESS_VIOLATION";
1191 }
mmentovaie5468b82006-10-24 19:31:21 +00001192 if (address &&
1193 raw_exception->exception_record.number_parameters >= 2) {
1194 *address =
1195 raw_exception->exception_record.exception_information[1];
1196 }
1197 break;
1198 case MD_EXCEPTION_CODE_WIN_IN_PAGE_ERROR:
mark@chromium.orgcd6f9052015-04-10 22:05:29 +00001199 // For EXCEPTION_IN_PAGE_ERROR, Windows puts the address that
1200 // caused the fault in exception_information[1].
1201 // exception_information[0] is 0 if the violation was caused by
1202 // an attempt to read data, 1 if it was an attempt to write data,
1203 // and 8 if this was a data execution violation.
1204 // exception_information[2] contains the underlying NTSTATUS code,
1205 // which is the explanation for why this error occured.
1206 // This information is useful in addition to the code address, which
1207 // will be present in the crash thread's instruction field anyway.
1208 if (raw_exception->exception_record.number_parameters >= 1) {
1209 MDInPageErrorTypeWin av_type =
1210 static_cast<MDInPageErrorTypeWin>
1211 (raw_exception->exception_record.exception_information[0]);
1212 switch (av_type) {
1213 case MD_IN_PAGE_ERROR_WIN_READ:
1214 reason = "EXCEPTION_IN_PAGE_ERROR_READ";
1215 break;
1216 case MD_IN_PAGE_ERROR_WIN_WRITE:
1217 reason = "EXCEPTION_IN_PAGE_ERROR_WRITE";
1218 break;
1219 case MD_IN_PAGE_ERROR_WIN_EXEC:
1220 reason = "EXCEPTION_IN_PAGE_ERROR_EXEC";
1221 break;
1222 default:
1223 reason = "EXCEPTION_IN_PAGE_ERROR";
1224 break;
1225 }
1226 } else {
1227 reason = "EXCEPTION_IN_PAGE_ERROR";
1228 }
1229 if (address &&
1230 raw_exception->exception_record.number_parameters >= 2) {
1231 *address =
1232 raw_exception->exception_record.exception_information[1];
1233 }
1234 if (raw_exception->exception_record.number_parameters >= 3) {
1235 uint32_t ntstatus =
1236 static_cast<uint32_t>
1237 (raw_exception->exception_record.exception_information[2]);
1238 reason.append(" / ");
1239 reason.append(NTStatusToString(ntstatus));
1240 }
mmentovaie5468b82006-10-24 19:31:21 +00001241 break;
1242 case MD_EXCEPTION_CODE_WIN_INVALID_HANDLE:
1243 reason = "EXCEPTION_INVALID_HANDLE";
1244 break;
1245 case MD_EXCEPTION_CODE_WIN_ILLEGAL_INSTRUCTION:
1246 reason = "EXCEPTION_ILLEGAL_INSTRUCTION";
1247 break;
1248 case MD_EXCEPTION_CODE_WIN_NONCONTINUABLE_EXCEPTION:
1249 reason = "EXCEPTION_NONCONTINUABLE_EXCEPTION";
1250 break;
1251 case MD_EXCEPTION_CODE_WIN_INVALID_DISPOSITION:
1252 reason = "EXCEPTION_INVALID_DISPOSITION";
1253 break;
1254 case MD_EXCEPTION_CODE_WIN_ARRAY_BOUNDS_EXCEEDED:
1255 reason = "EXCEPTION_BOUNDS_EXCEEDED";
1256 break;
1257 case MD_EXCEPTION_CODE_WIN_FLOAT_DENORMAL_OPERAND:
1258 reason = "EXCEPTION_FLT_DENORMAL_OPERAND";
1259 break;
1260 case MD_EXCEPTION_CODE_WIN_FLOAT_DIVIDE_BY_ZERO:
1261 reason = "EXCEPTION_FLT_DIVIDE_BY_ZERO";
1262 break;
1263 case MD_EXCEPTION_CODE_WIN_FLOAT_INEXACT_RESULT:
1264 reason = "EXCEPTION_FLT_INEXACT_RESULT";
1265 break;
1266 case MD_EXCEPTION_CODE_WIN_FLOAT_INVALID_OPERATION:
1267 reason = "EXCEPTION_FLT_INVALID_OPERATION";
1268 break;
1269 case MD_EXCEPTION_CODE_WIN_FLOAT_OVERFLOW:
1270 reason = "EXCEPTION_FLT_OVERFLOW";
1271 break;
1272 case MD_EXCEPTION_CODE_WIN_FLOAT_STACK_CHECK:
1273 reason = "EXCEPTION_FLT_STACK_CHECK";
1274 break;
1275 case MD_EXCEPTION_CODE_WIN_FLOAT_UNDERFLOW:
1276 reason = "EXCEPTION_FLT_UNDERFLOW";
1277 break;
1278 case MD_EXCEPTION_CODE_WIN_INTEGER_DIVIDE_BY_ZERO:
1279 reason = "EXCEPTION_INT_DIVIDE_BY_ZERO";
1280 break;
1281 case MD_EXCEPTION_CODE_WIN_INTEGER_OVERFLOW:
1282 reason = "EXCEPTION_INT_OVERFLOW";
1283 break;
1284 case MD_EXCEPTION_CODE_WIN_PRIVILEGED_INSTRUCTION:
1285 reason = "EXCEPTION_PRIV_INSTRUCTION";
1286 break;
1287 case MD_EXCEPTION_CODE_WIN_STACK_OVERFLOW:
1288 reason = "EXCEPTION_STACK_OVERFLOW";
1289 break;
Mike Wittman325120e2016-10-27 12:07:01 -07001290 case MD_EXCEPTION_CODE_WIN_BAD_FUNCTION_TABLE:
1291 reason = "EXCEPTION_BAD_FUNCTION_TABLE";
1292 break;
mmentovaie5468b82006-10-24 19:31:21 +00001293 case MD_EXCEPTION_CODE_WIN_POSSIBLE_DEADLOCK:
1294 reason = "EXCEPTION_POSSIBLE_DEADLOCK";
1295 break;
nealsid4f182c72010-06-04 16:59:23 +00001296 case MD_EXCEPTION_CODE_WIN_STACK_BUFFER_OVERRUN:
1297 reason = "EXCEPTION_STACK_BUFFER_OVERRUN";
1298 break;
1299 case MD_EXCEPTION_CODE_WIN_HEAP_CORRUPTION:
1300 reason = "EXCEPTION_HEAP_CORRUPTION";
1301 break;
Will Harrisc99d3742016-07-19 14:41:53 -07001302 case MD_EXCEPTION_OUT_OF_MEMORY:
1303 reason = "Out of Memory";
1304 break;
ted.mielczarekb2bc3bc2009-09-04 20:00:33 +00001305 case MD_EXCEPTION_CODE_WIN_UNHANDLED_CPP_EXCEPTION:
cdn@chromium.orgcec12872010-09-22 02:37:19 +00001306 reason = "Unhandled C++ Exception";
1307 break;
Pierre-Antoine Manzagol4eb76cb2016-11-10 09:03:31 -05001308 case MD_EXCEPTION_CODE_WIN_SIMULATED:
1309 reason = "Simulated Exception";
1310 break;
mmentovaiaf3c43f2007-05-17 18:34:37 +00001311 default:
1312 BPLOG(INFO) << "Unknown exception reason " << reason;
1313 break;
mmentovaie5468b82006-10-24 19:31:21 +00001314 }
mmentovaiaf3c43f2007-05-17 18:34:37 +00001315 break;
mmentovai278946c2007-09-26 18:13:38 +00001316 }
ted.mielczarekb5c78cc2007-06-11 17:03:30 +00001317
digit@chromium.org8d967072012-07-04 11:56:26 +00001318 case MD_OS_ANDROID:
mmentovai278946c2007-09-26 18:13:38 +00001319 case MD_OS_LINUX: {
ted.mielczarekb5c78cc2007-06-11 17:03:30 +00001320 switch (exception_code) {
1321 case MD_EXCEPTION_CODE_LIN_SIGHUP:
1322 reason = "SIGHUP";
1323 break;
1324 case MD_EXCEPTION_CODE_LIN_SIGINT:
1325 reason = "SIGINT";
1326 break;
1327 case MD_EXCEPTION_CODE_LIN_SIGQUIT:
1328 reason = "SIGQUIT";
1329 break;
1330 case MD_EXCEPTION_CODE_LIN_SIGILL:
Lei Zhang9eac2052018-04-13 11:15:11 -07001331 reason = "SIGILL / ";
1332 switch (exception_flags) {
1333 case MD_EXCEPTION_FLAG_LIN_ILL_ILLOPC:
1334 reason.append("ILL_ILLOPC");
1335 break;
1336 case MD_EXCEPTION_FLAG_LIN_ILL_ILLOPN:
1337 reason.append("ILL_ILLOPN");
1338 break;
1339 case MD_EXCEPTION_FLAG_LIN_ILL_ILLADR:
1340 reason.append("ILL_ILLADR");
1341 break;
1342 case MD_EXCEPTION_FLAG_LIN_ILL_ILLTRP:
1343 reason.append("ILL_ILLTRP");
1344 break;
1345 case MD_EXCEPTION_FLAG_LIN_ILL_PRVOPC:
1346 reason.append("ILL_PRVOPC");
1347 break;
1348 case MD_EXCEPTION_FLAG_LIN_ILL_PRVREG:
1349 reason.append("ILL_PRVREG");
1350 break;
1351 case MD_EXCEPTION_FLAG_LIN_ILL_COPROC:
1352 reason.append("ILL_COPROC");
1353 break;
1354 case MD_EXCEPTION_FLAG_LIN_ILL_BADSTK:
1355 reason.append("ILL_BADSTK");
1356 break;
1357 default:
1358 reason.append(flags_string);
1359 BPLOG(INFO) << "Unknown exception reason " << reason;
1360 break;
1361 }
ted.mielczarekb5c78cc2007-06-11 17:03:30 +00001362 break;
1363 case MD_EXCEPTION_CODE_LIN_SIGTRAP:
1364 reason = "SIGTRAP";
1365 break;
1366 case MD_EXCEPTION_CODE_LIN_SIGABRT:
1367 reason = "SIGABRT";
1368 break;
1369 case MD_EXCEPTION_CODE_LIN_SIGBUS:
Lei Zhang9eac2052018-04-13 11:15:11 -07001370 reason = "SIGBUS / ";
1371 switch (exception_flags) {
1372 case MD_EXCEPTION_FLAG_LIN_BUS_ADRALN:
Mike Frysingerf0d43bc2019-08-03 12:02:00 -04001373 reason.append("BUS_ADRALN");
Lei Zhang9eac2052018-04-13 11:15:11 -07001374 break;
1375 case MD_EXCEPTION_FLAG_LIN_BUS_ADRERR:
1376 reason.append("BUS_ADRERR");
1377 break;
1378 case MD_EXCEPTION_FLAG_LIN_BUS_OBJERR:
1379 reason.append("BUS_OBJERR");
1380 break;
1381 case MD_EXCEPTION_FLAG_LIN_BUS_MCEERR_AR:
1382 reason.append("BUS_MCEERR_AR");
1383 break;
1384 case MD_EXCEPTION_FLAG_LIN_BUS_MCEERR_AO:
1385 reason.append("BUS_MCEERR_AO");
1386 break;
1387 default:
1388 reason.append(flags_string);
1389 BPLOG(INFO) << "Unknown exception reason " << reason;
1390 break;
1391 }
ted.mielczarekb5c78cc2007-06-11 17:03:30 +00001392 break;
1393 case MD_EXCEPTION_CODE_LIN_SIGFPE:
Lei Zhang9eac2052018-04-13 11:15:11 -07001394 reason = "SIGFPE / ";
1395 switch (exception_flags) {
1396 case MD_EXCEPTION_FLAG_LIN_FPE_INTDIV:
1397 reason.append("FPE_INTDIV");
1398 break;
1399 case MD_EXCEPTION_FLAG_LIN_FPE_INTOVF:
1400 reason.append("FPE_INTOVF");
1401 break;
1402 case MD_EXCEPTION_FLAG_LIN_FPE_FLTDIV:
1403 reason.append("FPE_FLTDIV");
1404 break;
1405 case MD_EXCEPTION_FLAG_LIN_FPE_FLTOVF:
1406 reason.append("FPE_FLTOVF");
1407 break;
1408 case MD_EXCEPTION_FLAG_LIN_FPE_FLTUND:
1409 reason.append("FPE_FLTUND");
1410 break;
1411 case MD_EXCEPTION_FLAG_LIN_FPE_FLTRES:
1412 reason.append("FPE_FLTRES");
1413 break;
1414 case MD_EXCEPTION_FLAG_LIN_FPE_FLTINV:
1415 reason.append("FPE_FLTINV");
1416 break;
1417 case MD_EXCEPTION_FLAG_LIN_FPE_FLTSUB:
1418 reason.append("FPE_FLTSUB");
1419 break;
1420 default:
1421 reason.append(flags_string);
1422 BPLOG(INFO) << "Unknown exception reason " << reason;
1423 break;
1424 }
ted.mielczarekb5c78cc2007-06-11 17:03:30 +00001425 break;
1426 case MD_EXCEPTION_CODE_LIN_SIGKILL:
1427 reason = "SIGKILL";
1428 break;
1429 case MD_EXCEPTION_CODE_LIN_SIGUSR1:
1430 reason = "SIGUSR1";
1431 break;
1432 case MD_EXCEPTION_CODE_LIN_SIGSEGV:
Lei Zhang9eac2052018-04-13 11:15:11 -07001433 reason = "SIGSEGV /";
1434 switch (exception_flags) {
1435 case MD_EXCEPTION_FLAG_LIN_SEGV_MAPERR:
1436 reason.append("SEGV_MAPERR");
1437 break;
1438 case MD_EXCEPTION_FLAG_LIN_SEGV_ACCERR:
1439 reason.append("SEGV_ACCERR");
1440 break;
1441 case MD_EXCEPTION_FLAG_LIN_SEGV_BNDERR:
1442 reason.append("SEGV_BNDERR");
1443 break;
1444 case MD_EXCEPTION_FLAG_LIN_SEGV_PKUERR:
1445 reason.append("SEGV_PKUERR");
1446 break;
1447 default:
1448 reason.append(flags_string);
1449 BPLOG(INFO) << "Unknown exception reason " << reason;
1450 break;
1451 }
ted.mielczarekb5c78cc2007-06-11 17:03:30 +00001452 break;
1453 case MD_EXCEPTION_CODE_LIN_SIGUSR2:
1454 reason = "SIGUSR2";
1455 break;
1456 case MD_EXCEPTION_CODE_LIN_SIGPIPE:
1457 reason = "SIGPIPE";
1458 break;
1459 case MD_EXCEPTION_CODE_LIN_SIGALRM:
1460 reason = "SIGALRM";
1461 break;
1462 case MD_EXCEPTION_CODE_LIN_SIGTERM:
1463 reason = "SIGTERM";
1464 break;
1465 case MD_EXCEPTION_CODE_LIN_SIGSTKFLT:
1466 reason = "SIGSTKFLT";
1467 break;
1468 case MD_EXCEPTION_CODE_LIN_SIGCHLD:
1469 reason = "SIGCHLD";
1470 break;
1471 case MD_EXCEPTION_CODE_LIN_SIGCONT:
1472 reason = "SIGCONT";
1473 break;
1474 case MD_EXCEPTION_CODE_LIN_SIGSTOP:
1475 reason = "SIGSTOP";
1476 break;
1477 case MD_EXCEPTION_CODE_LIN_SIGTSTP:
1478 reason = "SIGTSTP";
1479 break;
1480 case MD_EXCEPTION_CODE_LIN_SIGTTIN:
1481 reason = "SIGTTIN";
1482 break;
1483 case MD_EXCEPTION_CODE_LIN_SIGTTOU:
1484 reason = "SIGTTOU";
1485 break;
1486 case MD_EXCEPTION_CODE_LIN_SIGURG:
1487 reason = "SIGURG";
1488 break;
1489 case MD_EXCEPTION_CODE_LIN_SIGXCPU:
1490 reason = "SIGXCPU";
1491 break;
1492 case MD_EXCEPTION_CODE_LIN_SIGXFSZ:
1493 reason = "SIGXFSZ";
1494 break;
1495 case MD_EXCEPTION_CODE_LIN_SIGVTALRM:
1496 reason = "SIGVTALRM";
1497 break;
1498 case MD_EXCEPTION_CODE_LIN_SIGPROF:
1499 reason = "SIGPROF";
1500 break;
1501 case MD_EXCEPTION_CODE_LIN_SIGWINCH:
1502 reason = "SIGWINCH";
1503 break;
1504 case MD_EXCEPTION_CODE_LIN_SIGIO:
1505 reason = "SIGIO";
1506 break;
1507 case MD_EXCEPTION_CODE_LIN_SIGPWR:
1508 reason = "SIGPWR";
1509 break;
1510 case MD_EXCEPTION_CODE_LIN_SIGSYS:
1511 reason = "SIGSYS";
1512 break;
ted.mielczarek@gmail.com67364c12012-09-18 18:51:56 +00001513 case MD_EXCEPTION_CODE_LIN_DUMP_REQUESTED:
1514 reason = "DUMP_REQUESTED";
1515 break;
ted.mielczarekb5c78cc2007-06-11 17:03:30 +00001516 default:
1517 BPLOG(INFO) << "Unknown exception reason " << reason;
1518 break;
1519 }
1520 break;
mmentovaiaf3c43f2007-05-17 18:34:37 +00001521 }
1522
mmentovaiea2bba92007-09-26 18:28:05 +00001523 case MD_OS_SOLARIS: {
1524 switch (exception_code) {
1525 case MD_EXCEPTION_CODE_SOL_SIGHUP:
1526 reason = "SIGHUP";
1527 break;
1528 case MD_EXCEPTION_CODE_SOL_SIGINT:
1529 reason = "SIGINT";
1530 break;
1531 case MD_EXCEPTION_CODE_SOL_SIGQUIT:
1532 reason = "SIGQUIT";
nealsidb56cfa02009-05-29 00:53:02 +00001533 break;
mmentovaiea2bba92007-09-26 18:28:05 +00001534 case MD_EXCEPTION_CODE_SOL_SIGILL:
1535 reason = "SIGILL";
nealsidb56cfa02009-05-29 00:53:02 +00001536 break;
mmentovaiea2bba92007-09-26 18:28:05 +00001537 case MD_EXCEPTION_CODE_SOL_SIGTRAP:
1538 reason = "SIGTRAP";
nealsidb56cfa02009-05-29 00:53:02 +00001539 break;
mmentovaiea2bba92007-09-26 18:28:05 +00001540 case MD_EXCEPTION_CODE_SOL_SIGIOT:
1541 reason = "SIGIOT | SIGABRT";
nealsidb56cfa02009-05-29 00:53:02 +00001542 break;
mmentovaiea2bba92007-09-26 18:28:05 +00001543 case MD_EXCEPTION_CODE_SOL_SIGEMT:
1544 reason = "SIGEMT";
nealsidb56cfa02009-05-29 00:53:02 +00001545 break;
mmentovaiea2bba92007-09-26 18:28:05 +00001546 case MD_EXCEPTION_CODE_SOL_SIGFPE:
1547 reason = "SIGFPE";
nealsidb56cfa02009-05-29 00:53:02 +00001548 break;
mmentovaiea2bba92007-09-26 18:28:05 +00001549 case MD_EXCEPTION_CODE_SOL_SIGKILL:
1550 reason = "SIGKILL";
nealsidb56cfa02009-05-29 00:53:02 +00001551 break;
mmentovaiea2bba92007-09-26 18:28:05 +00001552 case MD_EXCEPTION_CODE_SOL_SIGBUS:
1553 reason = "SIGBUS";
nealsidb56cfa02009-05-29 00:53:02 +00001554 break;
mmentovaiea2bba92007-09-26 18:28:05 +00001555 case MD_EXCEPTION_CODE_SOL_SIGSEGV:
1556 reason = "SIGSEGV";
nealsidb56cfa02009-05-29 00:53:02 +00001557 break;
mmentovaiea2bba92007-09-26 18:28:05 +00001558 case MD_EXCEPTION_CODE_SOL_SIGSYS:
1559 reason = "SIGSYS";
nealsidb56cfa02009-05-29 00:53:02 +00001560 break;
mmentovaiea2bba92007-09-26 18:28:05 +00001561 case MD_EXCEPTION_CODE_SOL_SIGPIPE:
1562 reason = "SIGPIPE";
nealsidb56cfa02009-05-29 00:53:02 +00001563 break;
mmentovaiea2bba92007-09-26 18:28:05 +00001564 case MD_EXCEPTION_CODE_SOL_SIGALRM:
1565 reason = "SIGALRM";
nealsidb56cfa02009-05-29 00:53:02 +00001566 break;
mmentovaiea2bba92007-09-26 18:28:05 +00001567 case MD_EXCEPTION_CODE_SOL_SIGTERM:
1568 reason = "SIGTERM";
nealsidb56cfa02009-05-29 00:53:02 +00001569 break;
mmentovaiea2bba92007-09-26 18:28:05 +00001570 case MD_EXCEPTION_CODE_SOL_SIGUSR1:
1571 reason = "SIGUSR1";
nealsidb56cfa02009-05-29 00:53:02 +00001572 break;
mmentovaiea2bba92007-09-26 18:28:05 +00001573 case MD_EXCEPTION_CODE_SOL_SIGUSR2:
1574 reason = "SIGUSR2";
nealsidb56cfa02009-05-29 00:53:02 +00001575 break;
mmentovaiea2bba92007-09-26 18:28:05 +00001576 case MD_EXCEPTION_CODE_SOL_SIGCLD:
1577 reason = "SIGCLD | SIGCHLD";
nealsidb56cfa02009-05-29 00:53:02 +00001578 break;
mmentovaiea2bba92007-09-26 18:28:05 +00001579 case MD_EXCEPTION_CODE_SOL_SIGPWR:
1580 reason = "SIGPWR";
nealsidb56cfa02009-05-29 00:53:02 +00001581 break;
mmentovaiea2bba92007-09-26 18:28:05 +00001582 case MD_EXCEPTION_CODE_SOL_SIGWINCH:
1583 reason = "SIGWINCH";
nealsidb56cfa02009-05-29 00:53:02 +00001584 break;
mmentovaiea2bba92007-09-26 18:28:05 +00001585 case MD_EXCEPTION_CODE_SOL_SIGURG:
1586 reason = "SIGURG";
nealsidb56cfa02009-05-29 00:53:02 +00001587 break;
mmentovaiea2bba92007-09-26 18:28:05 +00001588 case MD_EXCEPTION_CODE_SOL_SIGPOLL:
1589 reason = "SIGPOLL | SIGIO";
nealsidb56cfa02009-05-29 00:53:02 +00001590 break;
mmentovaiea2bba92007-09-26 18:28:05 +00001591 case MD_EXCEPTION_CODE_SOL_SIGSTOP:
1592 reason = "SIGSTOP";
nealsidb56cfa02009-05-29 00:53:02 +00001593 break;
mmentovaiea2bba92007-09-26 18:28:05 +00001594 case MD_EXCEPTION_CODE_SOL_SIGTSTP:
1595 reason = "SIGTSTP";
nealsidb56cfa02009-05-29 00:53:02 +00001596 break;
mmentovaiea2bba92007-09-26 18:28:05 +00001597 case MD_EXCEPTION_CODE_SOL_SIGCONT:
1598 reason = "SIGCONT";
nealsidb56cfa02009-05-29 00:53:02 +00001599 break;
mmentovaiea2bba92007-09-26 18:28:05 +00001600 case MD_EXCEPTION_CODE_SOL_SIGTTIN:
1601 reason = "SIGTTIN";
nealsidb56cfa02009-05-29 00:53:02 +00001602 break;
mmentovaiea2bba92007-09-26 18:28:05 +00001603 case MD_EXCEPTION_CODE_SOL_SIGTTOU:
1604 reason = "SIGTTOU";
nealsidb56cfa02009-05-29 00:53:02 +00001605 break;
mmentovaiea2bba92007-09-26 18:28:05 +00001606 case MD_EXCEPTION_CODE_SOL_SIGVTALRM:
1607 reason = "SIGVTALRM";
nealsidb56cfa02009-05-29 00:53:02 +00001608 break;
mmentovaiea2bba92007-09-26 18:28:05 +00001609 case MD_EXCEPTION_CODE_SOL_SIGPROF:
1610 reason = "SIGPROF";
nealsidb56cfa02009-05-29 00:53:02 +00001611 break;
mmentovaiea2bba92007-09-26 18:28:05 +00001612 case MD_EXCEPTION_CODE_SOL_SIGXCPU:
1613 reason = "SIGXCPU";
nealsidb56cfa02009-05-29 00:53:02 +00001614 break;
mmentovaiea2bba92007-09-26 18:28:05 +00001615 case MD_EXCEPTION_CODE_SOL_SIGXFSZ:
1616 reason = "SIGXFSZ";
nealsidb56cfa02009-05-29 00:53:02 +00001617 break;
mmentovaiea2bba92007-09-26 18:28:05 +00001618 case MD_EXCEPTION_CODE_SOL_SIGWAITING:
1619 reason = "SIGWAITING";
nealsidb56cfa02009-05-29 00:53:02 +00001620 break;
mmentovaiea2bba92007-09-26 18:28:05 +00001621 case MD_EXCEPTION_CODE_SOL_SIGLWP:
1622 reason = "SIGLWP";
nealsidb56cfa02009-05-29 00:53:02 +00001623 break;
mmentovaiea2bba92007-09-26 18:28:05 +00001624 case MD_EXCEPTION_CODE_SOL_SIGFREEZE:
1625 reason = "SIGFREEZE";
nealsidb56cfa02009-05-29 00:53:02 +00001626 break;
mmentovaiea2bba92007-09-26 18:28:05 +00001627 case MD_EXCEPTION_CODE_SOL_SIGTHAW:
1628 reason = "SIGTHAW";
nealsidb56cfa02009-05-29 00:53:02 +00001629 break;
mmentovaiea2bba92007-09-26 18:28:05 +00001630 case MD_EXCEPTION_CODE_SOL_SIGCANCEL:
1631 reason = "SIGCANCEL";
nealsidb56cfa02009-05-29 00:53:02 +00001632 break;
mmentovaiea2bba92007-09-26 18:28:05 +00001633 case MD_EXCEPTION_CODE_SOL_SIGLOST:
1634 reason = "SIGLOST";
nealsidb56cfa02009-05-29 00:53:02 +00001635 break;
mmentovaiea2bba92007-09-26 18:28:05 +00001636 case MD_EXCEPTION_CODE_SOL_SIGXRES:
1637 reason = "SIGXRES";
nealsidb56cfa02009-05-29 00:53:02 +00001638 break;
mmentovaiea2bba92007-09-26 18:28:05 +00001639 case MD_EXCEPTION_CODE_SOL_SIGJVM1:
1640 reason = "SIGJVM1";
nealsidb56cfa02009-05-29 00:53:02 +00001641 break;
mmentovaiea2bba92007-09-26 18:28:05 +00001642 case MD_EXCEPTION_CODE_SOL_SIGJVM2:
1643 reason = "SIGJVM2";
nealsidb56cfa02009-05-29 00:53:02 +00001644 break;
mmentovaiea2bba92007-09-26 18:28:05 +00001645 default:
1646 BPLOG(INFO) << "Unknown exception reason " << reason;
1647 break;
1648 }
1649 break;
1650 }
1651
thestig@chromium.org0bdc7142013-04-25 20:36:31 +00001652 case MD_OS_PS3: {
1653 switch (exception_code) {
1654 case MD_EXCEPTION_CODE_PS3_UNKNOWN:
1655 reason = "UNKNOWN";
1656 break;
1657 case MD_EXCEPTION_CODE_PS3_TRAP_EXCEP:
1658 reason = "TRAP_EXCEP";
1659 break;
1660 case MD_EXCEPTION_CODE_PS3_PRIV_INSTR:
1661 reason = "PRIV_INSTR";
1662 break;
1663 case MD_EXCEPTION_CODE_PS3_ILLEGAL_INSTR:
1664 reason = "ILLEGAL_INSTR";
1665 break;
1666 case MD_EXCEPTION_CODE_PS3_INSTR_STORAGE:
1667 reason = "INSTR_STORAGE";
1668 break;
1669 case MD_EXCEPTION_CODE_PS3_INSTR_SEGMENT:
1670 reason = "INSTR_SEGMENT";
1671 break;
1672 case MD_EXCEPTION_CODE_PS3_DATA_STORAGE:
1673 reason = "DATA_STORAGE";
1674 break;
1675 case MD_EXCEPTION_CODE_PS3_DATA_SEGMENT:
1676 reason = "DATA_SEGMENT";
1677 break;
1678 case MD_EXCEPTION_CODE_PS3_FLOAT_POINT:
1679 reason = "FLOAT_POINT";
1680 break;
1681 case MD_EXCEPTION_CODE_PS3_DABR_MATCH:
1682 reason = "DABR_MATCH";
1683 break;
1684 case MD_EXCEPTION_CODE_PS3_ALIGN_EXCEP:
1685 reason = "ALIGN_EXCEP";
1686 break;
1687 case MD_EXCEPTION_CODE_PS3_MEMORY_ACCESS:
1688 reason = "MEMORY_ACCESS";
1689 break;
1690 case MD_EXCEPTION_CODE_PS3_COPRO_ALIGN:
1691 reason = "COPRO_ALIGN";
1692 break;
1693 case MD_EXCEPTION_CODE_PS3_COPRO_INVALID_COM:
1694 reason = "COPRO_INVALID_COM";
1695 break;
1696 case MD_EXCEPTION_CODE_PS3_COPRO_ERR:
1697 reason = "COPRO_ERR";
1698 break;
1699 case MD_EXCEPTION_CODE_PS3_COPRO_FIR:
1700 reason = "COPRO_FIR";
1701 break;
1702 case MD_EXCEPTION_CODE_PS3_COPRO_DATA_SEGMENT:
1703 reason = "COPRO_DATA_SEGMENT";
1704 break;
1705 case MD_EXCEPTION_CODE_PS3_COPRO_DATA_STORAGE:
1706 reason = "COPRO_DATA_STORAGE";
1707 break;
1708 case MD_EXCEPTION_CODE_PS3_COPRO_STOP_INSTR:
1709 reason = "COPRO_STOP_INSTR";
1710 break;
1711 case MD_EXCEPTION_CODE_PS3_COPRO_HALT_INSTR:
1712 reason = "COPRO_HALT_INSTR";
1713 break;
1714 case MD_EXCEPTION_CODE_PS3_COPRO_HALTINST_UNKNOWN:
1715 reason = "COPRO_HALTINSTR_UNKNOWN";
1716 break;
1717 case MD_EXCEPTION_CODE_PS3_COPRO_MEMORY_ACCESS:
1718 reason = "COPRO_MEMORY_ACCESS";
1719 break;
1720 case MD_EXCEPTION_CODE_PS3_GRAPHIC:
1721 reason = "GRAPHIC";
1722 break;
1723 default:
1724 BPLOG(INFO) << "Unknown exception reason "<< reason;
1725 break;
1726 }
1727 break;
1728 }
1729
mmentovaiaf3c43f2007-05-17 18:34:37 +00001730 default: {
1731 BPLOG(INFO) << "Unknown exception reason " << reason;
1732 break;
mmentovaie5468b82006-10-24 19:31:21 +00001733 }
1734 }
1735
Gabriele Svelto44384d82019-01-30 09:26:07 +01001736 if (address) {
1737 *address = GetAddressForArchitecture(
1738 static_cast<MDCPUArchitecture>(raw_system_info->processor_architecture),
1739 *address);
1740 }
1741
mmentovaie5468b82006-10-24 19:31:21 +00001742 return reason;
brynerd5e66382006-09-08 02:35:53 +00001743}
1744
ted.mielczarek0314e482009-12-02 17:43:57 +00001745// static
Mike Frysinger09b05692020-06-23 18:55:43 -04001746string MinidumpProcessor::GetAssertion(Minidump* dump) {
1747 MinidumpAssertion* assertion = dump->GetAssertion();
ted.mielczarek0314e482009-12-02 17:43:57 +00001748 if (!assertion)
1749 return "";
1750
Mike Frysinger09b05692020-06-23 18:55:43 -04001751 const MDRawAssertionInfo* raw_assertion = assertion->assertion();
ted.mielczarek0314e482009-12-02 17:43:57 +00001752 if (!raw_assertion)
1753 return "";
1754
1755 string assertion_string;
1756 switch (raw_assertion->type) {
1757 case MD_ASSERTION_INFO_TYPE_INVALID_PARAMETER:
1758 assertion_string = "Invalid parameter passed to library function";
1759 break;
1760 case MD_ASSERTION_INFO_TYPE_PURE_VIRTUAL_CALL:
1761 assertion_string = "Pure virtual function called";
1762 break;
1763 default: {
1764 char assertion_type[32];
SiyangXie@gmail.combab77002012-10-10 21:41:52 +00001765 snprintf(assertion_type, sizeof(assertion_type),
1766 "0x%08x", raw_assertion->type);
ted.mielczarek0314e482009-12-02 17:43:57 +00001767 assertion_string = "Unknown assertion type ";
1768 assertion_string += assertion_type;
1769 break;
1770 }
1771 }
1772
1773 string expression = assertion->expression();
1774 if (!expression.empty()) {
1775 assertion_string.append(" " + expression);
1776 }
1777
1778 string function = assertion->function();
1779 if (!function.empty()) {
1780 assertion_string.append(" in function " + function);
1781 }
1782
1783 string file = assertion->file();
1784 if (!file.empty()) {
1785 assertion_string.append(", in file " + file);
1786 }
1787
1788 if (raw_assertion->line != 0) {
1789 char assertion_line[32];
SiyangXie@gmail.combab77002012-10-10 21:41:52 +00001790 snprintf(assertion_line, sizeof(assertion_line), "%u", raw_assertion->line);
ted.mielczarek0314e482009-12-02 17:43:57 +00001791 assertion_string.append(" at line ");
1792 assertion_string.append(assertion_line);
1793 }
1794
1795 return assertion_string;
1796}
1797
mmentovaie5dc6082007-02-14 19:51:05 +00001798} // namespace google_breakpad