minidump_processor_unittest.cc revision 2ad976ef0ba44f36842b9b7a11848f6b40fd25d5
17daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// Copyright (c) 2006, Google Inc. 27daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// All rights reserved. 3cce3492afc263be86236600d41dca40be7224ee7bryner// 47daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// Redistribution and use in source and binary forms, with or without 57daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// modification, are permitted provided that the following conditions are 67daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// met: 7cce3492afc263be86236600d41dca40be7224ee7bryner// 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. 147daf246e4baf0837e25429668cc23e92b6afe3b3mmentovai// * 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. 17cce3492afc263be86236600d41dca40be7224ee7bryner// 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. 29cce3492afc263be86236600d41dca40be7224ee7bryner 30cce3492afc263be86236600d41dca40be7224ee7bryner// Unit test for MinidumpProcessor. Uses a pre-generated minidump and 31cce3492afc263be86236600d41dca40be7224ee7bryner// corresponding symbol file, and checks the stack frames for correctness. 32cce3492afc263be86236600d41dca40be7224ee7bryner 3397d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai#include <cstdlib> 34cce3492afc263be86236600d41dca40be7224ee7bryner#include <string> 352ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsid#include <iostream> 362ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsid#include <fstream> 37e5dc60822e5938fea2ae892ccddb906641ba174emmentovai#include "google_breakpad/processor/basic_source_line_resolver.h" 38e5dc60822e5938fea2ae892ccddb906641ba174emmentovai#include "google_breakpad/processor/call_stack.h" 39e5dc60822e5938fea2ae892ccddb906641ba174emmentovai#include "google_breakpad/processor/code_module.h" 40e5dc60822e5938fea2ae892ccddb906641ba174emmentovai#include "google_breakpad/processor/code_modules.h" 41e5dc60822e5938fea2ae892ccddb906641ba174emmentovai#include "google_breakpad/processor/minidump_processor.h" 42e5dc60822e5938fea2ae892ccddb906641ba174emmentovai#include "google_breakpad/processor/process_state.h" 43e5dc60822e5938fea2ae892ccddb906641ba174emmentovai#include "google_breakpad/processor/stack_frame.h" 44e5dc60822e5938fea2ae892ccddb906641ba174emmentovai#include "google_breakpad/processor/symbol_supplier.h" 4532b802dba3d49880a0414d066e71cdc20ab09901mmentovai#include "processor/logging.h" 462466d8e993a800a17e00deda2f3a27e0505140e1mmentovai#include "processor/scoped_ptr.h" 47cce3492afc263be86236600d41dca40be7224ee7bryner 488647dde8cc03ef16b565dccc75574ee5f0d9cf72mmentovainamespace { 498647dde8cc03ef16b565dccc75574ee5f0d9cf72mmentovai 50cce3492afc263be86236600d41dca40be7224ee7brynerusing std::string; 51e5dc60822e5938fea2ae892ccddb906641ba174emmentovaiusing google_breakpad::BasicSourceLineResolver; 52e5dc60822e5938fea2ae892ccddb906641ba174emmentovaiusing google_breakpad::CallStack; 53e5dc60822e5938fea2ae892ccddb906641ba174emmentovaiusing google_breakpad::CodeModule; 54e5dc60822e5938fea2ae892ccddb906641ba174emmentovaiusing google_breakpad::MinidumpProcessor; 55e5dc60822e5938fea2ae892ccddb906641ba174emmentovaiusing google_breakpad::ProcessState; 56e5dc60822e5938fea2ae892ccddb906641ba174emmentovaiusing google_breakpad::scoped_ptr; 57e5dc60822e5938fea2ae892ccddb906641ba174emmentovaiusing google_breakpad::SymbolSupplier; 58e5dc60822e5938fea2ae892ccddb906641ba174emmentovaiusing google_breakpad::SystemInfo; 5997d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai 6097d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovaistatic const char *kSystemInfoOS = "Windows NT"; 6197d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovaistatic const char *kSystemInfoOSShort = "windows"; 6297d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovaistatic const char *kSystemInfoOSVersion = "5.1.2600 Service Pack 2"; 6397d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovaistatic const char *kSystemInfoCPU = "x86"; 6497d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovaistatic const char *kSystemInfoCPUInfo = 6597d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai "GenuineIntel family 6 model 13 stepping 8"; 66cce3492afc263be86236600d41dca40be7224ee7bryner 67cce3492afc263be86236600d41dca40be7224ee7bryner#define ASSERT_TRUE(cond) \ 68cce3492afc263be86236600d41dca40be7224ee7bryner if (!(cond)) { \ 69cce3492afc263be86236600d41dca40be7224ee7bryner fprintf(stderr, "FAILED: %s at %s:%d\n", #cond, __FILE__, __LINE__); \ 70cce3492afc263be86236600d41dca40be7224ee7bryner return false; \ 71cce3492afc263be86236600d41dca40be7224ee7bryner } 72cce3492afc263be86236600d41dca40be7224ee7bryner 73db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai#define ASSERT_FALSE(cond) ASSERT_TRUE(!(cond)) 74db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai 75cce3492afc263be86236600d41dca40be7224ee7bryner#define ASSERT_EQ(e1, e2) ASSERT_TRUE((e1) == (e2)) 76cce3492afc263be86236600d41dca40be7224ee7bryner 7797d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai// Use ASSERT_*_ABORT in functions that can't return a boolean. 7897d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai#define ASSERT_TRUE_ABORT(cond) \ 7997d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai if (!(cond)) { \ 8097d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai fprintf(stderr, "FAILED: %s at %s:%d\n", #cond, __FILE__, __LINE__); \ 8197d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai abort(); \ 8297d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai } 8397d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai 8497d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai#define ASSERT_EQ_ABORT(e1, e2) ASSERT_TRUE_ABORT((e1) == (e2)) 8597d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai 86cce3492afc263be86236600d41dca40be7224ee7brynerclass TestSymbolSupplier : public SymbolSupplier { 87cce3492afc263be86236600d41dca40be7224ee7bryner public: 88f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner TestSymbolSupplier() : interrupt_(false) {} 89f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner 90f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner virtual SymbolResult GetSymbolFile(const CodeModule *module, 9197d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai const SystemInfo *system_info, 92f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner string *symbol_file); 93f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner 942ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsid virtual SymbolResult GetSymbolFile(const CodeModule *module, 952ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsid const SystemInfo *system_info, 962ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsid string *symbol_file, 972ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsid string *symbol_data); 982ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsid 99f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner // When set to true, causes the SymbolSupplier to return INTERRUPT 100f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner void set_interrupt(bool interrupt) { interrupt_ = interrupt; } 101f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner 102f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner private: 103f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner bool interrupt_; 104cce3492afc263be86236600d41dca40be7224ee7bryner}; 105cce3492afc263be86236600d41dca40be7224ee7bryner 106f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3brynerSymbolSupplier::SymbolResult TestSymbolSupplier::GetSymbolFile( 10797d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai const CodeModule *module, 10897d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai const SystemInfo *system_info, 10997d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai string *symbol_file) { 11097d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai ASSERT_TRUE_ABORT(module); 11197d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai ASSERT_TRUE_ABORT(system_info); 11297d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai ASSERT_EQ_ABORT(system_info->cpu, kSystemInfoCPU); 11397d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai ASSERT_EQ_ABORT(system_info->cpu_info, kSystemInfoCPUInfo); 11497d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai ASSERT_EQ_ABORT(system_info->os, kSystemInfoOS); 11597d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai ASSERT_EQ_ABORT(system_info->os_short, kSystemInfoOSShort); 11697d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai ASSERT_EQ_ABORT(system_info->os_version, kSystemInfoOSVersion); 11797d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai 118f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner if (interrupt_) { 119f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner return INTERRUPT; 120f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner } 121f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner 122e5dc60822e5938fea2ae892ccddb906641ba174emmentovai if (module && module->code_file() == "c:\\test_app.exe") { 123f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner *symbol_file = string(getenv("srcdir") ? getenv("srcdir") : ".") + 124f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner "/src/processor/testdata/symbols/test_app.pdb/" + 125f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner module->debug_identifier() + 126f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner "/test_app.sym"; 127f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner return FOUND; 128cce3492afc263be86236600d41dca40be7224ee7bryner } 129cce3492afc263be86236600d41dca40be7224ee7bryner 130f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner return NOT_FOUND; 131cce3492afc263be86236600d41dca40be7224ee7bryner} 132cce3492afc263be86236600d41dca40be7224ee7bryner 1332ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsidSymbolSupplier::SymbolResult TestSymbolSupplier::GetSymbolFile( 1342ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsid const CodeModule *module, 1352ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsid const SystemInfo *system_info, 1362ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsid string *symbol_file, 1372ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsid string *symbol_data) { 1382ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsid SymbolSupplier::SymbolResult s = GetSymbolFile(module, system_info, 1392ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsid symbol_file); 1402ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsid if (s == FOUND) { 1412ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsid std::ifstream in(symbol_file->c_str()); 1422ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsid std::getline(in, *symbol_data, std::string::traits_type::to_char_type( 1432ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsid std::string::traits_type::eof())); 1442ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsid in.close(); 1452ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsid } 1462ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsid 1472ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsid return s; 1482ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsid} 1492ad976ef0ba44f36842b9b7a11848f6b40fd25d5nealsid 150cce3492afc263be86236600d41dca40be7224ee7brynerstatic bool RunTests() { 151cce3492afc263be86236600d41dca40be7224ee7bryner TestSymbolSupplier supplier; 152fd38d48e6d5e56cb66b0fa0f7e25f840a83dac5cbryner BasicSourceLineResolver resolver; 153fd38d48e6d5e56cb66b0fa0f7e25f840a83dac5cbryner MinidumpProcessor processor(&supplier, &resolver); 154cce3492afc263be86236600d41dca40be7224ee7bryner 155cce3492afc263be86236600d41dca40be7224ee7bryner string minidump_file = string(getenv("srcdir") ? getenv("srcdir") : ".") + 156cce3492afc263be86236600d41dca40be7224ee7bryner "/src/processor/testdata/minidump2.dmp"; 157cce3492afc263be86236600d41dca40be7224ee7bryner 158f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner ProcessState state; 159f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner ASSERT_EQ(processor.Process(minidump_file, &state), 160f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner MinidumpProcessor::PROCESS_OK); 16197d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai ASSERT_EQ(state.system_info()->os, kSystemInfoOS); 16297d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai ASSERT_EQ(state.system_info()->os_short, kSystemInfoOSShort); 16397d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai ASSERT_EQ(state.system_info()->os_version, kSystemInfoOSVersion); 16497d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai ASSERT_EQ(state.system_info()->cpu, kSystemInfoCPU); 16597d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai ASSERT_EQ(state.system_info()->cpu_info, kSystemInfoCPUInfo); 166f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner ASSERT_TRUE(state.crashed()); 167f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner ASSERT_EQ(state.crash_reason(), "EXCEPTION_ACCESS_VIOLATION"); 168f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner ASSERT_EQ(state.crash_address(), 0x45); 169f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner ASSERT_EQ(state.threads()->size(), 1); 170f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner ASSERT_EQ(state.requesting_thread(), 0); 171f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner 172f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner CallStack *stack = state.threads()->at(0); 173e5468b8a49ac6a4e5acb9d4003838e3e323f85e4mmentovai ASSERT_TRUE(stack); 174d119a921ea611dc38cfcb7411759ddf2c688603fmmentovai ASSERT_EQ(stack->frames()->size(), 4); 175cce3492afc263be86236600d41dca40be7224ee7bryner 176db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai ASSERT_TRUE(stack->frames()->at(0)->module); 177db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai ASSERT_EQ(stack->frames()->at(0)->module->base_address(), 0x400000); 178e5dc60822e5938fea2ae892ccddb906641ba174emmentovai ASSERT_EQ(stack->frames()->at(0)->module->code_file(), "c:\\test_app.exe"); 17997d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai ASSERT_EQ(stack->frames()->at(0)->function_name, 18097d392dc4b60f0099cd7ad8c8a5f06581a532392mmentovai "`anonymous namespace'::CrashFunction"); 181d119a921ea611dc38cfcb7411759ddf2c688603fmmentovai ASSERT_EQ(stack->frames()->at(0)->source_file_name, "c:\\test_app.cc"); 182e5dc60822e5938fea2ae892ccddb906641ba174emmentovai ASSERT_EQ(stack->frames()->at(0)->source_line, 58); 183cce3492afc263be86236600d41dca40be7224ee7bryner 184db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai ASSERT_TRUE(stack->frames()->at(1)->module); 185db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai ASSERT_EQ(stack->frames()->at(1)->module->base_address(), 0x400000); 186e5dc60822e5938fea2ae892ccddb906641ba174emmentovai ASSERT_EQ(stack->frames()->at(1)->module->code_file(), "c:\\test_app.exe"); 187d119a921ea611dc38cfcb7411759ddf2c688603fmmentovai ASSERT_EQ(stack->frames()->at(1)->function_name, "main"); 188d119a921ea611dc38cfcb7411759ddf2c688603fmmentovai ASSERT_EQ(stack->frames()->at(1)->source_file_name, "c:\\test_app.cc"); 189e5dc60822e5938fea2ae892ccddb906641ba174emmentovai ASSERT_EQ(stack->frames()->at(1)->source_line, 65); 190cce3492afc263be86236600d41dca40be7224ee7bryner 191cce3492afc263be86236600d41dca40be7224ee7bryner // This comes from the CRT 192db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai ASSERT_TRUE(stack->frames()->at(2)->module); 193db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai ASSERT_EQ(stack->frames()->at(2)->module->base_address(), 0x400000); 194e5dc60822e5938fea2ae892ccddb906641ba174emmentovai ASSERT_EQ(stack->frames()->at(2)->module->code_file(), "c:\\test_app.exe"); 195d119a921ea611dc38cfcb7411759ddf2c688603fmmentovai ASSERT_EQ(stack->frames()->at(2)->function_name, "__tmainCRTStartup"); 196d119a921ea611dc38cfcb7411759ddf2c688603fmmentovai ASSERT_EQ(stack->frames()->at(2)->source_file_name, 197e5dc60822e5938fea2ae892ccddb906641ba174emmentovai "f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crt0.c"); 198e5dc60822e5938fea2ae892ccddb906641ba174emmentovai ASSERT_EQ(stack->frames()->at(2)->source_line, 327); 199cce3492afc263be86236600d41dca40be7224ee7bryner 200cce3492afc263be86236600d41dca40be7224ee7bryner // No debug info available for kernel32.dll 201db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai ASSERT_TRUE(stack->frames()->at(3)->module); 202db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai ASSERT_EQ(stack->frames()->at(3)->module->base_address(), 0x7c800000); 203db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai ASSERT_EQ(stack->frames()->at(3)->module->code_file(), 204cce3492afc263be86236600d41dca40be7224ee7bryner "C:\\WINDOWS\\system32\\kernel32.dll"); 205d119a921ea611dc38cfcb7411759ddf2c688603fmmentovai ASSERT_TRUE(stack->frames()->at(3)->function_name.empty()); 206d119a921ea611dc38cfcb7411759ddf2c688603fmmentovai ASSERT_TRUE(stack->frames()->at(3)->source_file_name.empty()); 207d119a921ea611dc38cfcb7411759ddf2c688603fmmentovai ASSERT_EQ(stack->frames()->at(3)->source_line, 0); 208cce3492afc263be86236600d41dca40be7224ee7bryner 209f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner ASSERT_EQ(state.modules()->module_count(), 13); 210f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner ASSERT_TRUE(state.modules()->GetMainModule()); 211e5dc60822e5938fea2ae892ccddb906641ba174emmentovai ASSERT_EQ(state.modules()->GetMainModule()->code_file(), "c:\\test_app.exe"); 212f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner ASSERT_FALSE(state.modules()->GetModuleForAddress(0)); 213f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner ASSERT_EQ(state.modules()->GetMainModule(), 214f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner state.modules()->GetModuleForAddress(0x400000)); 215f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner ASSERT_EQ(state.modules()->GetModuleForAddress(0x7c801234)->debug_file(), 216db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai "kernel32.pdb"); 217f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner ASSERT_EQ(state.modules()->GetModuleForAddress(0x77d43210)->version(), 218db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai "5.1.2600.2622"); 219db3342a10ec30902aa9018b80e1d9a40bd01c487mmentovai 220f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner // Test that the symbol supplier can interrupt processing 221f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner state.Clear(); 222f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner supplier.set_interrupt(true); 223f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner ASSERT_EQ(processor.Process(minidump_file, &state), 224f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner MinidumpProcessor::PROCESS_INTERRUPTED); 225f33b8d2d07a057fdd667c2e0db629ba7cbc37cc3bryner 226cce3492afc263be86236600d41dca40be7224ee7bryner return true; 227cce3492afc263be86236600d41dca40be7224ee7bryner} 228cce3492afc263be86236600d41dca40be7224ee7bryner 2298647dde8cc03ef16b565dccc75574ee5f0d9cf72mmentovai} // namespace 2308647dde8cc03ef16b565dccc75574ee5f0d9cf72mmentovai 231cce3492afc263be86236600d41dca40be7224ee7brynerint main(int argc, char *argv[]) { 23232b802dba3d49880a0414d066e71cdc20ab09901mmentovai BPLOG_INIT(&argc, &argv); 23332b802dba3d49880a0414d066e71cdc20ab09901mmentovai 234cce3492afc263be86236600d41dca40be7224ee7bryner if (!RunTests()) { 235cce3492afc263be86236600d41dca40be7224ee7bryner return 1; 236cce3492afc263be86236600d41dca40be7224ee7bryner } 237cce3492afc263be86236600d41dca40be7224ee7bryner 238cce3492afc263be86236600d41dca40be7224ee7bryner return 0; 239cce3492afc263be86236600d41dca40be7224ee7bryner} 240