17daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// Copyright (c) 2006, Google Inc. 27daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// All rights reserved. 3d5e66382d10b1570d75e924410d58b47857fe799bryner// 47daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// Redistribution and use in source and binary forms, with or without 57daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// modification, are permitted provided that the following conditions are 67daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// met: 7d5e66382d10b1570d75e924410d58b47857fe799bryner// 87daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// * Redistributions of source code must retain the above copyright 97daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// notice, this list of conditions and the following disclaimer. 107daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// * Redistributions in binary form must reproduce the above 117daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// copyright notice, this list of conditions and the following disclaimer 127daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// in the documentation and/or other materials provided with the 137daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// distribution. 145f94e8cf45ad9beef5df16a829f89890dcfe0078ivan.penkov@gmail.com// * Neither the name of Google Inc. nor the names of its 157daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// contributors may be used to endorse or promote products derived from 167daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// this software without specific prior written permission. 17d5e66382d10b1570d75e924410d58b47857fe799bryner// 187daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 197daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 207daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 217daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 227daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 237daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 247daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 257daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 267daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 277daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 287daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29d5e66382d10b1570d75e924410d58b47857fe799bryner 30e5dc60822e5938fea2ae892ccddb906641ba174emmentovai#include "google_breakpad/processor/minidump_processor.h" 31e1930985430ce289f4fe8525f51050e5d78cc44eted.mielczarek 32e1930985430ce289f4fe8525f51050e5d78cc44eted.mielczarek#include <assert.h> 33e1930985430ce289f4fe8525f51050e5d78cc44eted.mielczarek#include <stdio.h> 34e1930985430ce289f4fe8525f51050e5d78cc44eted.mielczarek 355f94e8cf45ad9beef5df16a829f89890dcfe0078ivan.penkov@gmail.com#include <string> 365f94e8cf45ad9beef5df16a829f89890dcfe0078ivan.penkov@gmail.com 372cc15ba4327831f917ff55b87e6d5fc3c7750085ted.mielczarek@gmail.com#include "common/scoped_ptr.h" 385f94e8cf45ad9beef5df16a829f89890dcfe0078ivan.penkov@gmail.com#include "common/using_std_string.h" 39e5dc60822e5938fea2ae892ccddb906641ba174emmentovai#include "google_breakpad/processor/call_stack.h" 40e5dc60822e5938fea2ae892ccddb906641ba174emmentovai#include "google_breakpad/processor/minidump.h" 41e5dc60822e5938fea2ae892ccddb906641ba174emmentovai#include "google_breakpad/processor/process_state.h" 428d2c518c0b1dd6e1c956340759983f0464d356d5nealsid#include "google_breakpad/processor/exploitability.h" 439753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com#include "google_breakpad/processor/stack_frame_symbolizer.h" 44af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai#include "processor/logging.h" 45d5e66382d10b1570d75e924410d58b47857fe799bryner#include "processor/stackwalker_x86.h" 467dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org#include "processor/symbolic_constants_win.h" 47d5e66382d10b1570d75e924410d58b47857fe799bryner 48e5dc60822e5938fea2ae892ccddb906641ba174emmentovainamespace google_breakpad { 49d5e66382d10b1570d75e924410d58b47857fe799bryner 50fd38d48e6d5e56cb66b0fa0f7e25f840a83dac5cbrynerMinidumpProcessor::MinidumpProcessor(SymbolSupplier *supplier, 51fd38d48e6d5e56cb66b0fa0f7e25f840a83dac5cbryner SourceLineResolverInterface *resolver) 529753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com : frame_symbolizer_(new StackFrameSymbolizer(supplier, resolver)), 539753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com own_frame_symbolizer_(true), 548d2c518c0b1dd6e1c956340759983f0464d356d5nealsid enable_exploitability_(false) { 558d2c518c0b1dd6e1c956340759983f0464d356d5nealsid} 568d2c518c0b1dd6e1c956340759983f0464d356d5nealsid 578d2c518c0b1dd6e1c956340759983f0464d356d5nealsidMinidumpProcessor::MinidumpProcessor(SymbolSupplier *supplier, 588d2c518c0b1dd6e1c956340759983f0464d356d5nealsid SourceLineResolverInterface *resolver, 598d2c518c0b1dd6e1c956340759983f0464d356d5nealsid bool enable_exploitability) 609753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com : frame_symbolizer_(new StackFrameSymbolizer(supplier, resolver)), 619753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com own_frame_symbolizer_(true), 628d2c518c0b1dd6e1c956340759983f0464d356d5nealsid enable_exploitability_(enable_exploitability) { 63d5e66382d10b1570d75e924410d58b47857fe799bryner} 64d5e66382d10b1570d75e924410d58b47857fe799bryner 659753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.comMinidumpProcessor::MinidumpProcessor(StackFrameSymbolizer *frame_symbolizer, 669753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com bool enable_exploitability) 679753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com : frame_symbolizer_(frame_symbolizer), 689753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com own_frame_symbolizer_(false), 699753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com enable_exploitability_(enable_exploitability) { 709753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com assert(frame_symbolizer_); 719753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com} 729753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com 73cce3492afc263be86236600d41dca40be7224ee7brynerMinidumpProcessor::~MinidumpProcessor() { 749753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com if (own_frame_symbolizer_) delete frame_symbolizer_; 75d5e66382d10b1570d75e924410d58b47857fe799bryner} 76d5e66382d10b1570d75e924410d58b47857fe799bryner 77b56cfa067add059d0894433393e798fe0604970enealsidProcessResult MinidumpProcessor::Process( 78b56cfa067add059d0894433393e798fe0604970enealsid Minidump *dump, ProcessState *process_state) { 79b56cfa067add059d0894433393e798fe0604970enealsid assert(dump); 80b56cfa067add059d0894433393e798fe0604970enealsid assert(process_state); 81d5e66382d10b1570d75e924410d58b47857fe799bryner 82f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner process_state->Clear(); 83e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai 84b56cfa067add059d0894433393e798fe0604970enealsid const MDRawHeader *header = dump->header(); 85b56cfa067add059d0894433393e798fe0604970enealsid if (!header) { 86b56cfa067add059d0894433393e798fe0604970enealsid BPLOG(ERROR) << "Minidump " << dump->path() << " has no header"; 87b56cfa067add059d0894433393e798fe0604970enealsid return PROCESS_ERROR_NO_MINIDUMP_HEADER; 88b56cfa067add059d0894433393e798fe0604970enealsid } 89daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis process_state->time_date_stamp_ = header->time_date_stamp; 90daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis 91ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org bool has_process_create_time = 92ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org GetProcessCreateTime(dump, &process_state->process_create_time_); 93ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org 94b56cfa067add059d0894433393e798fe0604970enealsid bool has_cpu_info = GetCPUInfo(dump, &process_state->system_info_); 95b56cfa067add059d0894433393e798fe0604970enealsid bool has_os_info = GetOSInfo(dump, &process_state->system_info_); 96e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai 976162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com uint32_t dump_thread_id = 0; 9876f052f8fbf8864dee5992b857229d06560a766ammentovai bool has_dump_thread = false; 996162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com uint32_t requesting_thread_id = 0; 10076f052f8fbf8864dee5992b857229d06560a766ammentovai bool has_requesting_thread = false; 10176f052f8fbf8864dee5992b857229d06560a766ammentovai 102b56cfa067add059d0894433393e798fe0604970enealsid MinidumpBreakpadInfo *breakpad_info = dump->GetBreakpadInfo(); 103e5dc60822e5938fea2ae892ccddb906641ba174emmentovai if (breakpad_info) { 104e5dc60822e5938fea2ae892ccddb906641ba174emmentovai has_dump_thread = breakpad_info->GetDumpThreadID(&dump_thread_id); 10576f052f8fbf8864dee5992b857229d06560a766ammentovai has_requesting_thread = 106e5dc60822e5938fea2ae892ccddb906641ba174emmentovai breakpad_info->GetRequestingThreadID(&requesting_thread_id); 10776f052f8fbf8864dee5992b857229d06560a766ammentovai } 10876f052f8fbf8864dee5992b857229d06560a766ammentovai 109b56cfa067add059d0894433393e798fe0604970enealsid MinidumpException *exception = dump->GetException(); 110e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai if (exception) { 111e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai process_state->crashed_ = true; 11276f052f8fbf8864dee5992b857229d06560a766ammentovai has_requesting_thread = exception->GetThreadID(&requesting_thread_id); 113e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai 114e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai process_state->crash_reason_ = GetCrashReason( 115b56cfa067add059d0894433393e798fe0604970enealsid dump, &process_state->crash_address_); 116d5e66382d10b1570d75e924410d58b47857fe799bryner } 117d5e66382d10b1570d75e924410d58b47857fe799bryner 118cec12872c403314261e151cf2fa4505ae1affaf6cdn@chromium.org // This will just return an empty string if it doesn't exist. 119cec12872c403314261e151cf2fa4505ae1affaf6cdn@chromium.org process_state->assertion_ = GetAssertion(dump); 1200314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek 121b56cfa067add059d0894433393e798fe0604970enealsid MinidumpModuleList *module_list = dump->GetModuleList(); 122db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai 123db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai // Put a copy of the module list into ProcessState object. This is not 124db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai // necessarily a MinidumpModuleList, but it adheres to the CodeModules 125db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai // interface, which is all that ProcessState needs to expose. 126db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai if (module_list) 127db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai process_state->modules_ = module_list->Copy(); 128db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai 12902ee17f7cf2b669ec1ee688243bcf78f8f58397bivan.penkov@gmail.com MinidumpMemoryList *memory_list = dump->GetMemoryList(); 13002ee17f7cf2b669ec1ee688243bcf78f8f58397bivan.penkov@gmail.com if (memory_list) { 13102ee17f7cf2b669ec1ee688243bcf78f8f58397bivan.penkov@gmail.com BPLOG(INFO) << "Found " << memory_list->region_count() 13202ee17f7cf2b669ec1ee688243bcf78f8f58397bivan.penkov@gmail.com << " memory regions."; 13302ee17f7cf2b669ec1ee688243bcf78f8f58397bivan.penkov@gmail.com } 13402ee17f7cf2b669ec1ee688243bcf78f8f58397bivan.penkov@gmail.com 135b56cfa067add059d0894433393e798fe0604970enealsid MinidumpThreadList *threads = dump->GetThreadList(); 136d5e66382d10b1570d75e924410d58b47857fe799bryner if (!threads) { 137b56cfa067add059d0894433393e798fe0604970enealsid BPLOG(ERROR) << "Minidump " << dump->path() << " has no thread list"; 138b56cfa067add059d0894433393e798fe0604970enealsid return PROCESS_ERROR_NO_THREAD_LIST; 139d5e66382d10b1570d75e924410d58b47857fe799bryner } 140d5e66382d10b1570d75e924410d58b47857fe799bryner 141b56cfa067add059d0894433393e798fe0604970enealsid BPLOG(INFO) << "Minidump " << dump->path() << " has " << 142ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org (has_cpu_info ? "" : "no ") << "CPU info, " << 143ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org (has_os_info ? "" : "no ") << "OS info, " << 144ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org (breakpad_info != NULL ? "" : "no ") << "Breakpad info, " << 145ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org (exception != NULL ? "" : "no ") << "exception, " << 146ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org (module_list != NULL ? "" : "no ") << "module list, " << 147ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org (threads != NULL ? "" : "no ") << "thread list, " << 148ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org (has_dump_thread ? "" : "no ") << "dump thread, " << 149ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org (has_requesting_thread ? "" : "no ") << "requesting thread, and " << 150ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org (has_process_create_time ? "" : "no ") << "process create time"; 151af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai 1526ed453a770a18ec0c5c7caaab60f5fff531b6608mmentovai bool interrupted = false; 15376f052f8fbf8864dee5992b857229d06560a766ammentovai bool found_requesting_thread = false; 154e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai unsigned int thread_count = threads->thread_count(); 1559753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com 1569753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com // Reset frame_symbolizer_ at the beginning of stackwalk for each minidump. 1579753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com frame_symbolizer_->Reset(); 1589753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com 159e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai for (unsigned int thread_index = 0; 160e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai thread_index < thread_count; 161e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai ++thread_index) { 162af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai char thread_string_buffer[64]; 163af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai snprintf(thread_string_buffer, sizeof(thread_string_buffer), "%d/%d", 164af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai thread_index, thread_count); 165b56cfa067add059d0894433393e798fe0604970enealsid string thread_string = dump->path() + ":" + thread_string_buffer; 166af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai 167e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai MinidumpThread *thread = threads->GetThreadAtIndex(thread_index); 168e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai if (!thread) { 169af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai BPLOG(ERROR) << "Could not get thread for " << thread_string; 170b56cfa067add059d0894433393e798fe0604970enealsid return PROCESS_ERROR_GETTING_THREAD; 171e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai } 172e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai 1736162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com uint32_t thread_id; 17476f052f8fbf8864dee5992b857229d06560a766ammentovai if (!thread->GetThreadID(&thread_id)) { 175af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai BPLOG(ERROR) << "Could not get thread ID for " << thread_string; 176b56cfa067add059d0894433393e798fe0604970enealsid return PROCESS_ERROR_GETTING_THREAD_ID; 17776f052f8fbf8864dee5992b857229d06560a766ammentovai } 17876f052f8fbf8864dee5992b857229d06560a766ammentovai 179af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai thread_string += " id " + HexString(thread_id); 180af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai BPLOG(INFO) << "Looking at thread " << thread_string; 181af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai 18276f052f8fbf8864dee5992b857229d06560a766ammentovai // If this thread is the thread that produced the minidump, don't process 18376f052f8fbf8864dee5992b857229d06560a766ammentovai // it. Because of the problems associated with a thread producing a 18476f052f8fbf8864dee5992b857229d06560a766ammentovai // dump of itself (when both its context and its stack are in flux), 18576f052f8fbf8864dee5992b857229d06560a766ammentovai // processing that stack wouldn't provide much useful data. 18676f052f8fbf8864dee5992b857229d06560a766ammentovai if (has_dump_thread && thread_id == dump_thread_id) { 18776f052f8fbf8864dee5992b857229d06560a766ammentovai continue; 18876f052f8fbf8864dee5992b857229d06560a766ammentovai } 18976f052f8fbf8864dee5992b857229d06560a766ammentovai 190f944ba3fbb6136a14d47bf40f5cf1567ba3f8008mmentovai MinidumpContext *context = thread->GetContext(); 191f944ba3fbb6136a14d47bf40f5cf1567ba3f8008mmentovai 19276f052f8fbf8864dee5992b857229d06560a766ammentovai if (has_requesting_thread && thread_id == requesting_thread_id) { 19376f052f8fbf8864dee5992b857229d06560a766ammentovai if (found_requesting_thread) { 19476f052f8fbf8864dee5992b857229d06560a766ammentovai // There can't be more than one requesting thread. 195af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai BPLOG(ERROR) << "Duplicate requesting thread: " << thread_string; 196b56cfa067add059d0894433393e798fe0604970enealsid return PROCESS_ERROR_DUPLICATE_REQUESTING_THREADS; 197e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai } 198e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai 19976f052f8fbf8864dee5992b857229d06560a766ammentovai // Use processed_state->threads_.size() instead of thread_index. 20076f052f8fbf8864dee5992b857229d06560a766ammentovai // thread_index points to the thread index in the minidump, which 20176f052f8fbf8864dee5992b857229d06560a766ammentovai // might be greater than the thread index in the threads vector if 20276f052f8fbf8864dee5992b857229d06560a766ammentovai // any of the minidump's threads are skipped and not placed into the 20376f052f8fbf8864dee5992b857229d06560a766ammentovai // processed threads vector. The thread vector's current size will 20476f052f8fbf8864dee5992b857229d06560a766ammentovai // be the index of the current thread when it's pushed into the 20576f052f8fbf8864dee5992b857229d06560a766ammentovai // vector. 20676f052f8fbf8864dee5992b857229d06560a766ammentovai process_state->requesting_thread_ = process_state->threads_.size(); 20776f052f8fbf8864dee5992b857229d06560a766ammentovai 20876f052f8fbf8864dee5992b857229d06560a766ammentovai found_requesting_thread = true; 20976f052f8fbf8864dee5992b857229d06560a766ammentovai 21076f052f8fbf8864dee5992b857229d06560a766ammentovai if (process_state->crashed_) { 21176f052f8fbf8864dee5992b857229d06560a766ammentovai // Use the exception record's context for the crashed thread, instead 21276f052f8fbf8864dee5992b857229d06560a766ammentovai // of the thread's own context. For the crashed thread, the thread's 21376f052f8fbf8864dee5992b857229d06560a766ammentovai // own context is the state inside the exception handler. Using it 21476f052f8fbf8864dee5992b857229d06560a766ammentovai // would not result in the expected stack trace from the time of the 2155f4fa55598baf92785223debe7d3787c6b29cf3ejschuh@chromium.org // crash. If the exception context is invalid, however, we fall back 2165f4fa55598baf92785223debe7d3787c6b29cf3ejschuh@chromium.org // on the thread context. 21796c69639ee2f806b181f4923c3a8e35ba2f25473jschuh@chromium.org MinidumpContext *ctx = exception->GetContext(); 2185f4fa55598baf92785223debe7d3787c6b29cf3ejschuh@chromium.org context = ctx ? ctx : thread->GetContext(); 21976f052f8fbf8864dee5992b857229d06560a766ammentovai } 220e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai } 221e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai 22202ee17f7cf2b669ec1ee688243bcf78f8f58397bivan.penkov@gmail.com // If the memory region for the stack cannot be read using the RVA stored 22302ee17f7cf2b669ec1ee688243bcf78f8f58397bivan.penkov@gmail.com // in the memory descriptor inside MINIDUMP_THREAD, try to locate and use 22402ee17f7cf2b669ec1ee688243bcf78f8f58397bivan.penkov@gmail.com // a memory region (containing the stack) from the minidump memory list. 225e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai MinidumpMemoryRegion *thread_memory = thread->GetMemory(); 22602ee17f7cf2b669ec1ee688243bcf78f8f58397bivan.penkov@gmail.com if (!thread_memory && memory_list) { 22702ee17f7cf2b669ec1ee688243bcf78f8f58397bivan.penkov@gmail.com uint64_t start_stack_memory_range = thread->GetStartOfStackMemoryRange(); 22802ee17f7cf2b669ec1ee688243bcf78f8f58397bivan.penkov@gmail.com if (start_stack_memory_range) { 22902ee17f7cf2b669ec1ee688243bcf78f8f58397bivan.penkov@gmail.com thread_memory = memory_list->GetMemoryRegionForAddress( 23002ee17f7cf2b669ec1ee688243bcf78f8f58397bivan.penkov@gmail.com start_stack_memory_range); 23102ee17f7cf2b669ec1ee688243bcf78f8f58397bivan.penkov@gmail.com } 23202ee17f7cf2b669ec1ee688243bcf78f8f58397bivan.penkov@gmail.com } 233e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai if (!thread_memory) { 234af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai BPLOG(ERROR) << "No memory region for " << thread_string; 235e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai } 236e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai 237db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai // Use process_state->modules_ instead of module_list, because the 238db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai // |modules| argument will be used to populate the |module| fields in 239db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai // the returned StackFrame objects, which will be placed into the 240db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai // returned ProcessState object. module_list's lifetime is only as 241db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai // long as the Minidump object: it will be deleted when this function 242db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai // returns. process_state->modules_ is owned by the ProcessState object 243db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai // (just like the StackFrame objects), and is much more suitable for this 244db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai // task. 245e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai scoped_ptr<Stackwalker> stackwalker( 24697d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai Stackwalker::StackwalkerForCPU(process_state->system_info(), 24797d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai context, 248e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai thread_memory, 249db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai process_state->modules_, 2509753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com frame_symbolizer_)); 251e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai 252f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner scoped_ptr<CallStack> stack(new CallStack()); 253e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com if (stackwalker.get()) { 2545a2106b5f95f3232ac0e9aab5f081eb04313a8b6ivan.penkov@gmail.com if (!stackwalker->Walk(stack.get(), 2552d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com &process_state->modules_without_symbols_, 2562d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com &process_state->modules_with_corrupt_symbols_)) { 2575a2106b5f95f3232ac0e9aab5f081eb04313a8b6ivan.penkov@gmail.com BPLOG(INFO) << "Stackwalker interrupt (missing symbols?) at " 2585a2106b5f95f3232ac0e9aab5f081eb04313a8b6ivan.penkov@gmail.com << thread_string; 259e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com interrupted = true; 260e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com } 261e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com } else { 262e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com // Threads with missing CPU contexts will hit this, but 263e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com // don't abort processing the rest of the dump just for 264e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com // one bad thread. 265e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com BPLOG(ERROR) << "No stackwalker for " << thread_string; 266e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai } 267e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai process_state->threads_.push_back(stack.release()); 2686e525cbfbba74d702dadf62c1878f3aa453a28c4nealsid process_state->thread_memory_regions_.push_back(thread_memory); 269d5e66382d10b1570d75e924410d58b47857fe799bryner } 270d5e66382d10b1570d75e924410d58b47857fe799bryner 2716ed453a770a18ec0c5c7caaab60f5fff531b6608mmentovai if (interrupted) { 272b56cfa067add059d0894433393e798fe0604970enealsid BPLOG(INFO) << "Processing interrupted for " << dump->path(); 273b56cfa067add059d0894433393e798fe0604970enealsid return PROCESS_SYMBOL_SUPPLIER_INTERRUPTED; 2746ed453a770a18ec0c5c7caaab60f5fff531b6608mmentovai } 2756ed453a770a18ec0c5c7caaab60f5fff531b6608mmentovai 27676f052f8fbf8864dee5992b857229d06560a766ammentovai // If a requesting thread was indicated, it must be present. 27776f052f8fbf8864dee5992b857229d06560a766ammentovai if (has_requesting_thread && !found_requesting_thread) { 2783a9a38a29e1cad32d33a239f999c207d513471e0waylonis // Don't mark as an error, but invalidate the requesting thread 279af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai BPLOG(ERROR) << "Minidump indicated requesting thread " << 280b56cfa067add059d0894433393e798fe0604970enealsid HexString(requesting_thread_id) << ", not found in " << 281b56cfa067add059d0894433393e798fe0604970enealsid dump->path(); 2823a9a38a29e1cad32d33a239f999c207d513471e0waylonis process_state->requesting_thread_ = -1; 283d5e66382d10b1570d75e924410d58b47857fe799bryner } 284d5e66382d10b1570d75e924410d58b47857fe799bryner 2858d2c518c0b1dd6e1c956340759983f0464d356d5nealsid // Exploitability defaults to EXPLOITABILITY_NOT_ANALYZED 2868d2c518c0b1dd6e1c956340759983f0464d356d5nealsid process_state->exploitability_ = EXPLOITABILITY_NOT_ANALYZED; 2878d2c518c0b1dd6e1c956340759983f0464d356d5nealsid 2888d2c518c0b1dd6e1c956340759983f0464d356d5nealsid // If an exploitability run was requested we perform the platform specific 2898d2c518c0b1dd6e1c956340759983f0464d356d5nealsid // rating. 2908d2c518c0b1dd6e1c956340759983f0464d356d5nealsid if (enable_exploitability_) { 2918d2c518c0b1dd6e1c956340759983f0464d356d5nealsid scoped_ptr<Exploitability> exploitability( 2928d2c518c0b1dd6e1c956340759983f0464d356d5nealsid Exploitability::ExploitabilityForPlatform(dump, process_state)); 2938d2c518c0b1dd6e1c956340759983f0464d356d5nealsid // The engine will be null if the platform is not supported 2948d2c518c0b1dd6e1c956340759983f0464d356d5nealsid if (exploitability != NULL) { 2958d2c518c0b1dd6e1c956340759983f0464d356d5nealsid process_state->exploitability_ = exploitability->CheckExploitability(); 2968d2c518c0b1dd6e1c956340759983f0464d356d5nealsid } else { 2978d2c518c0b1dd6e1c956340759983f0464d356d5nealsid process_state->exploitability_ = EXPLOITABILITY_ERR_NOENGINE; 2988d2c518c0b1dd6e1c956340759983f0464d356d5nealsid } 2998d2c518c0b1dd6e1c956340759983f0464d356d5nealsid } 3008d2c518c0b1dd6e1c956340759983f0464d356d5nealsid 301b56cfa067add059d0894433393e798fe0604970enealsid BPLOG(INFO) << "Processed " << dump->path(); 302f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner return PROCESS_OK; 303e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai} 304e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai 305b56cfa067add059d0894433393e798fe0604970enealsidProcessResult MinidumpProcessor::Process( 306b56cfa067add059d0894433393e798fe0604970enealsid const string &minidump_file, ProcessState *process_state) { 307b56cfa067add059d0894433393e798fe0604970enealsid BPLOG(INFO) << "Processing minidump in file " << minidump_file; 308b56cfa067add059d0894433393e798fe0604970enealsid 309b56cfa067add059d0894433393e798fe0604970enealsid Minidump dump(minidump_file); 310b56cfa067add059d0894433393e798fe0604970enealsid if (!dump.Read()) { 311b56cfa067add059d0894433393e798fe0604970enealsid BPLOG(ERROR) << "Minidump " << dump.path() << " could not be read"; 312b56cfa067add059d0894433393e798fe0604970enealsid return PROCESS_ERROR_MINIDUMP_NOT_FOUND; 313cec12872c403314261e151cf2fa4505ae1affaf6cdn@chromium.org } 314b56cfa067add059d0894433393e798fe0604970enealsid 315b56cfa067add059d0894433393e798fe0604970enealsid return Process(&dump, process_state); 316b56cfa067add059d0894433393e798fe0604970enealsid} 317b56cfa067add059d0894433393e798fe0604970enealsid 318e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai// Returns the MDRawSystemInfo from a minidump, or NULL if system info is 31980e98391dc7ff361355e72c24c0fb222518bcdfcmmentovai// not available from the minidump. If system_info is non-NULL, it is used 320e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai// to pass back the MinidumpSystemInfo object. 321e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovaistatic const MDRawSystemInfo* GetSystemInfo(Minidump *dump, 322e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai MinidumpSystemInfo **system_info) { 323e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai MinidumpSystemInfo *minidump_system_info = dump->GetSystemInfo(); 324e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai if (!minidump_system_info) 325d119a921ea611dc38cfcb7411759ddf2c688603fmmentovai return NULL; 326e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai 327e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai if (system_info) 328e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai *system_info = minidump_system_info; 329e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai 330e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai return minidump_system_info->system_info(); 331e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai} 332e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai 333972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// Extract CPU info string from ARM-specific MDRawSystemInfo structure. 334972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// raw_info: pointer to source MDRawSystemInfo. 335972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// cpu_info: address of target string, cpu info text will be appended to it. 336972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.orgstatic void GetARMCpuInfo(const MDRawSystemInfo* raw_info, 3375f94e8cf45ad9beef5df16a829f89890dcfe0078ivan.penkov@gmail.com string* cpu_info) { 338972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org assert(raw_info != NULL && cpu_info != NULL); 339972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org 340972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org // Write ARM architecture version. 341972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org char cpu_string[32]; 342972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org snprintf(cpu_string, sizeof(cpu_string), "ARMv%d", 343972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org raw_info->processor_level); 344972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org cpu_info->append(cpu_string); 345972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org 346972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org // There is no good list of implementer id values, but the following 347972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org // pages provide some help: 348972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org // http://comments.gmane.org/gmane.linux.linaro.devel/6903 349972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org // http://forum.xda-developers.com/archive/index.php/t-480226.html 350972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org const struct { 351972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org uint32_t id; 352972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org const char* name; 353972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org } vendors[] = { 354972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org { 0x41, "ARM" }, 355972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org { 0x51, "Qualcomm" }, 356972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org { 0x56, "Marvell" }, 357972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org { 0x69, "Intel/Marvell" }, 358972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org }; 359972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org const struct { 360972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org uint32_t id; 361972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org const char* name; 362972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org } parts[] = { 363972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org { 0x4100c050, "Cortex-A5" }, 364972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org { 0x4100c080, "Cortex-A8" }, 365972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org { 0x4100c090, "Cortex-A9" }, 366972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org { 0x4100c0f0, "Cortex-A15" }, 367972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org { 0x4100c140, "Cortex-R4" }, 368972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org { 0x4100c150, "Cortex-R5" }, 369972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org { 0x4100b360, "ARM1136" }, 370972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org { 0x4100b560, "ARM1156" }, 371972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org { 0x4100b760, "ARM1176" }, 372972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org { 0x4100b020, "ARM11-MPCore" }, 373972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org { 0x41009260, "ARM926" }, 374972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org { 0x41009460, "ARM946" }, 375972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org { 0x41009660, "ARM966" }, 376972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org { 0x510006f0, "Krait" }, 377972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org { 0x510000f0, "Scorpion" }, 378972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org }; 379972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org 380972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org const struct { 381972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org uint32_t hwcap; 382972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org const char* name; 383972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org } features[] = { 384972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org { MD_CPU_ARM_ELF_HWCAP_SWP, "swp" }, 385972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org { MD_CPU_ARM_ELF_HWCAP_HALF, "half" }, 386972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org { MD_CPU_ARM_ELF_HWCAP_THUMB, "thumb" }, 387972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org { MD_CPU_ARM_ELF_HWCAP_26BIT, "26bit" }, 388972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org { MD_CPU_ARM_ELF_HWCAP_FAST_MULT, "fastmult" }, 389972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org { MD_CPU_ARM_ELF_HWCAP_FPA, "fpa" }, 390972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org { MD_CPU_ARM_ELF_HWCAP_VFP, "vfpv2" }, 391972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org { MD_CPU_ARM_ELF_HWCAP_EDSP, "edsp" }, 392972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org { MD_CPU_ARM_ELF_HWCAP_JAVA, "java" }, 393972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org { MD_CPU_ARM_ELF_HWCAP_IWMMXT, "iwmmxt" }, 394972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org { MD_CPU_ARM_ELF_HWCAP_CRUNCH, "crunch" }, 395972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org { MD_CPU_ARM_ELF_HWCAP_THUMBEE, "thumbee" }, 396972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org { MD_CPU_ARM_ELF_HWCAP_NEON, "neon" }, 397972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org { MD_CPU_ARM_ELF_HWCAP_VFPv3, "vfpv3" }, 398972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org { MD_CPU_ARM_ELF_HWCAP_VFPv3D16, "vfpv3d16" }, 399972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org { MD_CPU_ARM_ELF_HWCAP_TLS, "tls" }, 400972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org { MD_CPU_ARM_ELF_HWCAP_VFPv4, "vfpv4" }, 401972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org { MD_CPU_ARM_ELF_HWCAP_IDIVA, "idiva" }, 402972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org { MD_CPU_ARM_ELF_HWCAP_IDIVT, "idivt" }, 403972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org }; 404972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org 405972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org uint32_t cpuid = raw_info->cpu.arm_cpu_info.cpuid; 406972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org if (cpuid != 0) { 407972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org // Extract vendor name from CPUID 408972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org const char* vendor = NULL; 409972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org uint32_t vendor_id = (cpuid >> 24) & 0xff; 410972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org for (size_t i = 0; i < sizeof(vendors)/sizeof(vendors[0]); ++i) { 411972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org if (vendors[i].id == vendor_id) { 412972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org vendor = vendors[i].name; 413972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org break; 414972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org } 415972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org } 416972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org cpu_info->append(" "); 417972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org if (vendor) { 418972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org cpu_info->append(vendor); 419972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org } else { 420972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org snprintf(cpu_string, sizeof(cpu_string), "vendor(0x%x)", vendor_id); 421972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org cpu_info->append(cpu_string); 422972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org } 423972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org 424972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org // Extract part name from CPUID 425972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org uint32_t part_id = (cpuid & 0xff00fff0); 426972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org const char* part = NULL; 427972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org for (size_t i = 0; i < sizeof(parts)/sizeof(parts[0]); ++i) { 428972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org if (parts[i].id == part_id) { 429972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org part = parts[i].name; 430972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org break; 431972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org } 432972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org } 433972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org cpu_info->append(" "); 434972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org if (part != NULL) { 435972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org cpu_info->append(part); 436972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org } else { 437972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org snprintf(cpu_string, sizeof(cpu_string), "part(0x%x)", part_id); 438972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org cpu_info->append(cpu_string); 439972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org } 440972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org } 441972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org uint32_t elf_hwcaps = raw_info->cpu.arm_cpu_info.elf_hwcaps; 442972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org if (elf_hwcaps != 0) { 443972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org cpu_info->append(" features: "); 444972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org const char* comma = ""; 445972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org for (size_t i = 0; i < sizeof(features)/sizeof(features[0]); ++i) { 446972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org if (elf_hwcaps & features[i].hwcap) { 447972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org cpu_info->append(comma); 448972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org cpu_info->append(features[i].name); 449972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org comma = ","; 450972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org } 451972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org } 452972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org } 453972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org} 454972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org 455e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai// static 456af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovaibool MinidumpProcessor::GetCPUInfo(Minidump *dump, SystemInfo *info) { 45797d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai assert(dump); 45897d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai assert(info); 45997d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai 46097d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai info->cpu.clear(); 46197d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai info->cpu_info.clear(); 462e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai 463e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai MinidumpSystemInfo *system_info; 464e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai const MDRawSystemInfo *raw_system_info = GetSystemInfo(dump, &system_info); 465e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai if (!raw_system_info) 466af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai return false; 467e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai 468e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai switch (raw_system_info->processor_architecture) { 4698eb7111814953cb64ec0569b91ea99804b2d5b85ted.mielczarek case MD_CPU_ARCHITECTURE_X86: 4708eb7111814953cb64ec0569b91ea99804b2d5b85ted.mielczarek case MD_CPU_ARCHITECTURE_AMD64: { 471b56cfa067add059d0894433393e798fe0604970enealsid if (raw_system_info->processor_architecture == 4728eb7111814953cb64ec0569b91ea99804b2d5b85ted.mielczarek MD_CPU_ARCHITECTURE_X86) 4738eb7111814953cb64ec0569b91ea99804b2d5b85ted.mielczarek info->cpu = "x86"; 4748eb7111814953cb64ec0569b91ea99804b2d5b85ted.mielczarek else 4758eb7111814953cb64ec0569b91ea99804b2d5b85ted.mielczarek info->cpu = "amd64"; 4768eb7111814953cb64ec0569b91ea99804b2d5b85ted.mielczarek 47797d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai const string *cpu_vendor = system_info->GetCPUVendor(); 47897d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai if (cpu_vendor) { 47997d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai info->cpu_info = *cpu_vendor; 48097d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai info->cpu_info.append(" "); 481e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai } 48297d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai 48397d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai char x86_info[36]; 48497d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai snprintf(x86_info, sizeof(x86_info), "family %u model %u stepping %u", 48597d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai raw_system_info->processor_level, 48697d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai raw_system_info->processor_revision >> 8, 48797d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai raw_system_info->processor_revision & 0xff); 48897d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai info->cpu_info.append(x86_info); 489e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai break; 490e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai } 491e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai 492e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai case MD_CPU_ARCHITECTURE_PPC: { 49397d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai info->cpu = "ppc"; 494e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai break; 495e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai } 496e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai 497cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org case MD_CPU_ARCHITECTURE_PPC64: { 498cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org info->cpu = "ppc64"; 499cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org break; 500cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org } 501cd1f1a6399d5a73ac2bdf5671f8322ba013e8e21thestig@chromium.org 502ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai case MD_CPU_ARCHITECTURE_SPARC: { 503ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai info->cpu = "sparc"; 504ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai break; 505ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai } 506ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai 5079276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek case MD_CPU_ARCHITECTURE_ARM: { 5089276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek info->cpu = "arm"; 509972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org GetARMCpuInfo(raw_system_info, &info->cpu_info); 5109276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek break; 5119276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek } 5129276b0d3017ad5ca93c8b593cacf317e1eaa114eted.mielczarek 51339d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org case MD_CPU_ARCHITECTURE_ARM64: { 51439d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org info->cpu = "arm64"; 51539d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org break; 51639d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org } 51739d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org 5185f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com case MD_CPU_ARCHITECTURE_MIPS: { 5195f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com info->cpu = "mips"; 5205f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com break; 5215f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com } 5225f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com 523e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai default: { 524e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai // Assign the numeric architecture ID into the CPU string. 525e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai char cpu_string[7]; 526e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai snprintf(cpu_string, sizeof(cpu_string), "0x%04x", 527e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai raw_system_info->processor_architecture); 52897d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai info->cpu = cpu_string; 529e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai break; 530e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai } 531e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai } 532af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai 53390e050e5982a5cddc3d544d103eccc06be42f184ted.mielczarek info->cpu_count = raw_system_info->number_of_processors; 53490e050e5982a5cddc3d544d103eccc06be42f184ted.mielczarek 535af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai return true; 536e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai} 537e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai 538e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai// static 539af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovaibool MinidumpProcessor::GetOSInfo(Minidump *dump, SystemInfo *info) { 54097d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai assert(dump); 54197d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai assert(info); 54297d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai 54397d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai info->os.clear(); 54497d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai info->os_short.clear(); 54597d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai info->os_version.clear(); 546e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai 547e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai MinidumpSystemInfo *system_info; 548e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai const MDRawSystemInfo *raw_system_info = GetSystemInfo(dump, &system_info); 549e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai if (!raw_system_info) 550af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai return false; 55197d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai 55297d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai info->os_short = system_info->GetOS(); 553e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai 554e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai switch (raw_system_info->platform_id) { 555e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai case MD_OS_WIN32_NT: { 55697d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai info->os = "Windows NT"; 557e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai break; 558e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai } 559e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai 560e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai case MD_OS_WIN32_WINDOWS: { 56197d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai info->os = "Windows"; 562e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai break; 563e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai } 564e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai 565e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai case MD_OS_MAC_OS_X: { 56697d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai info->os = "Mac OS X"; 567e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai break; 568e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai } 569e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai 57063f97ad134db3fa175c489b50b66a79bf0c95025qsr@chromium.org case MD_OS_IOS: { 57163f97ad134db3fa175c489b50b66a79bf0c95025qsr@chromium.org info->os = "iOS"; 57263f97ad134db3fa175c489b50b66a79bf0c95025qsr@chromium.org break; 57363f97ad134db3fa175c489b50b66a79bf0c95025qsr@chromium.org } 57463f97ad134db3fa175c489b50b66a79bf0c95025qsr@chromium.org 575e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai case MD_OS_LINUX: { 57697d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai info->os = "Linux"; 577e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai break; 578e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai } 579e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai 580ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai case MD_OS_SOLARIS: { 581ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai info->os = "Solaris"; 582ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai break; 583ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai } 584ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai 5855187de1ae5cb7df2343b650416aa805084bdf8dadigit@chromium.org case MD_OS_ANDROID: { 5865187de1ae5cb7df2343b650416aa805084bdf8dadigit@chromium.org info->os = "Android"; 5875187de1ae5cb7df2343b650416aa805084bdf8dadigit@chromium.org break; 5885187de1ae5cb7df2343b650416aa805084bdf8dadigit@chromium.org } 5895187de1ae5cb7df2343b650416aa805084bdf8dadigit@chromium.org 590d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org case MD_OS_PS3: { 591d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org info->os = "PS3"; 59242faddc9c3be48a8a29236ab866013288d25491emseaborn@chromium.org break; 59342faddc9c3be48a8a29236ab866013288d25491emseaborn@chromium.org } 59442faddc9c3be48a8a29236ab866013288d25491emseaborn@chromium.org 59542faddc9c3be48a8a29236ab866013288d25491emseaborn@chromium.org case MD_OS_NACL: { 59642faddc9c3be48a8a29236ab866013288d25491emseaborn@chromium.org info->os = "NaCl"; 59742faddc9c3be48a8a29236ab866013288d25491emseaborn@chromium.org break; 598d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org } 599d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org 600e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai default: { 601e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai // Assign the numeric platform ID into the OS string. 602e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai char os_string[11]; 603e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai snprintf(os_string, sizeof(os_string), "0x%08x", 604e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai raw_system_info->platform_id); 60597d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai info->os = os_string; 606e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai break; 607e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai } 608e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai } 609e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai 61097d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai char os_version_string[33]; 61197d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai snprintf(os_version_string, sizeof(os_version_string), "%u.%u.%u", 61297d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai raw_system_info->major_version, 61397d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai raw_system_info->minor_version, 61497d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai raw_system_info->build_number); 61597d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai info->os_version = os_version_string; 61697d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai 61797d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai const string *csd_version = system_info->GetCSDVersion(); 61897d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai if (csd_version) { 61997d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai info->os_version.append(" "); 62097d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai info->os_version.append(*csd_version); 621e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai } 622af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai 623af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai return true; 624e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai} 625e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai 626e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai// static 627ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.orgbool MinidumpProcessor::GetProcessCreateTime(Minidump* dump, 628ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org uint32_t* process_create_time) { 629ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org assert(dump); 630ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org assert(process_create_time); 631ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org 632ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org *process_create_time = 0; 633ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org 634ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org MinidumpMiscInfo* minidump_misc_info = dump->GetMiscInfo(); 635ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org if (!minidump_misc_info) { 636ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org return false; 637ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org } 638ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org 639ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org const MDRawMiscInfo* md_raw_misc_info = minidump_misc_info->misc_info(); 640ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org if (!md_raw_misc_info) { 641ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org return false; 642ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org } 643ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org 644ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org if (!(md_raw_misc_info->flags1 & MD_MISCINFO_FLAGS1_PROCESS_TIMES)) { 645ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org return false; 646ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org } 647ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org 648ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org *process_create_time = md_raw_misc_info->process_create_time; 649ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org return true; 650ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org} 651ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org 652ea4b5be2a2b9a5d5e7a09150a1821b1db5698a45ivanpe@chromium.org// static 6536162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.comstring MinidumpProcessor::GetCrashReason(Minidump *dump, uint64_t *address) { 654e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai MinidumpException *exception = dump->GetException(); 655e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai if (!exception) 656e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai return ""; 657e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai 658e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai const MDRawExceptionStream *raw_exception = exception->exception(); 659e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai if (!raw_exception) 660e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai return ""; 661e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai 662e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai if (address) 663e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai *address = raw_exception->exception_record.exception_address; 664e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai 665e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai // The reason value is OS-specific and possibly CPU-specific. Set up 666e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai // sensible numeric defaults for the reason string in case we can't 667e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai // map the codes to a string (because there's no system info, or because 668e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai // it's an unrecognized platform, or because it's an unrecognized code.) 669e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai char reason_string[24]; 6706162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com uint32_t exception_code = raw_exception->exception_record.exception_code; 6716162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com uint32_t exception_flags = raw_exception->exception_record.exception_flags; 672e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai snprintf(reason_string, sizeof(reason_string), "0x%08x / 0x%08x", 673daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis exception_code, exception_flags); 674e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai string reason = reason_string; 675e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai 676e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai const MDRawSystemInfo *raw_system_info = GetSystemInfo(dump, NULL); 677e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai if (!raw_system_info) 678e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai return reason; 679e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai 68080e98391dc7ff361355e72c24c0fb222518bcdfcmmentovai switch (raw_system_info->platform_id) { 68163f97ad134db3fa175c489b50b66a79bf0c95025qsr@chromium.org case MD_OS_MAC_OS_X: 68263f97ad134db3fa175c489b50b66a79bf0c95025qsr@chromium.org case MD_OS_IOS: { 683daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis char flags_string[11]; 684daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis snprintf(flags_string, sizeof(flags_string), "0x%08x", exception_flags); 685daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis switch (exception_code) { 686daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_MAC_BAD_ACCESS: 687daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason = "EXC_BAD_ACCESS / "; 688daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis switch (exception_flags) { 689daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_CODE_MAC_INVALID_ADDRESS: 690daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append("KERN_INVALID_ADDRESS"); 691daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 692daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_CODE_MAC_PROTECTION_FAILURE: 693daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append("KERN_PROTECTION_FAILURE"); 694daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 695daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_CODE_MAC_NO_ACCESS: 696daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append("KERN_NO_ACCESS"); 697daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 698daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_CODE_MAC_MEMORY_FAILURE: 699daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append("KERN_MEMORY_FAILURE"); 700daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 701daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_CODE_MAC_MEMORY_ERROR: 702daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append("KERN_MEMORY_ERROR"); 703daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 704daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis default: 70515621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org // arm and ppc overlap 70615621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org if (raw_system_info->processor_architecture == 70739d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org MD_CPU_ARCHITECTURE_ARM || 70839d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org raw_system_info->processor_architecture == 70939d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org MD_CPU_ARCHITECTURE_ARM64) { 71015621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org switch (exception_flags) { 71115621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org case MD_EXCEPTION_CODE_MAC_ARM_DA_ALIGN: 71215621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org reason.append("EXC_ARM_DA_ALIGN"); 71315621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org break; 71415621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org case MD_EXCEPTION_CODE_MAC_ARM_DA_DEBUG: 71515621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org reason.append("EXC_ARM_DA_DEBUG"); 71615621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org break; 71715621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org default: 71815621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org reason.append(flags_string); 71915621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org BPLOG(INFO) << "Unknown exception reason " << reason; 72015621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org break; 72115621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org } 72215621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org } else if (raw_system_info->processor_architecture == 72315621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org MD_CPU_ARCHITECTURE_PPC) { 72415621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org switch (exception_flags) { 72515621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org case MD_EXCEPTION_CODE_MAC_PPC_VM_PROT_READ: 72615621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org reason.append("EXC_PPC_VM_PROT_READ"); 72715621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org break; 72815621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org case MD_EXCEPTION_CODE_MAC_PPC_BADSPACE: 72915621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org reason.append("EXC_PPC_BADSPACE"); 73015621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org break; 73115621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org case MD_EXCEPTION_CODE_MAC_PPC_UNALIGNED: 73215621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org reason.append("EXC_PPC_UNALIGNED"); 73315621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org break; 73415621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org default: 73515621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org reason.append(flags_string); 73615621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org BPLOG(INFO) << "Unknown exception reason " << reason; 73715621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org break; 73815621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org } 73915621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org } else { 74015621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org reason.append(flags_string); 74115621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org BPLOG(INFO) << "Unknown exception reason " << reason; 74215621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org } 743daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 744daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis } 745daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 746daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_MAC_BAD_INSTRUCTION: 747daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason = "EXC_BAD_INSTRUCTION / "; 748daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis switch (raw_system_info->processor_architecture) { 74939d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org case MD_CPU_ARCHITECTURE_ARM: 75039d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org case MD_CPU_ARCHITECTURE_ARM64: { 75115621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org switch (exception_flags) { 75215621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org case MD_EXCEPTION_CODE_MAC_ARM_UNDEFINED: 75315621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org reason.append("EXC_ARM_UNDEFINED"); 75415621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org break; 75515621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org default: 75615621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org reason.append(flags_string); 75715621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org BPLOG(INFO) << "Unknown exception reason " << reason; 75815621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org break; 75915621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org } 76015621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org break; 76115621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org } 762daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_CPU_ARCHITECTURE_PPC: { 763daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis switch (exception_flags) { 764daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_CODE_MAC_PPC_INVALID_SYSCALL: 765daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append("EXC_PPC_INVALID_SYSCALL"); 766daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 767daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_CODE_MAC_PPC_UNIMPLEMENTED_INSTRUCTION: 768daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append("EXC_PPC_UNIPL_INST"); 769daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 770daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_CODE_MAC_PPC_PRIVILEGED_INSTRUCTION: 771daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append("EXC_PPC_PRIVINST"); 772daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 773daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_CODE_MAC_PPC_PRIVILEGED_REGISTER: 774daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append("EXC_PPC_PRIVREG"); 775daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 776daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_CODE_MAC_PPC_TRACE: 777daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append("EXC_PPC_TRACE"); 778daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 779daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_CODE_MAC_PPC_PERFORMANCE_MONITOR: 780daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append("EXC_PPC_PERFMON"); 781daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 782daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis default: 783daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append(flags_string); 784af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai BPLOG(INFO) << "Unknown exception reason " << reason; 785daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 786daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis } 787daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 788daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis } 789daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_CPU_ARCHITECTURE_X86: { 790daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis switch (exception_flags) { 791daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_CODE_MAC_X86_INVALID_OPERATION: 792daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append("EXC_I386_INVOP"); 793daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 794daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_CODE_MAC_X86_INVALID_TASK_STATE_SEGMENT: 795daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append("EXC_INVTSSFLT"); 796daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 797daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_CODE_MAC_X86_SEGMENT_NOT_PRESENT: 798daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append("EXC_SEGNPFLT"); 799daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 800daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_CODE_MAC_X86_STACK_FAULT: 801daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append("EXC_STKFLT"); 802daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 803daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_CODE_MAC_X86_GENERAL_PROTECTION_FAULT: 804daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append("EXC_GPFLT"); 805daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 806daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_CODE_MAC_X86_ALIGNMENT_FAULT: 807daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append("EXC_ALIGNFLT"); 808daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 809daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis default: 810daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append(flags_string); 811af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai BPLOG(INFO) << "Unknown exception reason " << reason; 812daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 813daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis } 814daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 815daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis } 816daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis default: 817daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append(flags_string); 818af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai BPLOG(INFO) << "Unknown exception reason " << reason; 819daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 820daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis } 821daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 822daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_MAC_ARITHMETIC: 823daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason = "EXC_ARITHMETIC / "; 824daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis switch (raw_system_info->processor_architecture) { 825daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_CPU_ARCHITECTURE_PPC: { 826daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis switch (exception_flags) { 827daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_CODE_MAC_PPC_OVERFLOW: 828daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append("EXC_PPC_OVERFLOW"); 829daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 830daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_CODE_MAC_PPC_ZERO_DIVIDE: 831daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append("EXC_PPC_ZERO_DIVIDE"); 832daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 833daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_CODE_MAC_PPC_FLOAT_INEXACT: 834daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append("EXC_FLT_INEXACT"); 835daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 836daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_CODE_MAC_PPC_FLOAT_ZERO_DIVIDE: 837daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append("EXC_PPC_FLT_ZERO_DIVIDE"); 838daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 839daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_CODE_MAC_PPC_FLOAT_UNDERFLOW: 840daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append("EXC_PPC_FLT_UNDERFLOW"); 841daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 842daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_CODE_MAC_PPC_FLOAT_OVERFLOW: 843daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append("EXC_PPC_FLT_OVERFLOW"); 844daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 845daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_CODE_MAC_PPC_FLOAT_NOT_A_NUMBER: 846daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append("EXC_PPC_FLT_NOT_A_NUMBER"); 847daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 848daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_CODE_MAC_PPC_NO_EMULATION: 849daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append("EXC_PPC_NOEMULATION"); 850daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 851daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_CODE_MAC_PPC_ALTIVEC_ASSIST: 852daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append("EXC_PPC_ALTIVECASSIST"); 853daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis default: 854daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append(flags_string); 855af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai BPLOG(INFO) << "Unknown exception reason " << reason; 856daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 857daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis } 858daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 859daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis } 860daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_CPU_ARCHITECTURE_X86: { 861daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis switch (exception_flags) { 862daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_CODE_MAC_X86_DIV: 863daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append("EXC_I386_DIV"); 864daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 865daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_CODE_MAC_X86_INTO: 866daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append("EXC_I386_INTO"); 867daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 868daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_CODE_MAC_X86_NOEXT: 869daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append("EXC_I386_NOEXT"); 870daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 871daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_CODE_MAC_X86_EXTOVR: 872daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append("EXC_I386_EXTOVR"); 873daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 874daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_CODE_MAC_X86_EXTERR: 875daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append("EXC_I386_EXTERR"); 876daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 877daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_CODE_MAC_X86_EMERR: 878daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append("EXC_I386_EMERR"); 879daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 880daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_CODE_MAC_X86_BOUND: 881daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append("EXC_I386_BOUND"); 882daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 883daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_CODE_MAC_X86_SSEEXTERR: 884daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append("EXC_I386_SSEEXTERR"); 885daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 886daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis default: 887daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append(flags_string); 888af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai BPLOG(INFO) << "Unknown exception reason " << reason; 889daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 890daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis } 891daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 892daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis } 893daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis default: 894daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append(flags_string); 895af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai BPLOG(INFO) << "Unknown exception reason " << reason; 896daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 897daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis } 898daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 899daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_MAC_EMULATION: 900daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason = "EXC_EMULATION / "; 901daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append(flags_string); 902daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 903daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_MAC_SOFTWARE: 904daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason = "EXC_SOFTWARE / "; 905daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis switch (exception_flags) { 906f0eb3f0038c8459517fe31703d0f58dcf9424a7cqsr@chromium.org case MD_EXCEPTION_CODE_MAC_ABORT: 907f0eb3f0038c8459517fe31703d0f58dcf9424a7cqsr@chromium.org reason.append("SIGABRT"); 908f0eb3f0038c8459517fe31703d0f58dcf9424a7cqsr@chromium.org break; 909f0eb3f0038c8459517fe31703d0f58dcf9424a7cqsr@chromium.org case MD_EXCEPTION_CODE_MAC_NS_EXCEPTION: 910f0eb3f0038c8459517fe31703d0f58dcf9424a7cqsr@chromium.org reason.append("UNCAUGHT_NS_EXCEPTION"); 911f0eb3f0038c8459517fe31703d0f58dcf9424a7cqsr@chromium.org break; 912daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis // These are ppc only but shouldn't be a problem as they're 913daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis // unused on x86 914daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_CODE_MAC_PPC_TRAP: 915daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append("EXC_PPC_TRAP"); 916daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 917daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_CODE_MAC_PPC_MIGRATE: 918daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append("EXC_PPC_MIGRATE"); 919daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 920daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis default: 921daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append(flags_string); 922af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai BPLOG(INFO) << "Unknown exception reason " << reason; 923daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 924daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis } 925daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 926daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_MAC_BREAKPOINT: 927daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason = "EXC_BREAKPOINT / "; 928daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis switch (raw_system_info->processor_architecture) { 92939d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org case MD_CPU_ARCHITECTURE_ARM: 93039d7964df5d3ba7c3889bf19004f6e18eee5cfc6mark@chromium.org case MD_CPU_ARCHITECTURE_ARM64: { 93115621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org switch (exception_flags) { 93215621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org case MD_EXCEPTION_CODE_MAC_ARM_DA_ALIGN: 93315621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org reason.append("EXC_ARM_DA_ALIGN"); 93415621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org break; 93515621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org case MD_EXCEPTION_CODE_MAC_ARM_DA_DEBUG: 93615621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org reason.append("EXC_ARM_DA_DEBUG"); 93715621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org break; 93815621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org case MD_EXCEPTION_CODE_MAC_ARM_BREAKPOINT: 93915621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org reason.append("EXC_ARM_BREAKPOINT"); 94015621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org break; 94115621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org default: 94215621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org reason.append(flags_string); 94315621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org BPLOG(INFO) << "Unknown exception reason " << reason; 94415621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org break; 94515621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org } 94615621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org break; 94715621fac836a9f825c3360a9f4f9ef2c48f51a56qsr@chromium.org } 948daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_CPU_ARCHITECTURE_PPC: { 949daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis switch (exception_flags) { 950daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_CODE_MAC_PPC_BREAKPOINT: 951daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append("EXC_PPC_BREAKPOINT"); 952daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 953daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis default: 954daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append(flags_string); 955af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai BPLOG(INFO) << "Unknown exception reason " << reason; 956daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 957daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis } 958daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 959daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis } 960daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_CPU_ARCHITECTURE_X86: { 961daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis switch (exception_flags) { 962daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_CODE_MAC_X86_SGL: 963daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append("EXC_I386_SGL"); 964daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 965daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_CODE_MAC_X86_BPT: 966daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append("EXC_I386_BPT"); 967daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 968daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis default: 969daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append(flags_string); 970af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai BPLOG(INFO) << "Unknown exception reason " << reason; 971daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 972daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis } 973daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 974daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis } 975daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis default: 976daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append(flags_string); 977af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai BPLOG(INFO) << "Unknown exception reason " << reason; 978daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 979daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis } 980daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 981daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_MAC_SYSCALL: 982daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason = "EXC_SYSCALL / "; 983daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append(flags_string); 984daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 985daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_MAC_MACH_SYSCALL: 986daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason = "EXC_MACH_SYSCALL / "; 987daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append(flags_string); 988daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 989daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis case MD_EXCEPTION_MAC_RPC_ALERT: 990daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason = "EXC_RPC_ALERT / "; 991daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis reason.append(flags_string); 992daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 993daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis } 994daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis break; 995daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis } 996daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis 997e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai case MD_OS_WIN32_NT: 998e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai case MD_OS_WIN32_WINDOWS: { 999daf4211942bcdc2356faf4fda699eba9fd3305b6waylonis switch (exception_code) { 1000e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai case MD_EXCEPTION_CODE_WIN_CONTROL_C: 1001e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai reason = "DBG_CONTROL_C"; 1002e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai break; 1003e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai case MD_EXCEPTION_CODE_WIN_GUARD_PAGE_VIOLATION: 1004e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai reason = "EXCEPTION_GUARD_PAGE"; 1005e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai break; 1006e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai case MD_EXCEPTION_CODE_WIN_DATATYPE_MISALIGNMENT: 1007e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai reason = "EXCEPTION_DATATYPE_MISALIGNMENT"; 1008e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai break; 1009e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai case MD_EXCEPTION_CODE_WIN_BREAKPOINT: 1010e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai reason = "EXCEPTION_BREAKPOINT"; 1011e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai break; 1012e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai case MD_EXCEPTION_CODE_WIN_SINGLE_STEP: 1013e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai reason = "EXCEPTION_SINGLE_STEP"; 1014e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai break; 1015e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai case MD_EXCEPTION_CODE_WIN_ACCESS_VIOLATION: 1016e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai // For EXCEPTION_ACCESS_VIOLATION, Windows puts the address that 1017e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai // caused the fault in exception_information[1]. 1018e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai // exception_information[0] is 0 if the violation was caused by 10197dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org // an attempt to read data, 1 if it was an attempt to write data, 10207dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org // and 8 if this was a data execution violation. 1021e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai // This information is useful in addition to the code address, which 1022e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai // will be present in the crash thread's instruction field anyway. 10234f182c746bccc64a141cd4bbda4d3d901ef013cenealsid if (raw_exception->exception_record.number_parameters >= 1) { 1024cec12872c403314261e151cf2fa4505ae1affaf6cdn@chromium.org MDAccessViolationTypeWin av_type = 1025cec12872c403314261e151cf2fa4505ae1affaf6cdn@chromium.org static_cast<MDAccessViolationTypeWin> 1026cec12872c403314261e151cf2fa4505ae1affaf6cdn@chromium.org (raw_exception->exception_record.exception_information[0]); 1027cec12872c403314261e151cf2fa4505ae1affaf6cdn@chromium.org switch (av_type) { 1028cec12872c403314261e151cf2fa4505ae1affaf6cdn@chromium.org case MD_ACCESS_VIOLATION_WIN_READ: 10294f182c746bccc64a141cd4bbda4d3d901ef013cenealsid reason = "EXCEPTION_ACCESS_VIOLATION_READ"; 10304f182c746bccc64a141cd4bbda4d3d901ef013cenealsid break; 1031cec12872c403314261e151cf2fa4505ae1affaf6cdn@chromium.org case MD_ACCESS_VIOLATION_WIN_WRITE: 10324f182c746bccc64a141cd4bbda4d3d901ef013cenealsid reason = "EXCEPTION_ACCESS_VIOLATION_WRITE"; 10334f182c746bccc64a141cd4bbda4d3d901ef013cenealsid break; 1034cec12872c403314261e151cf2fa4505ae1affaf6cdn@chromium.org case MD_ACCESS_VIOLATION_WIN_EXEC: 10354f182c746bccc64a141cd4bbda4d3d901ef013cenealsid reason = "EXCEPTION_ACCESS_VIOLATION_EXEC"; 10364f182c746bccc64a141cd4bbda4d3d901ef013cenealsid break; 10374f182c746bccc64a141cd4bbda4d3d901ef013cenealsid default: 10384f182c746bccc64a141cd4bbda4d3d901ef013cenealsid reason = "EXCEPTION_ACCESS_VIOLATION"; 10394f182c746bccc64a141cd4bbda4d3d901ef013cenealsid break; 10404f182c746bccc64a141cd4bbda4d3d901ef013cenealsid } 10414f182c746bccc64a141cd4bbda4d3d901ef013cenealsid } else { 10424f182c746bccc64a141cd4bbda4d3d901ef013cenealsid reason = "EXCEPTION_ACCESS_VIOLATION"; 10434f182c746bccc64a141cd4bbda4d3d901ef013cenealsid } 1044e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai if (address && 1045e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai raw_exception->exception_record.number_parameters >= 2) { 1046e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai *address = 1047e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai raw_exception->exception_record.exception_information[1]; 1048e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai } 1049e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai break; 1050e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai case MD_EXCEPTION_CODE_WIN_IN_PAGE_ERROR: 10517dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org // For EXCEPTION_IN_PAGE_ERROR, Windows puts the address that 10527dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org // caused the fault in exception_information[1]. 10537dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org // exception_information[0] is 0 if the violation was caused by 10547dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org // an attempt to read data, 1 if it was an attempt to write data, 10557dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org // and 8 if this was a data execution violation. 10567dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org // exception_information[2] contains the underlying NTSTATUS code, 10577dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org // which is the explanation for why this error occured. 10587dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org // This information is useful in addition to the code address, which 10597dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org // will be present in the crash thread's instruction field anyway. 10607dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org if (raw_exception->exception_record.number_parameters >= 1) { 10617dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org MDInPageErrorTypeWin av_type = 10627dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org static_cast<MDInPageErrorTypeWin> 10637dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org (raw_exception->exception_record.exception_information[0]); 10647dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org switch (av_type) { 10657dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org case MD_IN_PAGE_ERROR_WIN_READ: 10667dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org reason = "EXCEPTION_IN_PAGE_ERROR_READ"; 10677dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org break; 10687dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org case MD_IN_PAGE_ERROR_WIN_WRITE: 10697dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org reason = "EXCEPTION_IN_PAGE_ERROR_WRITE"; 10707dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org break; 10717dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org case MD_IN_PAGE_ERROR_WIN_EXEC: 10727dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org reason = "EXCEPTION_IN_PAGE_ERROR_EXEC"; 10737dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org break; 10747dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org default: 10757dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org reason = "EXCEPTION_IN_PAGE_ERROR"; 10767dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org break; 10777dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org } 10787dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org } else { 10797dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org reason = "EXCEPTION_IN_PAGE_ERROR"; 10807dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org } 10817dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org if (address && 10827dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org raw_exception->exception_record.number_parameters >= 2) { 10837dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org *address = 10847dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org raw_exception->exception_record.exception_information[1]; 10857dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org } 10867dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org if (raw_exception->exception_record.number_parameters >= 3) { 10877dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org uint32_t ntstatus = 10887dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org static_cast<uint32_t> 10897dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org (raw_exception->exception_record.exception_information[2]); 10907dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org reason.append(" / "); 10917dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org reason.append(NTStatusToString(ntstatus)); 10927dc7b794926815b45e47c0ae4c955206e34bc175mark@chromium.org } 1093e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai break; 1094e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai case MD_EXCEPTION_CODE_WIN_INVALID_HANDLE: 1095e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai reason = "EXCEPTION_INVALID_HANDLE"; 1096e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai break; 1097e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai case MD_EXCEPTION_CODE_WIN_ILLEGAL_INSTRUCTION: 1098e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai reason = "EXCEPTION_ILLEGAL_INSTRUCTION"; 1099e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai break; 1100e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai case MD_EXCEPTION_CODE_WIN_NONCONTINUABLE_EXCEPTION: 1101e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai reason = "EXCEPTION_NONCONTINUABLE_EXCEPTION"; 1102e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai break; 1103e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai case MD_EXCEPTION_CODE_WIN_INVALID_DISPOSITION: 1104e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai reason = "EXCEPTION_INVALID_DISPOSITION"; 1105e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai break; 1106e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai case MD_EXCEPTION_CODE_WIN_ARRAY_BOUNDS_EXCEEDED: 1107e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai reason = "EXCEPTION_BOUNDS_EXCEEDED"; 1108e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai break; 1109e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai case MD_EXCEPTION_CODE_WIN_FLOAT_DENORMAL_OPERAND: 1110e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai reason = "EXCEPTION_FLT_DENORMAL_OPERAND"; 1111e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai break; 1112e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai case MD_EXCEPTION_CODE_WIN_FLOAT_DIVIDE_BY_ZERO: 1113e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai reason = "EXCEPTION_FLT_DIVIDE_BY_ZERO"; 1114e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai break; 1115e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai case MD_EXCEPTION_CODE_WIN_FLOAT_INEXACT_RESULT: 1116e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai reason = "EXCEPTION_FLT_INEXACT_RESULT"; 1117e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai break; 1118e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai case MD_EXCEPTION_CODE_WIN_FLOAT_INVALID_OPERATION: 1119e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai reason = "EXCEPTION_FLT_INVALID_OPERATION"; 1120e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai break; 1121e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai case MD_EXCEPTION_CODE_WIN_FLOAT_OVERFLOW: 1122e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai reason = "EXCEPTION_FLT_OVERFLOW"; 1123e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai break; 1124e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai case MD_EXCEPTION_CODE_WIN_FLOAT_STACK_CHECK: 1125e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai reason = "EXCEPTION_FLT_STACK_CHECK"; 1126e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai break; 1127e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai case MD_EXCEPTION_CODE_WIN_FLOAT_UNDERFLOW: 1128e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai reason = "EXCEPTION_FLT_UNDERFLOW"; 1129e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai break; 1130e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai case MD_EXCEPTION_CODE_WIN_INTEGER_DIVIDE_BY_ZERO: 1131e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai reason = "EXCEPTION_INT_DIVIDE_BY_ZERO"; 1132e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai break; 1133e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai case MD_EXCEPTION_CODE_WIN_INTEGER_OVERFLOW: 1134e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai reason = "EXCEPTION_INT_OVERFLOW"; 1135e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai break; 1136e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai case MD_EXCEPTION_CODE_WIN_PRIVILEGED_INSTRUCTION: 1137e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai reason = "EXCEPTION_PRIV_INSTRUCTION"; 1138e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai break; 1139e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai case MD_EXCEPTION_CODE_WIN_STACK_OVERFLOW: 1140e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai reason = "EXCEPTION_STACK_OVERFLOW"; 1141e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai break; 1142e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai case MD_EXCEPTION_CODE_WIN_POSSIBLE_DEADLOCK: 1143e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai reason = "EXCEPTION_POSSIBLE_DEADLOCK"; 1144e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai break; 11454f182c746bccc64a141cd4bbda4d3d901ef013cenealsid case MD_EXCEPTION_CODE_WIN_STACK_BUFFER_OVERRUN: 11464f182c746bccc64a141cd4bbda4d3d901ef013cenealsid reason = "EXCEPTION_STACK_BUFFER_OVERRUN"; 11474f182c746bccc64a141cd4bbda4d3d901ef013cenealsid break; 11484f182c746bccc64a141cd4bbda4d3d901ef013cenealsid case MD_EXCEPTION_CODE_WIN_HEAP_CORRUPTION: 11494f182c746bccc64a141cd4bbda4d3d901ef013cenealsid reason = "EXCEPTION_HEAP_CORRUPTION"; 11504f182c746bccc64a141cd4bbda4d3d901ef013cenealsid break; 1151b2bc3bcc845b59c12db49feead091faebd6d116bted.mielczarek case MD_EXCEPTION_CODE_WIN_UNHANDLED_CPP_EXCEPTION: 1152cec12872c403314261e151cf2fa4505ae1affaf6cdn@chromium.org reason = "Unhandled C++ Exception"; 1153cec12872c403314261e151cf2fa4505ae1affaf6cdn@chromium.org break; 1154af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai default: 1155af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai BPLOG(INFO) << "Unknown exception reason " << reason; 1156af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai break; 1157e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai } 1158af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai break; 1159278946c3b551078e0431b5920f113169a9ee8cd4mmentovai } 1160b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek 11615187de1ae5cb7df2343b650416aa805084bdf8dadigit@chromium.org case MD_OS_ANDROID: 1162278946c3b551078e0431b5920f113169a9ee8cd4mmentovai case MD_OS_LINUX: { 1163b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek switch (exception_code) { 1164b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek case MD_EXCEPTION_CODE_LIN_SIGHUP: 1165b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek reason = "SIGHUP"; 1166b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek break; 1167b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek case MD_EXCEPTION_CODE_LIN_SIGINT: 1168b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek reason = "SIGINT"; 1169b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek break; 1170b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek case MD_EXCEPTION_CODE_LIN_SIGQUIT: 1171b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek reason = "SIGQUIT"; 1172b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek break; 1173b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek case MD_EXCEPTION_CODE_LIN_SIGILL: 1174b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek reason = "SIGILL"; 1175b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek break; 1176b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek case MD_EXCEPTION_CODE_LIN_SIGTRAP: 1177b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek reason = "SIGTRAP"; 1178b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek break; 1179b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek case MD_EXCEPTION_CODE_LIN_SIGABRT: 1180b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek reason = "SIGABRT"; 1181b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek break; 1182b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek case MD_EXCEPTION_CODE_LIN_SIGBUS: 1183b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek reason = "SIGBUS"; 1184b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek break; 1185b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek case MD_EXCEPTION_CODE_LIN_SIGFPE: 1186b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek reason = "SIGFPE"; 1187b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek break; 1188b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek case MD_EXCEPTION_CODE_LIN_SIGKILL: 1189b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek reason = "SIGKILL"; 1190b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek break; 1191b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek case MD_EXCEPTION_CODE_LIN_SIGUSR1: 1192b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek reason = "SIGUSR1"; 1193b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek break; 1194b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek case MD_EXCEPTION_CODE_LIN_SIGSEGV: 1195b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek reason = "SIGSEGV"; 1196b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek break; 1197b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek case MD_EXCEPTION_CODE_LIN_SIGUSR2: 1198b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek reason = "SIGUSR2"; 1199b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek break; 1200b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek case MD_EXCEPTION_CODE_LIN_SIGPIPE: 1201b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek reason = "SIGPIPE"; 1202b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek break; 1203b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek case MD_EXCEPTION_CODE_LIN_SIGALRM: 1204b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek reason = "SIGALRM"; 1205b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek break; 1206b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek case MD_EXCEPTION_CODE_LIN_SIGTERM: 1207b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek reason = "SIGTERM"; 1208b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek break; 1209b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek case MD_EXCEPTION_CODE_LIN_SIGSTKFLT: 1210b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek reason = "SIGSTKFLT"; 1211b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek break; 1212b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek case MD_EXCEPTION_CODE_LIN_SIGCHLD: 1213b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek reason = "SIGCHLD"; 1214b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek break; 1215b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek case MD_EXCEPTION_CODE_LIN_SIGCONT: 1216b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek reason = "SIGCONT"; 1217b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek break; 1218b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek case MD_EXCEPTION_CODE_LIN_SIGSTOP: 1219b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek reason = "SIGSTOP"; 1220b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek break; 1221b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek case MD_EXCEPTION_CODE_LIN_SIGTSTP: 1222b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek reason = "SIGTSTP"; 1223b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek break; 1224b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek case MD_EXCEPTION_CODE_LIN_SIGTTIN: 1225b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek reason = "SIGTTIN"; 1226b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek break; 1227b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek case MD_EXCEPTION_CODE_LIN_SIGTTOU: 1228b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek reason = "SIGTTOU"; 1229b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek break; 1230b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek case MD_EXCEPTION_CODE_LIN_SIGURG: 1231b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek reason = "SIGURG"; 1232b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek break; 1233b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek case MD_EXCEPTION_CODE_LIN_SIGXCPU: 1234b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek reason = "SIGXCPU"; 1235b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek break; 1236b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek case MD_EXCEPTION_CODE_LIN_SIGXFSZ: 1237b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek reason = "SIGXFSZ"; 1238b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek break; 1239b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek case MD_EXCEPTION_CODE_LIN_SIGVTALRM: 1240b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek reason = "SIGVTALRM"; 1241b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek break; 1242b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek case MD_EXCEPTION_CODE_LIN_SIGPROF: 1243b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek reason = "SIGPROF"; 1244b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek break; 1245b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek case MD_EXCEPTION_CODE_LIN_SIGWINCH: 1246b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek reason = "SIGWINCH"; 1247b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek break; 1248b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek case MD_EXCEPTION_CODE_LIN_SIGIO: 1249b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek reason = "SIGIO"; 1250b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek break; 1251b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek case MD_EXCEPTION_CODE_LIN_SIGPWR: 1252b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek reason = "SIGPWR"; 1253b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek break; 1254b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek case MD_EXCEPTION_CODE_LIN_SIGSYS: 1255b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek reason = "SIGSYS"; 1256b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek break; 1257f092d39bfc1090285476784307a10881702179fbted.mielczarek@gmail.com case MD_EXCEPTION_CODE_LIN_DUMP_REQUESTED: 1258f092d39bfc1090285476784307a10881702179fbted.mielczarek@gmail.com reason = "DUMP_REQUESTED"; 1259f092d39bfc1090285476784307a10881702179fbted.mielczarek@gmail.com break; 1260b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek default: 1261b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek BPLOG(INFO) << "Unknown exception reason " << reason; 1262b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek break; 1263b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek } 1264b5c78cc8d1bdbd96a0d31750cd35d2475752c7a0ted.mielczarek break; 1265af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai } 1266af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai 1267ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai case MD_OS_SOLARIS: { 1268ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai switch (exception_code) { 1269ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai case MD_EXCEPTION_CODE_SOL_SIGHUP: 1270ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai reason = "SIGHUP"; 1271ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai break; 1272ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai case MD_EXCEPTION_CODE_SOL_SIGINT: 1273ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai reason = "SIGINT"; 1274ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai break; 1275ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai case MD_EXCEPTION_CODE_SOL_SIGQUIT: 1276ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai reason = "SIGQUIT"; 1277b56cfa067add059d0894433393e798fe0604970enealsid break; 1278ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai case MD_EXCEPTION_CODE_SOL_SIGILL: 1279ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai reason = "SIGILL"; 1280b56cfa067add059d0894433393e798fe0604970enealsid break; 1281ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai case MD_EXCEPTION_CODE_SOL_SIGTRAP: 1282ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai reason = "SIGTRAP"; 1283b56cfa067add059d0894433393e798fe0604970enealsid break; 1284ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai case MD_EXCEPTION_CODE_SOL_SIGIOT: 1285ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai reason = "SIGIOT | SIGABRT"; 1286b56cfa067add059d0894433393e798fe0604970enealsid break; 1287ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai case MD_EXCEPTION_CODE_SOL_SIGEMT: 1288ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai reason = "SIGEMT"; 1289b56cfa067add059d0894433393e798fe0604970enealsid break; 1290ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai case MD_EXCEPTION_CODE_SOL_SIGFPE: 1291ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai reason = "SIGFPE"; 1292b56cfa067add059d0894433393e798fe0604970enealsid break; 1293ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai case MD_EXCEPTION_CODE_SOL_SIGKILL: 1294ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai reason = "SIGKILL"; 1295b56cfa067add059d0894433393e798fe0604970enealsid break; 1296ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai case MD_EXCEPTION_CODE_SOL_SIGBUS: 1297ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai reason = "SIGBUS"; 1298b56cfa067add059d0894433393e798fe0604970enealsid break; 1299ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai case MD_EXCEPTION_CODE_SOL_SIGSEGV: 1300ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai reason = "SIGSEGV"; 1301b56cfa067add059d0894433393e798fe0604970enealsid break; 1302ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai case MD_EXCEPTION_CODE_SOL_SIGSYS: 1303ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai reason = "SIGSYS"; 1304b56cfa067add059d0894433393e798fe0604970enealsid break; 1305ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai case MD_EXCEPTION_CODE_SOL_SIGPIPE: 1306ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai reason = "SIGPIPE"; 1307b56cfa067add059d0894433393e798fe0604970enealsid break; 1308ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai case MD_EXCEPTION_CODE_SOL_SIGALRM: 1309ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai reason = "SIGALRM"; 1310b56cfa067add059d0894433393e798fe0604970enealsid break; 1311ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai case MD_EXCEPTION_CODE_SOL_SIGTERM: 1312ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai reason = "SIGTERM"; 1313b56cfa067add059d0894433393e798fe0604970enealsid break; 1314ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai case MD_EXCEPTION_CODE_SOL_SIGUSR1: 1315ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai reason = "SIGUSR1"; 1316b56cfa067add059d0894433393e798fe0604970enealsid break; 1317ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai case MD_EXCEPTION_CODE_SOL_SIGUSR2: 1318ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai reason = "SIGUSR2"; 1319b56cfa067add059d0894433393e798fe0604970enealsid break; 1320ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai case MD_EXCEPTION_CODE_SOL_SIGCLD: 1321ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai reason = "SIGCLD | SIGCHLD"; 1322b56cfa067add059d0894433393e798fe0604970enealsid break; 1323ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai case MD_EXCEPTION_CODE_SOL_SIGPWR: 1324ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai reason = "SIGPWR"; 1325b56cfa067add059d0894433393e798fe0604970enealsid break; 1326ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai case MD_EXCEPTION_CODE_SOL_SIGWINCH: 1327ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai reason = "SIGWINCH"; 1328b56cfa067add059d0894433393e798fe0604970enealsid break; 1329ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai case MD_EXCEPTION_CODE_SOL_SIGURG: 1330ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai reason = "SIGURG"; 1331b56cfa067add059d0894433393e798fe0604970enealsid break; 1332ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai case MD_EXCEPTION_CODE_SOL_SIGPOLL: 1333ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai reason = "SIGPOLL | SIGIO"; 1334b56cfa067add059d0894433393e798fe0604970enealsid break; 1335ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai case MD_EXCEPTION_CODE_SOL_SIGSTOP: 1336ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai reason = "SIGSTOP"; 1337b56cfa067add059d0894433393e798fe0604970enealsid break; 1338ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai case MD_EXCEPTION_CODE_SOL_SIGTSTP: 1339ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai reason = "SIGTSTP"; 1340b56cfa067add059d0894433393e798fe0604970enealsid break; 1341ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai case MD_EXCEPTION_CODE_SOL_SIGCONT: 1342ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai reason = "SIGCONT"; 1343b56cfa067add059d0894433393e798fe0604970enealsid break; 1344ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai case MD_EXCEPTION_CODE_SOL_SIGTTIN: 1345ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai reason = "SIGTTIN"; 1346b56cfa067add059d0894433393e798fe0604970enealsid break; 1347ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai case MD_EXCEPTION_CODE_SOL_SIGTTOU: 1348ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai reason = "SIGTTOU"; 1349b56cfa067add059d0894433393e798fe0604970enealsid break; 1350ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai case MD_EXCEPTION_CODE_SOL_SIGVTALRM: 1351ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai reason = "SIGVTALRM"; 1352b56cfa067add059d0894433393e798fe0604970enealsid break; 1353ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai case MD_EXCEPTION_CODE_SOL_SIGPROF: 1354ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai reason = "SIGPROF"; 1355b56cfa067add059d0894433393e798fe0604970enealsid break; 1356ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai case MD_EXCEPTION_CODE_SOL_SIGXCPU: 1357ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai reason = "SIGXCPU"; 1358b56cfa067add059d0894433393e798fe0604970enealsid break; 1359ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai case MD_EXCEPTION_CODE_SOL_SIGXFSZ: 1360ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai reason = "SIGXFSZ"; 1361b56cfa067add059d0894433393e798fe0604970enealsid break; 1362ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai case MD_EXCEPTION_CODE_SOL_SIGWAITING: 1363ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai reason = "SIGWAITING"; 1364b56cfa067add059d0894433393e798fe0604970enealsid break; 1365ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai case MD_EXCEPTION_CODE_SOL_SIGLWP: 1366ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai reason = "SIGLWP"; 1367b56cfa067add059d0894433393e798fe0604970enealsid break; 1368ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai case MD_EXCEPTION_CODE_SOL_SIGFREEZE: 1369ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai reason = "SIGFREEZE"; 1370b56cfa067add059d0894433393e798fe0604970enealsid break; 1371ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai case MD_EXCEPTION_CODE_SOL_SIGTHAW: 1372ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai reason = "SIGTHAW"; 1373b56cfa067add059d0894433393e798fe0604970enealsid break; 1374ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai case MD_EXCEPTION_CODE_SOL_SIGCANCEL: 1375ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai reason = "SIGCANCEL"; 1376b56cfa067add059d0894433393e798fe0604970enealsid break; 1377ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai case MD_EXCEPTION_CODE_SOL_SIGLOST: 1378ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai reason = "SIGLOST"; 1379b56cfa067add059d0894433393e798fe0604970enealsid break; 1380ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai case MD_EXCEPTION_CODE_SOL_SIGXRES: 1381ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai reason = "SIGXRES"; 1382b56cfa067add059d0894433393e798fe0604970enealsid break; 1383ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai case MD_EXCEPTION_CODE_SOL_SIGJVM1: 1384ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai reason = "SIGJVM1"; 1385b56cfa067add059d0894433393e798fe0604970enealsid break; 1386ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai case MD_EXCEPTION_CODE_SOL_SIGJVM2: 1387ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai reason = "SIGJVM2"; 1388b56cfa067add059d0894433393e798fe0604970enealsid break; 1389ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai default: 1390ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai BPLOG(INFO) << "Unknown exception reason " << reason; 1391ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai break; 1392ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai } 1393ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai break; 1394ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai } 1395ea2bba970675e01f9964f82d3f44960c1aad05dcmmentovai 1396d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org case MD_OS_PS3: { 1397d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org switch (exception_code) { 1398d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org case MD_EXCEPTION_CODE_PS3_UNKNOWN: 1399d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org reason = "UNKNOWN"; 1400d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org break; 1401d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org case MD_EXCEPTION_CODE_PS3_TRAP_EXCEP: 1402d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org reason = "TRAP_EXCEP"; 1403d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org break; 1404d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org case MD_EXCEPTION_CODE_PS3_PRIV_INSTR: 1405d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org reason = "PRIV_INSTR"; 1406d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org break; 1407d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org case MD_EXCEPTION_CODE_PS3_ILLEGAL_INSTR: 1408d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org reason = "ILLEGAL_INSTR"; 1409d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org break; 1410d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org case MD_EXCEPTION_CODE_PS3_INSTR_STORAGE: 1411d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org reason = "INSTR_STORAGE"; 1412d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org break; 1413d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org case MD_EXCEPTION_CODE_PS3_INSTR_SEGMENT: 1414d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org reason = "INSTR_SEGMENT"; 1415d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org break; 1416d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org case MD_EXCEPTION_CODE_PS3_DATA_STORAGE: 1417d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org reason = "DATA_STORAGE"; 1418d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org break; 1419d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org case MD_EXCEPTION_CODE_PS3_DATA_SEGMENT: 1420d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org reason = "DATA_SEGMENT"; 1421d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org break; 1422d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org case MD_EXCEPTION_CODE_PS3_FLOAT_POINT: 1423d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org reason = "FLOAT_POINT"; 1424d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org break; 1425d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org case MD_EXCEPTION_CODE_PS3_DABR_MATCH: 1426d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org reason = "DABR_MATCH"; 1427d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org break; 1428d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org case MD_EXCEPTION_CODE_PS3_ALIGN_EXCEP: 1429d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org reason = "ALIGN_EXCEP"; 1430d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org break; 1431d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org case MD_EXCEPTION_CODE_PS3_MEMORY_ACCESS: 1432d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org reason = "MEMORY_ACCESS"; 1433d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org break; 1434d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org case MD_EXCEPTION_CODE_PS3_COPRO_ALIGN: 1435d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org reason = "COPRO_ALIGN"; 1436d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org break; 1437d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org case MD_EXCEPTION_CODE_PS3_COPRO_INVALID_COM: 1438d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org reason = "COPRO_INVALID_COM"; 1439d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org break; 1440d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org case MD_EXCEPTION_CODE_PS3_COPRO_ERR: 1441d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org reason = "COPRO_ERR"; 1442d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org break; 1443d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org case MD_EXCEPTION_CODE_PS3_COPRO_FIR: 1444d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org reason = "COPRO_FIR"; 1445d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org break; 1446d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org case MD_EXCEPTION_CODE_PS3_COPRO_DATA_SEGMENT: 1447d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org reason = "COPRO_DATA_SEGMENT"; 1448d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org break; 1449d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org case MD_EXCEPTION_CODE_PS3_COPRO_DATA_STORAGE: 1450d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org reason = "COPRO_DATA_STORAGE"; 1451d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org break; 1452d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org case MD_EXCEPTION_CODE_PS3_COPRO_STOP_INSTR: 1453d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org reason = "COPRO_STOP_INSTR"; 1454d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org break; 1455d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org case MD_EXCEPTION_CODE_PS3_COPRO_HALT_INSTR: 1456d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org reason = "COPRO_HALT_INSTR"; 1457d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org break; 1458d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org case MD_EXCEPTION_CODE_PS3_COPRO_HALTINST_UNKNOWN: 1459d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org reason = "COPRO_HALTINSTR_UNKNOWN"; 1460d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org break; 1461d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org case MD_EXCEPTION_CODE_PS3_COPRO_MEMORY_ACCESS: 1462d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org reason = "COPRO_MEMORY_ACCESS"; 1463d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org break; 1464d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org case MD_EXCEPTION_CODE_PS3_GRAPHIC: 1465d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org reason = "GRAPHIC"; 1466d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org break; 1467d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org default: 1468d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org BPLOG(INFO) << "Unknown exception reason "<< reason; 1469d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org break; 1470d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org } 1471d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org break; 1472d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org } 1473d9b40724ed6a6c243eaef196e617071ec36d4282thestig@chromium.org 1474af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai default: { 1475af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai BPLOG(INFO) << "Unknown exception reason " << reason; 1476af3c43f00e98047bc7f80dcf4c16b876e095769fmmentovai break; 1477e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai } 1478960e5277ee489960c40c50c6222606200419302ammentovai } 1479960e5277ee489960c40c50c6222606200419302ammentovai 1480e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai return reason; 1481d5e66382d10b1570d75e924410d58b47857fe799bryner} 1482d5e66382d10b1570d75e924410d58b47857fe799bryner 14830314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek// static 1484cec12872c403314261e151cf2fa4505ae1affaf6cdn@chromium.orgstring MinidumpProcessor::GetAssertion(Minidump *dump) { 14850314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek MinidumpAssertion *assertion = dump->GetAssertion(); 14860314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek if (!assertion) 14870314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek return ""; 14880314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek 14890314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek const MDRawAssertionInfo *raw_assertion = assertion->assertion(); 14900314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek if (!raw_assertion) 14910314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek return ""; 14920314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek 14930314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek string assertion_string; 14940314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek switch (raw_assertion->type) { 14950314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek case MD_ASSERTION_INFO_TYPE_INVALID_PARAMETER: 14960314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek assertion_string = "Invalid parameter passed to library function"; 14970314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek break; 14980314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek case MD_ASSERTION_INFO_TYPE_PURE_VIRTUAL_CALL: 14990314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek assertion_string = "Pure virtual function called"; 15000314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek break; 15010314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek default: { 15020314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek char assertion_type[32]; 15039753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com snprintf(assertion_type, sizeof(assertion_type), 15049753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com "0x%08x", raw_assertion->type); 15050314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek assertion_string = "Unknown assertion type "; 15060314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek assertion_string += assertion_type; 15070314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek break; 15080314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek } 15090314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek } 15100314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek 15110314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek string expression = assertion->expression(); 15120314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek if (!expression.empty()) { 15130314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek assertion_string.append(" " + expression); 15140314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek } 15150314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek 15160314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek string function = assertion->function(); 15170314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek if (!function.empty()) { 15180314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek assertion_string.append(" in function " + function); 15190314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek } 15200314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek 15210314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek string file = assertion->file(); 15220314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek if (!file.empty()) { 15230314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek assertion_string.append(", in file " + file); 15240314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek } 15250314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek 15260314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek if (raw_assertion->line != 0) { 15270314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek char assertion_line[32]; 15289753aff85a9a20dbe294529b4184d9686ec42cddSiyangXie@gmail.com snprintf(assertion_line, sizeof(assertion_line), "%u", raw_assertion->line); 15290314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek assertion_string.append(" at line "); 15300314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek assertion_string.append(assertion_line); 15310314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek } 15320314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek 15330314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek return assertion_string; 15340314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek} 15350314e487e46a45229e275eb78b09f0538a5a7769ted.mielczarek 1536e5dc60822e5938fea2ae892ccddb906641ba174emmentovai} // namespace google_breakpad 1537