19244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// Copyright (c) 2010, Google Inc. 20cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// All rights reserved. 30cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// 40cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// Redistribution and use in source and binary forms, with or without 50cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// modification, are permitted provided that the following conditions are 60cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// met: 70cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// 80cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// * Redistributions of source code must retain the above copyright 90cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// notice, this list of conditions and the following disclaimer. 100cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// * Redistributions in binary form must reproduce the above 110cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// copyright notice, this list of conditions and the following disclaimer 120cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// in the documentation and/or other materials provided with the 130cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// distribution. 140cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// * Neither the name of Google Inc. nor the names of its 150cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// contributors may be used to endorse or promote products derived from 160cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// this software without specific prior written permission. 170cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// 180cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 190cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 200cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 210cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 220cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 230cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 240cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 250cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 260cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 270cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 280cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 290cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek 300cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// Unit test for Minidump. Uses a pre-generated minidump and 310cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek// verifies that certain streams are correct. 320cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek 330cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek#include <iostream> 340cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek#include <fstream> 350cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek#include <sstream> 369244496c6f875ef1f7166d65f218d57ae92cabaajimblandy#include <stdlib.h> 370cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek#include <string> 380cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek#include <vector> 394e518a4357a2d1c379d4a91df6d4e153ee791101ivan.penkov@gmail.com 400cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek#include "breakpad_googletest_includes.h" 414e518a4357a2d1c379d4a91df6d4e153ee791101ivan.penkov@gmail.com#include "common/using_std_string.h" 420cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek#include "google_breakpad/common/minidump_format.h" 430cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek#include "google_breakpad/processor/minidump.h" 440cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek#include "processor/logging.h" 459244496c6f875ef1f7166d65f218d57ae92cabaajimblandy#include "processor/synth_minidump.h" 460cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek 470cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczareknamespace { 480cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek 490cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarekusing google_breakpad::Minidump; 509244496c6f875ef1f7166d65f218d57ae92cabaajimblandyusing google_breakpad::MinidumpContext; 511a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarekusing google_breakpad::MinidumpException; 527b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarekusing google_breakpad::MinidumpMemoryInfo; 537b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarekusing google_breakpad::MinidumpMemoryInfoList; 549244496c6f875ef1f7166d65f218d57ae92cabaajimblandyusing google_breakpad::MinidumpMemoryList; 559244496c6f875ef1f7166d65f218d57ae92cabaajimblandyusing google_breakpad::MinidumpMemoryRegion; 569244496c6f875ef1f7166d65f218d57ae92cabaajimblandyusing google_breakpad::MinidumpModule; 579244496c6f875ef1f7166d65f218d57ae92cabaajimblandyusing google_breakpad::MinidumpModuleList; 589244496c6f875ef1f7166d65f218d57ae92cabaajimblandyusing google_breakpad::MinidumpSystemInfo; 599244496c6f875ef1f7166d65f218d57ae92cabaajimblandyusing google_breakpad::MinidumpThread; 609244496c6f875ef1f7166d65f218d57ae92cabaajimblandyusing google_breakpad::MinidumpThreadList; 619244496c6f875ef1f7166d65f218d57ae92cabaajimblandyusing google_breakpad::SynthMinidump::Context; 629244496c6f875ef1f7166d65f218d57ae92cabaajimblandyusing google_breakpad::SynthMinidump::Dump; 631a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarekusing google_breakpad::SynthMinidump::Exception; 649244496c6f875ef1f7166d65f218d57ae92cabaajimblandyusing google_breakpad::SynthMinidump::Memory; 659244496c6f875ef1f7166d65f218d57ae92cabaajimblandyusing google_breakpad::SynthMinidump::Module; 669244496c6f875ef1f7166d65f218d57ae92cabaajimblandyusing google_breakpad::SynthMinidump::Stream; 679244496c6f875ef1f7166d65f218d57ae92cabaajimblandyusing google_breakpad::SynthMinidump::String; 689244496c6f875ef1f7166d65f218d57ae92cabaajimblandyusing google_breakpad::SynthMinidump::SystemInfo; 699244496c6f875ef1f7166d65f218d57ae92cabaajimblandyusing google_breakpad::SynthMinidump::Thread; 706f598cc435f8c557b33f85802f1571ef745c37b0ted.mielczarekusing google_breakpad::test_assembler::kBigEndian; 716f598cc435f8c557b33f85802f1571ef745c37b0ted.mielczarekusing google_breakpad::test_assembler::kLittleEndian; 720cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarekusing std::ifstream; 730cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarekusing std::istringstream; 740cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarekusing std::vector; 750cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarekusing ::testing::Return; 760cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek 770cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarekclass MinidumpTest : public ::testing::Test { 780cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarekpublic: 790cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek void SetUp() { 800cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek minidump_file_ = string(getenv("srcdir") ? getenv("srcdir") : ".") + 810cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek "/src/processor/testdata/minidump2.dmp"; 820cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek } 830cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek string minidump_file_; 840cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek}; 850cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek 860cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarekTEST_F(MinidumpTest, TestMinidumpFromFile) { 870cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek Minidump minidump(minidump_file_); 880cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek ASSERT_EQ(minidump.path(), minidump_file_); 890cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek ASSERT_TRUE(minidump.Read()); 900cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek const MDRawHeader* header = minidump.header(); 910cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek ASSERT_NE(header, (MDRawHeader*)NULL); 926162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com ASSERT_EQ(header->signature, uint32_t(MD_HEADER_SIGNATURE)); 930cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek //TODO: add more checks here 940cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek} 950cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek 960cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarekTEST_F(MinidumpTest, TestMinidumpFromStream) { 970cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek // read minidump contents into memory, construct a stringstream around them 980cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek ifstream file_stream(minidump_file_.c_str(), std::ios::in); 990cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek ASSERT_TRUE(file_stream.good()); 1000cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek vector<char> bytes; 1010cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek file_stream.seekg(0, std::ios_base::end); 1020cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek ASSERT_TRUE(file_stream.good()); 1030cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek bytes.resize(file_stream.tellg()); 1040cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek file_stream.seekg(0, std::ios_base::beg); 1050cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek ASSERT_TRUE(file_stream.good()); 1060cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek file_stream.read(&bytes[0], bytes.size()); 1070cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek ASSERT_TRUE(file_stream.good()); 1080cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek string str(&bytes[0], bytes.size()); 1090cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek istringstream stream(str); 1100cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek ASSERT_TRUE(stream.good()); 1110cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek 1120cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek // now read minidump from stringstream 1130cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek Minidump minidump(stream); 1140cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek ASSERT_EQ(minidump.path(), ""); 1150cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek ASSERT_TRUE(minidump.Read()); 1160cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek const MDRawHeader* header = minidump.header(); 1170cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek ASSERT_NE(header, (MDRawHeader*)NULL); 1186162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com ASSERT_EQ(header->signature, uint32_t(MD_HEADER_SIGNATURE)); 1190cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek //TODO: add more checks here 1200cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek} 1210cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek 1229244496c6f875ef1f7166d65f218d57ae92cabaajimblandyTEST(Dump, ReadBackEmpty) { 1239244496c6f875ef1f7166d65f218d57ae92cabaajimblandy Dump dump(0); 1249244496c6f875ef1f7166d65f218d57ae92cabaajimblandy dump.Finish(); 1259244496c6f875ef1f7166d65f218d57ae92cabaajimblandy string contents; 1269244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_TRUE(dump.GetContents(&contents)); 1279244496c6f875ef1f7166d65f218d57ae92cabaajimblandy istringstream stream(contents); 1289244496c6f875ef1f7166d65f218d57ae92cabaajimblandy Minidump minidump(stream); 1299244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_TRUE(minidump.Read()); 1309244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_EQ(0U, minidump.GetDirectoryEntryCount()); 1319244496c6f875ef1f7166d65f218d57ae92cabaajimblandy} 1329244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 1339244496c6f875ef1f7166d65f218d57ae92cabaajimblandyTEST(Dump, ReadBackEmptyBigEndian) { 1349244496c6f875ef1f7166d65f218d57ae92cabaajimblandy Dump big_minidump(0, kBigEndian); 1359244496c6f875ef1f7166d65f218d57ae92cabaajimblandy big_minidump.Finish(); 1369244496c6f875ef1f7166d65f218d57ae92cabaajimblandy string contents; 1379244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_TRUE(big_minidump.GetContents(&contents)); 1389244496c6f875ef1f7166d65f218d57ae92cabaajimblandy istringstream stream(contents); 1399244496c6f875ef1f7166d65f218d57ae92cabaajimblandy Minidump minidump(stream); 1409244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_TRUE(minidump.Read()); 1419244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_EQ(0U, minidump.GetDirectoryEntryCount()); 1429244496c6f875ef1f7166d65f218d57ae92cabaajimblandy} 1439244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 1449244496c6f875ef1f7166d65f218d57ae92cabaajimblandyTEST(Dump, OneStream) { 1459244496c6f875ef1f7166d65f218d57ae92cabaajimblandy Dump dump(0, kBigEndian); 1469244496c6f875ef1f7166d65f218d57ae92cabaajimblandy Stream stream(dump, 0xfbb7fa2bU); 1479244496c6f875ef1f7166d65f218d57ae92cabaajimblandy stream.Append("stream contents"); 1489244496c6f875ef1f7166d65f218d57ae92cabaajimblandy dump.Add(&stream); 1499244496c6f875ef1f7166d65f218d57ae92cabaajimblandy dump.Finish(); 1509244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 1519244496c6f875ef1f7166d65f218d57ae92cabaajimblandy string contents; 1529244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_TRUE(dump.GetContents(&contents)); 1539244496c6f875ef1f7166d65f218d57ae92cabaajimblandy istringstream minidump_stream(contents); 1549244496c6f875ef1f7166d65f218d57ae92cabaajimblandy Minidump minidump(minidump_stream); 1559244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_TRUE(minidump.Read()); 1569244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_EQ(1U, minidump.GetDirectoryEntryCount()); 1579244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 1589244496c6f875ef1f7166d65f218d57ae92cabaajimblandy const MDRawDirectory *dir = minidump.GetDirectoryEntryAtIndex(0); 1599244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_TRUE(dir != NULL); 1609244496c6f875ef1f7166d65f218d57ae92cabaajimblandy EXPECT_EQ(0xfbb7fa2bU, dir->stream_type); 1619244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 1626162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com uint32_t stream_length; 1639244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_TRUE(minidump.SeekToStreamType(0xfbb7fa2bU, &stream_length)); 1649244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_EQ(15U, stream_length); 1659244496c6f875ef1f7166d65f218d57ae92cabaajimblandy char stream_contents[15]; 1669244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_TRUE(minidump.ReadBytes(stream_contents, sizeof(stream_contents))); 1679244496c6f875ef1f7166d65f218d57ae92cabaajimblandy EXPECT_EQ(string("stream contents"), 1689244496c6f875ef1f7166d65f218d57ae92cabaajimblandy string(stream_contents, sizeof(stream_contents))); 1699244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 1709244496c6f875ef1f7166d65f218d57ae92cabaajimblandy EXPECT_FALSE(minidump.GetThreadList()); 1719244496c6f875ef1f7166d65f218d57ae92cabaajimblandy EXPECT_FALSE(minidump.GetModuleList()); 1729244496c6f875ef1f7166d65f218d57ae92cabaajimblandy EXPECT_FALSE(minidump.GetMemoryList()); 1739244496c6f875ef1f7166d65f218d57ae92cabaajimblandy EXPECT_FALSE(minidump.GetException()); 1749244496c6f875ef1f7166d65f218d57ae92cabaajimblandy EXPECT_FALSE(minidump.GetAssertion()); 1759244496c6f875ef1f7166d65f218d57ae92cabaajimblandy EXPECT_FALSE(minidump.GetSystemInfo()); 1769244496c6f875ef1f7166d65f218d57ae92cabaajimblandy EXPECT_FALSE(minidump.GetMiscInfo()); 1779244496c6f875ef1f7166d65f218d57ae92cabaajimblandy EXPECT_FALSE(minidump.GetBreakpadInfo()); 1789244496c6f875ef1f7166d65f218d57ae92cabaajimblandy} 1799244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 1809244496c6f875ef1f7166d65f218d57ae92cabaajimblandyTEST(Dump, OneMemory) { 1819244496c6f875ef1f7166d65f218d57ae92cabaajimblandy Dump dump(0, kBigEndian); 1829244496c6f875ef1f7166d65f218d57ae92cabaajimblandy Memory memory(dump, 0x309d68010bd21b2cULL); 1839244496c6f875ef1f7166d65f218d57ae92cabaajimblandy memory.Append("memory contents"); 1849244496c6f875ef1f7166d65f218d57ae92cabaajimblandy dump.Add(&memory); 1859244496c6f875ef1f7166d65f218d57ae92cabaajimblandy dump.Finish(); 1869244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 1879244496c6f875ef1f7166d65f218d57ae92cabaajimblandy string contents; 1889244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_TRUE(dump.GetContents(&contents)); 1899244496c6f875ef1f7166d65f218d57ae92cabaajimblandy istringstream minidump_stream(contents); 1909244496c6f875ef1f7166d65f218d57ae92cabaajimblandy Minidump minidump(minidump_stream); 1919244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_TRUE(minidump.Read()); 1929244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_EQ(1U, minidump.GetDirectoryEntryCount()); 1939244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 1949244496c6f875ef1f7166d65f218d57ae92cabaajimblandy const MDRawDirectory *dir = minidump.GetDirectoryEntryAtIndex(0); 1959244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_TRUE(dir != NULL); 1966162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com EXPECT_EQ((uint32_t) MD_MEMORY_LIST_STREAM, dir->stream_type); 1979244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 1989244496c6f875ef1f7166d65f218d57ae92cabaajimblandy MinidumpMemoryList *memory_list = minidump.GetMemoryList(); 1999244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_TRUE(memory_list != NULL); 2009244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_EQ(1U, memory_list->region_count()); 2019244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 2029244496c6f875ef1f7166d65f218d57ae92cabaajimblandy MinidumpMemoryRegion *region1 = memory_list->GetMemoryRegionAtIndex(0); 2039244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_EQ(0x309d68010bd21b2cULL, region1->GetBase()); 2049244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_EQ(15U, region1->GetSize()); 2056162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com const uint8_t *region1_bytes = region1->GetMemory(); 2069244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_TRUE(memcmp("memory contents", region1_bytes, 15) == 0); 2079244496c6f875ef1f7166d65f218d57ae92cabaajimblandy} 2089244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 2099244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// One thread --- and its requisite entourage. 2109244496c6f875ef1f7166d65f218d57ae92cabaajimblandyTEST(Dump, OneThread) { 2119244496c6f875ef1f7166d65f218d57ae92cabaajimblandy Dump dump(0, kLittleEndian); 2129244496c6f875ef1f7166d65f218d57ae92cabaajimblandy Memory stack(dump, 0x2326a0fa); 2139244496c6f875ef1f7166d65f218d57ae92cabaajimblandy stack.Append("stack for thread"); 2149244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 2159244496c6f875ef1f7166d65f218d57ae92cabaajimblandy MDRawContextX86 raw_context; 2166162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com const uint32_t kExpectedEIP = 0x6913f540; 2179244496c6f875ef1f7166d65f218d57ae92cabaajimblandy raw_context.context_flags = MD_CONTEXT_X86_INTEGER | MD_CONTEXT_X86_CONTROL; 2189244496c6f875ef1f7166d65f218d57ae92cabaajimblandy raw_context.edi = 0x3ecba80d; 2199244496c6f875ef1f7166d65f218d57ae92cabaajimblandy raw_context.esi = 0x382583b9; 2209244496c6f875ef1f7166d65f218d57ae92cabaajimblandy raw_context.ebx = 0x7fccc03f; 2219244496c6f875ef1f7166d65f218d57ae92cabaajimblandy raw_context.edx = 0xf62f8ec2; 2229244496c6f875ef1f7166d65f218d57ae92cabaajimblandy raw_context.ecx = 0x46a6a6a8; 2239244496c6f875ef1f7166d65f218d57ae92cabaajimblandy raw_context.eax = 0x6a5025e2; 2249244496c6f875ef1f7166d65f218d57ae92cabaajimblandy raw_context.ebp = 0xd9fabb4a; 225c551efe9b6129aa5a7911e3469630b52478057fcted.mielczarek@gmail.com raw_context.eip = kExpectedEIP; 2269244496c6f875ef1f7166d65f218d57ae92cabaajimblandy raw_context.cs = 0xbffe6eda; 2279244496c6f875ef1f7166d65f218d57ae92cabaajimblandy raw_context.eflags = 0xb2ce1e2d; 2289244496c6f875ef1f7166d65f218d57ae92cabaajimblandy raw_context.esp = 0x659caaa4; 2299244496c6f875ef1f7166d65f218d57ae92cabaajimblandy raw_context.ss = 0x2e951ef7; 2309244496c6f875ef1f7166d65f218d57ae92cabaajimblandy Context context(dump, raw_context); 2319244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 2329244496c6f875ef1f7166d65f218d57ae92cabaajimblandy Thread thread(dump, 0xa898f11b, stack, context, 2339244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 0x9e39439f, 0x4abfc15f, 0xe499898a, 0x0d43e939dcfd0372ULL); 2349244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 2359244496c6f875ef1f7166d65f218d57ae92cabaajimblandy dump.Add(&stack); 2369244496c6f875ef1f7166d65f218d57ae92cabaajimblandy dump.Add(&context); 2379244496c6f875ef1f7166d65f218d57ae92cabaajimblandy dump.Add(&thread); 2389244496c6f875ef1f7166d65f218d57ae92cabaajimblandy dump.Finish(); 2399244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 2409244496c6f875ef1f7166d65f218d57ae92cabaajimblandy string contents; 2419244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_TRUE(dump.GetContents(&contents)); 2429244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 2439244496c6f875ef1f7166d65f218d57ae92cabaajimblandy istringstream minidump_stream(contents); 2449244496c6f875ef1f7166d65f218d57ae92cabaajimblandy Minidump minidump(minidump_stream); 2459244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_TRUE(minidump.Read()); 2469244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_EQ(2U, minidump.GetDirectoryEntryCount()); 2479244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 2489244496c6f875ef1f7166d65f218d57ae92cabaajimblandy MinidumpMemoryList *md_memory_list = minidump.GetMemoryList(); 2499244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_TRUE(md_memory_list != NULL); 2509244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_EQ(1U, md_memory_list->region_count()); 2519244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 2529244496c6f875ef1f7166d65f218d57ae92cabaajimblandy MinidumpMemoryRegion *md_region = md_memory_list->GetMemoryRegionAtIndex(0); 2539244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_EQ(0x2326a0faU, md_region->GetBase()); 2549244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_EQ(16U, md_region->GetSize()); 2556162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com const uint8_t *region_bytes = md_region->GetMemory(); 2569244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_TRUE(memcmp("stack for thread", region_bytes, 16) == 0); 2579244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 2589244496c6f875ef1f7166d65f218d57ae92cabaajimblandy MinidumpThreadList *thread_list = minidump.GetThreadList(); 2599244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_TRUE(thread_list != NULL); 2609244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_EQ(1U, thread_list->thread_count()); 2619244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 2629244496c6f875ef1f7166d65f218d57ae92cabaajimblandy MinidumpThread *md_thread = thread_list->GetThreadAtIndex(0); 2639244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_TRUE(md_thread != NULL); 2646162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com uint32_t thread_id; 2659244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_TRUE(md_thread->GetThreadID(&thread_id)); 2669244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_EQ(0xa898f11bU, thread_id); 2679244496c6f875ef1f7166d65f218d57ae92cabaajimblandy MinidumpMemoryRegion *md_stack = md_thread->GetMemory(); 2689244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_TRUE(md_stack != NULL); 2699244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_EQ(0x2326a0faU, md_stack->GetBase()); 2709244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_EQ(16U, md_stack->GetSize()); 2716162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com const uint8_t *md_stack_bytes = md_stack->GetMemory(); 2729244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_TRUE(memcmp("stack for thread", md_stack_bytes, 16) == 0); 2739244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 2749244496c6f875ef1f7166d65f218d57ae92cabaajimblandy MinidumpContext *md_context = md_thread->GetContext(); 2759244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_TRUE(md_context != NULL); 2766162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com ASSERT_EQ((uint32_t) MD_CONTEXT_X86, md_context->GetContextCPU()); 277c551efe9b6129aa5a7911e3469630b52478057fcted.mielczarek@gmail.com 2786162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com uint64_t eip; 279c551efe9b6129aa5a7911e3469630b52478057fcted.mielczarek@gmail.com ASSERT_TRUE(md_context->GetInstructionPointer(&eip)); 280c551efe9b6129aa5a7911e3469630b52478057fcted.mielczarek@gmail.com EXPECT_EQ(kExpectedEIP, eip); 281c551efe9b6129aa5a7911e3469630b52478057fcted.mielczarek@gmail.com 2829244496c6f875ef1f7166d65f218d57ae92cabaajimblandy const MDRawContextX86 *md_raw_context = md_context->GetContextX86(); 2839244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_TRUE(md_raw_context != NULL); 2846162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com ASSERT_EQ((uint32_t) (MD_CONTEXT_X86_INTEGER | MD_CONTEXT_X86_CONTROL), 2859244496c6f875ef1f7166d65f218d57ae92cabaajimblandy (md_raw_context->context_flags 2869244496c6f875ef1f7166d65f218d57ae92cabaajimblandy & (MD_CONTEXT_X86_INTEGER | MD_CONTEXT_X86_CONTROL))); 2879244496c6f875ef1f7166d65f218d57ae92cabaajimblandy EXPECT_EQ(0x3ecba80dU, raw_context.edi); 2889244496c6f875ef1f7166d65f218d57ae92cabaajimblandy EXPECT_EQ(0x382583b9U, raw_context.esi); 2899244496c6f875ef1f7166d65f218d57ae92cabaajimblandy EXPECT_EQ(0x7fccc03fU, raw_context.ebx); 2909244496c6f875ef1f7166d65f218d57ae92cabaajimblandy EXPECT_EQ(0xf62f8ec2U, raw_context.edx); 2919244496c6f875ef1f7166d65f218d57ae92cabaajimblandy EXPECT_EQ(0x46a6a6a8U, raw_context.ecx); 2929244496c6f875ef1f7166d65f218d57ae92cabaajimblandy EXPECT_EQ(0x6a5025e2U, raw_context.eax); 2939244496c6f875ef1f7166d65f218d57ae92cabaajimblandy EXPECT_EQ(0xd9fabb4aU, raw_context.ebp); 294c551efe9b6129aa5a7911e3469630b52478057fcted.mielczarek@gmail.com EXPECT_EQ(kExpectedEIP, raw_context.eip); 2959244496c6f875ef1f7166d65f218d57ae92cabaajimblandy EXPECT_EQ(0xbffe6edaU, raw_context.cs); 2969244496c6f875ef1f7166d65f218d57ae92cabaajimblandy EXPECT_EQ(0xb2ce1e2dU, raw_context.eflags); 2979244496c6f875ef1f7166d65f218d57ae92cabaajimblandy EXPECT_EQ(0x659caaa4U, raw_context.esp); 2989244496c6f875ef1f7166d65f218d57ae92cabaajimblandy EXPECT_EQ(0x2e951ef7U, raw_context.ss); 2999244496c6f875ef1f7166d65f218d57ae92cabaajimblandy} 3009244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 301e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.comTEST(Dump, ThreadMissingMemory) { 302e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com Dump dump(0, kLittleEndian); 303e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com Memory stack(dump, 0x2326a0fa); 304e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com // Stack has no contents. 305e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com 306e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com MDRawContextX86 raw_context; 307e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com memset(&raw_context, 0, sizeof(raw_context)); 308e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com raw_context.context_flags = MD_CONTEXT_X86_INTEGER | MD_CONTEXT_X86_CONTROL; 309e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com Context context(dump, raw_context); 310e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com 311e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com Thread thread(dump, 0xa898f11b, stack, context, 312e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com 0x9e39439f, 0x4abfc15f, 0xe499898a, 0x0d43e939dcfd0372ULL); 313e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com 314e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com dump.Add(&stack); 315e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com dump.Add(&context); 316e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com dump.Add(&thread); 317e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com dump.Finish(); 318e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com 319e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com string contents; 320e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com ASSERT_TRUE(dump.GetContents(&contents)); 321e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com 322e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com istringstream minidump_stream(contents); 323e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com Minidump minidump(minidump_stream); 324e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com ASSERT_TRUE(minidump.Read()); 325e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com ASSERT_EQ(2U, minidump.GetDirectoryEntryCount()); 326e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com 327e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com // This should succeed even though the thread has no stack memory. 328e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com MinidumpThreadList* thread_list = minidump.GetThreadList(); 329e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com ASSERT_TRUE(thread_list != NULL); 330e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com ASSERT_EQ(1U, thread_list->thread_count()); 331e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com 332e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com MinidumpThread* md_thread = thread_list->GetThreadAtIndex(0); 333e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com ASSERT_TRUE(md_thread != NULL); 334e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com 3356162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com uint32_t thread_id; 336e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com ASSERT_TRUE(md_thread->GetThreadID(&thread_id)); 337e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com ASSERT_EQ(0xa898f11bU, thread_id); 338e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com 339e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com MinidumpContext* md_context = md_thread->GetContext(); 340e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com ASSERT_NE(reinterpret_cast<MinidumpContext*>(NULL), md_context); 341e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com 342e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com MinidumpMemoryRegion* md_stack = md_thread->GetMemory(); 343e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com ASSERT_EQ(reinterpret_cast<MinidumpMemoryRegion*>(NULL), md_stack); 344e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com} 345e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com 346e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.comTEST(Dump, ThreadMissingContext) { 347e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com Dump dump(0, kLittleEndian); 348e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com Memory stack(dump, 0x2326a0fa); 349e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com stack.Append("stack for thread"); 350e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com 351e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com // Context is empty. 352e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com Context context(dump); 353e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com 354e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com Thread thread(dump, 0xa898f11b, stack, context, 355e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com 0x9e39439f, 0x4abfc15f, 0xe499898a, 0x0d43e939dcfd0372ULL); 356e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com 357e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com dump.Add(&stack); 358e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com dump.Add(&context); 359e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com dump.Add(&thread); 360e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com dump.Finish(); 361e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com 362e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com string contents; 363e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com ASSERT_TRUE(dump.GetContents(&contents)); 364e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com 365e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com istringstream minidump_stream(contents); 366e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com Minidump minidump(minidump_stream); 367e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com ASSERT_TRUE(minidump.Read()); 368e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com ASSERT_EQ(2U, minidump.GetDirectoryEntryCount()); 369e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com 370e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com // This should succeed even though the thread has no stack memory. 371e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com MinidumpThreadList* thread_list = minidump.GetThreadList(); 372e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com ASSERT_TRUE(thread_list != NULL); 373e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com ASSERT_EQ(1U, thread_list->thread_count()); 374e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com 375e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com MinidumpThread* md_thread = thread_list->GetThreadAtIndex(0); 376e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com ASSERT_TRUE(md_thread != NULL); 377e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com 3786162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com uint32_t thread_id; 379e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com ASSERT_TRUE(md_thread->GetThreadID(&thread_id)); 380e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com ASSERT_EQ(0xa898f11bU, thread_id); 381e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com MinidumpMemoryRegion* md_stack = md_thread->GetMemory(); 382e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com ASSERT_NE(reinterpret_cast<MinidumpMemoryRegion*>(NULL), md_stack); 383e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com 384e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com MinidumpContext* md_context = md_thread->GetContext(); 385e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com ASSERT_EQ(reinterpret_cast<MinidumpContext*>(NULL), md_context); 386e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com} 387e721e628ec10381c96e38cfc82c1816983097165ted.mielczarek@gmail.com 3889244496c6f875ef1f7166d65f218d57ae92cabaajimblandyTEST(Dump, OneModule) { 3899244496c6f875ef1f7166d65f218d57ae92cabaajimblandy static const MDVSFixedFileInfo fixed_file_info = { 3909244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 0xb2fba33a, // signature 3919244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 0x33d7a728, // struct_version 3929244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 0x31afcb20, // file_version_hi 3939244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 0xe51cdab1, // file_version_lo 3949244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 0xd1ea6907, // product_version_hi 3959244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 0x03032857, // product_version_lo 3969244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 0x11bf71d7, // file_flags_mask 3979244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 0x5fb8cdbf, // file_flags 3989244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 0xe45d0d5d, // file_os 3999244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 0x107d9562, // file_type 4009244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 0x5a8844d4, // file_subtype 4019244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 0xa8d30b20, // file_date_hi 4029244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 0x651c3e4e // file_date_lo 4039244496c6f875ef1f7166d65f218d57ae92cabaajimblandy }; 4049244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 4059244496c6f875ef1f7166d65f218d57ae92cabaajimblandy Dump dump(0, kBigEndian); 4069244496c6f875ef1f7166d65f218d57ae92cabaajimblandy String module_name(dump, "single module"); 4079244496c6f875ef1f7166d65f218d57ae92cabaajimblandy Module module(dump, 0xa90206ca83eb2852ULL, 0xada542bd, 4089244496c6f875ef1f7166d65f218d57ae92cabaajimblandy module_name, 4099244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 0xb1054d2a, 4109244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 0x34571371, 4119244496c6f875ef1f7166d65f218d57ae92cabaajimblandy fixed_file_info, // from synth_minidump_unittest_data.h 4129244496c6f875ef1f7166d65f218d57ae92cabaajimblandy NULL, NULL); 4130cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek 4149244496c6f875ef1f7166d65f218d57ae92cabaajimblandy dump.Add(&module); 4159244496c6f875ef1f7166d65f218d57ae92cabaajimblandy dump.Add(&module_name); 4169244496c6f875ef1f7166d65f218d57ae92cabaajimblandy dump.Finish(); 4179244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 4189244496c6f875ef1f7166d65f218d57ae92cabaajimblandy string contents; 4199244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_TRUE(dump.GetContents(&contents)); 4209244496c6f875ef1f7166d65f218d57ae92cabaajimblandy istringstream minidump_stream(contents); 4219244496c6f875ef1f7166d65f218d57ae92cabaajimblandy Minidump minidump(minidump_stream); 4229244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_TRUE(minidump.Read()); 4239244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_EQ(1U, minidump.GetDirectoryEntryCount()); 4249244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 4259244496c6f875ef1f7166d65f218d57ae92cabaajimblandy const MDRawDirectory *dir = minidump.GetDirectoryEntryAtIndex(0); 4269244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_TRUE(dir != NULL); 4276162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com EXPECT_EQ((uint32_t) MD_MODULE_LIST_STREAM, dir->stream_type); 4289244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 4299244496c6f875ef1f7166d65f218d57ae92cabaajimblandy MinidumpModuleList *md_module_list = minidump.GetModuleList(); 4309244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_TRUE(md_module_list != NULL); 4319244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_EQ(1U, md_module_list->module_count()); 4329244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 4339244496c6f875ef1f7166d65f218d57ae92cabaajimblandy const MinidumpModule *md_module = md_module_list->GetModuleAtIndex(0); 4349244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_TRUE(md_module != NULL); 4359244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_EQ(0xa90206ca83eb2852ULL, md_module->base_address()); 4369244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_EQ(0xada542bd, md_module->size()); 4379244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_EQ("single module", md_module->code_file()); 4389244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 4399244496c6f875ef1f7166d65f218d57ae92cabaajimblandy const MDRawModule *md_raw_module = md_module->module(); 4409244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_TRUE(md_raw_module != NULL); 4419244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_EQ(0xb1054d2aU, md_raw_module->time_date_stamp); 4429244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_EQ(0x34571371U, md_raw_module->checksum); 4439244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_TRUE(memcmp(&md_raw_module->version_info, &fixed_file_info, 4449244496c6f875ef1f7166d65f218d57ae92cabaajimblandy sizeof(fixed_file_info)) == 0); 4459244496c6f875ef1f7166d65f218d57ae92cabaajimblandy} 4469244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 4479244496c6f875ef1f7166d65f218d57ae92cabaajimblandyTEST(Dump, OneSystemInfo) { 4489244496c6f875ef1f7166d65f218d57ae92cabaajimblandy Dump dump(0, kLittleEndian); 4499244496c6f875ef1f7166d65f218d57ae92cabaajimblandy String csd_version(dump, "Petulant Pierogi"); 4509244496c6f875ef1f7166d65f218d57ae92cabaajimblandy SystemInfo system_info(dump, SystemInfo::windows_x86, csd_version); 4519244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 4529244496c6f875ef1f7166d65f218d57ae92cabaajimblandy dump.Add(&system_info); 4539244496c6f875ef1f7166d65f218d57ae92cabaajimblandy dump.Add(&csd_version); 4549244496c6f875ef1f7166d65f218d57ae92cabaajimblandy dump.Finish(); 4559244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 4569244496c6f875ef1f7166d65f218d57ae92cabaajimblandy string contents; 4579244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_TRUE(dump.GetContents(&contents)); 4589244496c6f875ef1f7166d65f218d57ae92cabaajimblandy istringstream minidump_stream(contents); 4599244496c6f875ef1f7166d65f218d57ae92cabaajimblandy Minidump minidump(minidump_stream); 4609244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_TRUE(minidump.Read()); 4619244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_EQ(1U, minidump.GetDirectoryEntryCount()); 4629244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 4639244496c6f875ef1f7166d65f218d57ae92cabaajimblandy const MDRawDirectory *dir = minidump.GetDirectoryEntryAtIndex(0); 4649244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_TRUE(dir != NULL); 4656162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com EXPECT_EQ((uint32_t) MD_SYSTEM_INFO_STREAM, dir->stream_type); 4669244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 4679244496c6f875ef1f7166d65f218d57ae92cabaajimblandy MinidumpSystemInfo *md_system_info = minidump.GetSystemInfo(); 4689244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_TRUE(md_system_info != NULL); 4699244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_EQ("windows", md_system_info->GetOS()); 4709244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_EQ("x86", md_system_info->GetCPU()); 4719244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_EQ("Petulant Pierogi", *md_system_info->GetCSDVersion()); 4729244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_EQ("GenuineIntel", *md_system_info->GetCPUVendor()); 4739244496c6f875ef1f7166d65f218d57ae92cabaajimblandy} 4749244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 4759244496c6f875ef1f7166d65f218d57ae92cabaajimblandyTEST(Dump, BigDump) { 4769244496c6f875ef1f7166d65f218d57ae92cabaajimblandy Dump dump(0, kLittleEndian); 4779244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 4789244496c6f875ef1f7166d65f218d57ae92cabaajimblandy // A SystemInfo stream. 4799244496c6f875ef1f7166d65f218d57ae92cabaajimblandy String csd_version(dump, "Munificent Macaque"); 4809244496c6f875ef1f7166d65f218d57ae92cabaajimblandy SystemInfo system_info(dump, SystemInfo::windows_x86, csd_version); 4819244496c6f875ef1f7166d65f218d57ae92cabaajimblandy dump.Add(&csd_version); 4829244496c6f875ef1f7166d65f218d57ae92cabaajimblandy dump.Add(&system_info); 4839244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 4849244496c6f875ef1f7166d65f218d57ae92cabaajimblandy // Five threads! 4859244496c6f875ef1f7166d65f218d57ae92cabaajimblandy Memory stack0(dump, 0x70b9ebfc); 4869244496c6f875ef1f7166d65f218d57ae92cabaajimblandy stack0.Append("stack for thread zero"); 4879244496c6f875ef1f7166d65f218d57ae92cabaajimblandy MDRawContextX86 raw_context0; 4889244496c6f875ef1f7166d65f218d57ae92cabaajimblandy raw_context0.context_flags = MD_CONTEXT_X86_INTEGER; 4899244496c6f875ef1f7166d65f218d57ae92cabaajimblandy raw_context0.eip = 0xaf0709e4; 4909244496c6f875ef1f7166d65f218d57ae92cabaajimblandy Context context0(dump, raw_context0); 4919244496c6f875ef1f7166d65f218d57ae92cabaajimblandy Thread thread0(dump, 0xbbef4432, stack0, context0, 4929244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 0xd0377e7b, 0xdb8eb0cf, 0xd73bc314, 0x09d357bac7f9a163ULL); 4939244496c6f875ef1f7166d65f218d57ae92cabaajimblandy dump.Add(&stack0); 4949244496c6f875ef1f7166d65f218d57ae92cabaajimblandy dump.Add(&context0); 4959244496c6f875ef1f7166d65f218d57ae92cabaajimblandy dump.Add(&thread0); 4969244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 4979244496c6f875ef1f7166d65f218d57ae92cabaajimblandy Memory stack1(dump, 0xf988cc45); 4989244496c6f875ef1f7166d65f218d57ae92cabaajimblandy stack1.Append("stack for thread one"); 4999244496c6f875ef1f7166d65f218d57ae92cabaajimblandy MDRawContextX86 raw_context1; 5009244496c6f875ef1f7166d65f218d57ae92cabaajimblandy raw_context1.context_flags = MD_CONTEXT_X86_INTEGER; 5019244496c6f875ef1f7166d65f218d57ae92cabaajimblandy raw_context1.eip = 0xe4f56f81; 5029244496c6f875ef1f7166d65f218d57ae92cabaajimblandy Context context1(dump, raw_context1); 5039244496c6f875ef1f7166d65f218d57ae92cabaajimblandy Thread thread1(dump, 0x657c3f58, stack1, context1, 5049244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 0xa68fa182, 0x6f3cf8dd, 0xe3a78ccf, 0x78cc84775e4534bbULL); 5059244496c6f875ef1f7166d65f218d57ae92cabaajimblandy dump.Add(&stack1); 5069244496c6f875ef1f7166d65f218d57ae92cabaajimblandy dump.Add(&context1); 5079244496c6f875ef1f7166d65f218d57ae92cabaajimblandy dump.Add(&thread1); 5089244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 5099244496c6f875ef1f7166d65f218d57ae92cabaajimblandy Memory stack2(dump, 0xc8a92e7c); 5109244496c6f875ef1f7166d65f218d57ae92cabaajimblandy stack2.Append("stack for thread two"); 5119244496c6f875ef1f7166d65f218d57ae92cabaajimblandy MDRawContextX86 raw_context2; 5129244496c6f875ef1f7166d65f218d57ae92cabaajimblandy raw_context2.context_flags = MD_CONTEXT_X86_INTEGER; 5139244496c6f875ef1f7166d65f218d57ae92cabaajimblandy raw_context2.eip = 0xb336a438; 5149244496c6f875ef1f7166d65f218d57ae92cabaajimblandy Context context2(dump, raw_context2); 5159244496c6f875ef1f7166d65f218d57ae92cabaajimblandy Thread thread2(dump, 0xdf4b8a71, stack2, context2, 5169244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 0x674c26b6, 0x445d7120, 0x7e700c56, 0xd89bf778e7793e17ULL); 5179244496c6f875ef1f7166d65f218d57ae92cabaajimblandy dump.Add(&stack2); 5189244496c6f875ef1f7166d65f218d57ae92cabaajimblandy dump.Add(&context2); 5199244496c6f875ef1f7166d65f218d57ae92cabaajimblandy dump.Add(&thread2); 5209244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 5219244496c6f875ef1f7166d65f218d57ae92cabaajimblandy Memory stack3(dump, 0x36d08e08); 5229244496c6f875ef1f7166d65f218d57ae92cabaajimblandy stack3.Append("stack for thread three"); 5239244496c6f875ef1f7166d65f218d57ae92cabaajimblandy MDRawContextX86 raw_context3; 5249244496c6f875ef1f7166d65f218d57ae92cabaajimblandy raw_context3.context_flags = MD_CONTEXT_X86_INTEGER; 5259244496c6f875ef1f7166d65f218d57ae92cabaajimblandy raw_context3.eip = 0xdf99a60c; 5269244496c6f875ef1f7166d65f218d57ae92cabaajimblandy Context context3(dump, raw_context3); 5279244496c6f875ef1f7166d65f218d57ae92cabaajimblandy Thread thread3(dump, 0x86e6c341, stack3, context3, 5289244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 0x32dc5c55, 0x17a2aba8, 0xe0cc75e7, 0xa46393994dae83aeULL); 5299244496c6f875ef1f7166d65f218d57ae92cabaajimblandy dump.Add(&stack3); 5309244496c6f875ef1f7166d65f218d57ae92cabaajimblandy dump.Add(&context3); 5319244496c6f875ef1f7166d65f218d57ae92cabaajimblandy dump.Add(&thread3); 5329244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 5339244496c6f875ef1f7166d65f218d57ae92cabaajimblandy Memory stack4(dump, 0x1e0ab4fa); 5349244496c6f875ef1f7166d65f218d57ae92cabaajimblandy stack4.Append("stack for thread four"); 5359244496c6f875ef1f7166d65f218d57ae92cabaajimblandy MDRawContextX86 raw_context4; 5369244496c6f875ef1f7166d65f218d57ae92cabaajimblandy raw_context4.context_flags = MD_CONTEXT_X86_INTEGER; 5379244496c6f875ef1f7166d65f218d57ae92cabaajimblandy raw_context4.eip = 0xaa646267; 5389244496c6f875ef1f7166d65f218d57ae92cabaajimblandy Context context4(dump, raw_context4); 5399244496c6f875ef1f7166d65f218d57ae92cabaajimblandy Thread thread4(dump, 0x261a28d4, stack4, context4, 5409244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 0x6ebd389e, 0xa0cd4759, 0x30168846, 0x164f650a0cf39d35ULL); 5419244496c6f875ef1f7166d65f218d57ae92cabaajimblandy dump.Add(&stack4); 5429244496c6f875ef1f7166d65f218d57ae92cabaajimblandy dump.Add(&context4); 5439244496c6f875ef1f7166d65f218d57ae92cabaajimblandy dump.Add(&thread4); 5449244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 5459244496c6f875ef1f7166d65f218d57ae92cabaajimblandy // Three modules! 5469244496c6f875ef1f7166d65f218d57ae92cabaajimblandy String module1_name(dump, "module one"); 5479244496c6f875ef1f7166d65f218d57ae92cabaajimblandy Module module1(dump, 0xeb77da57b5d4cbdaULL, 0x83cd5a37, module1_name); 5489244496c6f875ef1f7166d65f218d57ae92cabaajimblandy dump.Add(&module1_name); 5499244496c6f875ef1f7166d65f218d57ae92cabaajimblandy dump.Add(&module1); 5509244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 5519244496c6f875ef1f7166d65f218d57ae92cabaajimblandy String module2_name(dump, "module two"); 5529244496c6f875ef1f7166d65f218d57ae92cabaajimblandy Module module2(dump, 0x8675884adfe5ac90ULL, 0xb11e4ea3, module2_name); 5539244496c6f875ef1f7166d65f218d57ae92cabaajimblandy dump.Add(&module2_name); 5549244496c6f875ef1f7166d65f218d57ae92cabaajimblandy dump.Add(&module2); 5559244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 5569244496c6f875ef1f7166d65f218d57ae92cabaajimblandy String module3_name(dump, "module three"); 5579244496c6f875ef1f7166d65f218d57ae92cabaajimblandy Module module3(dump, 0x95fc1544da321b6cULL, 0x7c2bf081, module3_name); 5589244496c6f875ef1f7166d65f218d57ae92cabaajimblandy dump.Add(&module3_name); 5599244496c6f875ef1f7166d65f218d57ae92cabaajimblandy dump.Add(&module3); 5609244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 5619244496c6f875ef1f7166d65f218d57ae92cabaajimblandy // Add one more memory region, on top of the five stacks. 5629244496c6f875ef1f7166d65f218d57ae92cabaajimblandy Memory memory5(dump, 0x61979e828040e564ULL); 5639244496c6f875ef1f7166d65f218d57ae92cabaajimblandy memory5.Append("contents of memory 5"); 5649244496c6f875ef1f7166d65f218d57ae92cabaajimblandy dump.Add(&memory5); 5659244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 5669244496c6f875ef1f7166d65f218d57ae92cabaajimblandy dump.Finish(); 5679244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 5689244496c6f875ef1f7166d65f218d57ae92cabaajimblandy string contents; 5699244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_TRUE(dump.GetContents(&contents)); 5709244496c6f875ef1f7166d65f218d57ae92cabaajimblandy istringstream minidump_stream(contents); 5719244496c6f875ef1f7166d65f218d57ae92cabaajimblandy Minidump minidump(minidump_stream); 5729244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_TRUE(minidump.Read()); 5739244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_EQ(4U, minidump.GetDirectoryEntryCount()); 5749244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 5759244496c6f875ef1f7166d65f218d57ae92cabaajimblandy // Check the threads. 5769244496c6f875ef1f7166d65f218d57ae92cabaajimblandy MinidumpThreadList *thread_list = minidump.GetThreadList(); 5779244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_TRUE(thread_list != NULL); 5789244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_EQ(5U, thread_list->thread_count()); 5796162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com uint32_t thread_id; 5809244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_TRUE(thread_list->GetThreadAtIndex(0)->GetThreadID(&thread_id)); 5819244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_EQ(0xbbef4432U, thread_id); 5829244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_EQ(0x70b9ebfcU, 5839244496c6f875ef1f7166d65f218d57ae92cabaajimblandy thread_list->GetThreadAtIndex(0)->GetMemory()->GetBase()); 5849244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_EQ(0xaf0709e4U, 5859244496c6f875ef1f7166d65f218d57ae92cabaajimblandy thread_list->GetThreadAtIndex(0)->GetContext()->GetContextX86() 5869244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ->eip); 5879244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 5889244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_TRUE(thread_list->GetThreadAtIndex(1)->GetThreadID(&thread_id)); 5899244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_EQ(0x657c3f58U, thread_id); 5909244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_EQ(0xf988cc45U, 5919244496c6f875ef1f7166d65f218d57ae92cabaajimblandy thread_list->GetThreadAtIndex(1)->GetMemory()->GetBase()); 5929244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_EQ(0xe4f56f81U, 5939244496c6f875ef1f7166d65f218d57ae92cabaajimblandy thread_list->GetThreadAtIndex(1)->GetContext()->GetContextX86() 5949244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ->eip); 5959244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 5969244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_TRUE(thread_list->GetThreadAtIndex(2)->GetThreadID(&thread_id)); 5979244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_EQ(0xdf4b8a71U, thread_id); 5989244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_EQ(0xc8a92e7cU, 5999244496c6f875ef1f7166d65f218d57ae92cabaajimblandy thread_list->GetThreadAtIndex(2)->GetMemory()->GetBase()); 6009244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_EQ(0xb336a438U, 6019244496c6f875ef1f7166d65f218d57ae92cabaajimblandy thread_list->GetThreadAtIndex(2)->GetContext()->GetContextX86() 6029244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ->eip); 6039244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 6049244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_TRUE(thread_list->GetThreadAtIndex(3)->GetThreadID(&thread_id)); 6059244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_EQ(0x86e6c341U, thread_id); 6069244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_EQ(0x36d08e08U, 6079244496c6f875ef1f7166d65f218d57ae92cabaajimblandy thread_list->GetThreadAtIndex(3)->GetMemory()->GetBase()); 6089244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_EQ(0xdf99a60cU, 6099244496c6f875ef1f7166d65f218d57ae92cabaajimblandy thread_list->GetThreadAtIndex(3)->GetContext()->GetContextX86() 6109244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ->eip); 6119244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 6129244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_TRUE(thread_list->GetThreadAtIndex(4)->GetThreadID(&thread_id)); 6139244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_EQ(0x261a28d4U, thread_id); 6149244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_EQ(0x1e0ab4faU, 6159244496c6f875ef1f7166d65f218d57ae92cabaajimblandy thread_list->GetThreadAtIndex(4)->GetMemory()->GetBase()); 6169244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_EQ(0xaa646267U, 6179244496c6f875ef1f7166d65f218d57ae92cabaajimblandy thread_list->GetThreadAtIndex(4)->GetContext()->GetContextX86() 6189244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ->eip); 6199244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 6209244496c6f875ef1f7166d65f218d57ae92cabaajimblandy // Check the modules. 6219244496c6f875ef1f7166d65f218d57ae92cabaajimblandy MinidumpModuleList *md_module_list = minidump.GetModuleList(); 6229244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_TRUE(md_module_list != NULL); 6239244496c6f875ef1f7166d65f218d57ae92cabaajimblandy ASSERT_EQ(3U, md_module_list->module_count()); 6249244496c6f875ef1f7166d65f218d57ae92cabaajimblandy EXPECT_EQ(0xeb77da57b5d4cbdaULL, 6259244496c6f875ef1f7166d65f218d57ae92cabaajimblandy md_module_list->GetModuleAtIndex(0)->base_address()); 6269244496c6f875ef1f7166d65f218d57ae92cabaajimblandy EXPECT_EQ(0x8675884adfe5ac90ULL, 6279244496c6f875ef1f7166d65f218d57ae92cabaajimblandy md_module_list->GetModuleAtIndex(1)->base_address()); 6289244496c6f875ef1f7166d65f218d57ae92cabaajimblandy EXPECT_EQ(0x95fc1544da321b6cULL, 6299244496c6f875ef1f7166d65f218d57ae92cabaajimblandy md_module_list->GetModuleAtIndex(2)->base_address()); 6300cbd50c975c1680a6cd0f1ce2760e157e2bfd46fted.mielczarek} 6319244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 6327b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarekTEST(Dump, OneMemoryInfo) { 6337b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek Dump dump(0, kBigEndian); 6347b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek Stream stream(dump, MD_MEMORY_INFO_LIST_STREAM); 6357b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek 6367b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek // Add the MDRawMemoryInfoList header. 6376162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com const uint64_t kNumberOfEntries = 1; 6387b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek stream.D32(sizeof(MDRawMemoryInfoList)) // size_of_header 6397b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek .D32(sizeof(MDRawMemoryInfo)) // size_of_entry 6407b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek .D64(kNumberOfEntries); // number_of_entries 6417b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek 6427b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek 6437b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek // Now add a MDRawMemoryInfo entry. 6446162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com const uint64_t kBaseAddress = 0x1000; 6456162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com const uint64_t kRegionSize = 0x2000; 6467b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek stream.D64(kBaseAddress) // base_address 6477b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek .D64(kBaseAddress) // allocation_base 6487b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek .D32(MD_MEMORY_PROTECT_EXECUTE_READWRITE) // allocation_protection 6497b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek .D32(0) // __alignment1 6507b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek .D64(kRegionSize) // region_size 6517b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek .D32(MD_MEMORY_STATE_COMMIT) // state 6527b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek .D32(MD_MEMORY_PROTECT_EXECUTE_READWRITE) // protection 6537b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek .D32(MD_MEMORY_TYPE_PRIVATE) // type 6547b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek .D32(0); // __alignment2 6557b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek 6567b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek dump.Add(&stream); 6577b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek dump.Finish(); 6587b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek 6597b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek string contents; 6607b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek ASSERT_TRUE(dump.GetContents(&contents)); 6617b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek istringstream minidump_stream(contents); 6627b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek Minidump minidump(minidump_stream); 6637b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek ASSERT_TRUE(minidump.Read()); 6647b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek ASSERT_EQ(1U, minidump.GetDirectoryEntryCount()); 6657b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek 6667b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek const MDRawDirectory *dir = minidump.GetDirectoryEntryAtIndex(0); 6677b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek ASSERT_TRUE(dir != NULL); 6686162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com EXPECT_EQ((uint32_t) MD_MEMORY_INFO_LIST_STREAM, dir->stream_type); 6697b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek 6707b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek MinidumpMemoryInfoList *info_list = minidump.GetMemoryInfoList(); 6717b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek ASSERT_TRUE(info_list != NULL); 6727b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek ASSERT_EQ(1U, info_list->info_count()); 6737b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek 6747b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek const MinidumpMemoryInfo *info1 = info_list->GetMemoryInfoAtIndex(0); 6757b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek ASSERT_EQ(kBaseAddress, info1->GetBase()); 6767b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek ASSERT_EQ(kRegionSize, info1->GetSize()); 6777b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek ASSERT_TRUE(info1->IsExecutable()); 6787b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek ASSERT_TRUE(info1->IsWritable()); 6797b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek 6807b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek // Should get back the same memory region here. 6817b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek const MinidumpMemoryInfo *info2 = 6827b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek info_list->GetMemoryInfoForAddress(kBaseAddress + kRegionSize / 2); 6837b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek ASSERT_EQ(kBaseAddress, info2->GetBase()); 6847b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek ASSERT_EQ(kRegionSize, info2->GetSize()); 6857b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek} 6867b8e2b7e090b2d1223d0944d1e7da1d4c571bb5dted.mielczarek 6871a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarekTEST(Dump, OneExceptionX86) { 6881a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek Dump dump(0, kLittleEndian); 6891a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 6901a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek MDRawContextX86 raw_context; 6911a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.context_flags = MD_CONTEXT_X86_INTEGER | MD_CONTEXT_X86_CONTROL; 6921a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.edi = 0x3ecba80d; 6931a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.esi = 0x382583b9; 6941a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.ebx = 0x7fccc03f; 6951a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.edx = 0xf62f8ec2; 6961a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.ecx = 0x46a6a6a8; 6971a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.eax = 0x6a5025e2; 6981a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.ebp = 0xd9fabb4a; 6991a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.eip = 0x6913f540; 7001a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.cs = 0xbffe6eda; 7011a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.eflags = 0xb2ce1e2d; 7021a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.esp = 0x659caaa4; 7031a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.ss = 0x2e951ef7; 7041a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek Context context(dump, raw_context); 7051a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 7061a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek Exception exception(dump, context, 7071a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 0x1234abcd, // thread id 7081a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 0xdcba4321, // exception code 7091a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 0xf0e0d0c0, // exception flags 7101a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 0x0919a9b9c9d9e9f9ULL); // exception address 7111a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 7121a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek dump.Add(&context); 7131a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek dump.Add(&exception); 7141a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek dump.Finish(); 7151a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 7161a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek string contents; 7171a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek ASSERT_TRUE(dump.GetContents(&contents)); 7181a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 7191a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek istringstream minidump_stream(contents); 7201a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek Minidump minidump(minidump_stream); 7211a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek ASSERT_TRUE(minidump.Read()); 7221a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek ASSERT_EQ(1U, minidump.GetDirectoryEntryCount()); 7231a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 7241a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek MinidumpException *md_exception = minidump.GetException(); 7251a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek ASSERT_TRUE(md_exception != NULL); 7261a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 7276162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com uint32_t thread_id; 7281a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek ASSERT_TRUE(md_exception->GetThreadID(&thread_id)); 7292971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com ASSERT_EQ(0x1234abcdU, thread_id); 7301a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 7311a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek const MDRawExceptionStream* raw_exception = md_exception->exception(); 7321a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek ASSERT_TRUE(raw_exception != NULL); 7331a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0xdcba4321, raw_exception->exception_record.exception_code); 7341a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0xf0e0d0c0, raw_exception->exception_record.exception_flags); 7351a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0x0919a9b9c9d9e9f9ULL, 7361a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_exception->exception_record.exception_address); 7371a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 7381a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek MinidumpContext *md_context = md_exception->GetContext(); 7391a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek ASSERT_TRUE(md_context != NULL); 7406162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com ASSERT_EQ((uint32_t) MD_CONTEXT_X86, md_context->GetContextCPU()); 7411a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek const MDRawContextX86 *md_raw_context = md_context->GetContextX86(); 7421a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek ASSERT_TRUE(md_raw_context != NULL); 7436162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com ASSERT_EQ((uint32_t) (MD_CONTEXT_X86_INTEGER | MD_CONTEXT_X86_CONTROL), 7441a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek (md_raw_context->context_flags 7451a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek & (MD_CONTEXT_X86_INTEGER | MD_CONTEXT_X86_CONTROL))); 7461a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0x3ecba80dU, raw_context.edi); 7471a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0x382583b9U, raw_context.esi); 7481a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0x7fccc03fU, raw_context.ebx); 7491a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0xf62f8ec2U, raw_context.edx); 7501a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0x46a6a6a8U, raw_context.ecx); 7511a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0x6a5025e2U, raw_context.eax); 7521a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0xd9fabb4aU, raw_context.ebp); 7531a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0x6913f540U, raw_context.eip); 7541a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0xbffe6edaU, raw_context.cs); 7551a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0xb2ce1e2dU, raw_context.eflags); 7561a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0x659caaa4U, raw_context.esp); 7571a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0x2e951ef7U, raw_context.ss); 7581a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek} 7591a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 7601a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarekTEST(Dump, OneExceptionX86XState) { 7611a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek Dump dump(0, kLittleEndian); 7621a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 7631a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek MDRawContextX86 raw_context; 7641a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.context_flags = MD_CONTEXT_X86_INTEGER | 7651a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek MD_CONTEXT_X86_CONTROL | MD_CONTEXT_X86_XSTATE; 7661a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.edi = 0x3ecba80d; 7671a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.esi = 0x382583b9; 7681a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.ebx = 0x7fccc03f; 7691a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.edx = 0xf62f8ec2; 7701a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.ecx = 0x46a6a6a8; 7711a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.eax = 0x6a5025e2; 7721a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.ebp = 0xd9fabb4a; 7731a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.eip = 0x6913f540; 7741a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.cs = 0xbffe6eda; 7751a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.eflags = 0xb2ce1e2d; 7761a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.esp = 0x659caaa4; 7771a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.ss = 0x2e951ef7; 7781a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek Context context(dump, raw_context); 7791a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 7801a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek Exception exception(dump, context, 7811a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 0x1234abcd, // thread id 7821a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 0xdcba4321, // exception code 7831a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 0xf0e0d0c0, // exception flags 7841a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 0x0919a9b9c9d9e9f9ULL); // exception address 7851a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 7861a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek dump.Add(&context); 7871a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek dump.Add(&exception); 7881a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek dump.Finish(); 7891a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 7901a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek string contents; 7911a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek ASSERT_TRUE(dump.GetContents(&contents)); 7921a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 7931a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek istringstream minidump_stream(contents); 7941a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek Minidump minidump(minidump_stream); 7951a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek ASSERT_TRUE(minidump.Read()); 7961a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek ASSERT_EQ(1U, minidump.GetDirectoryEntryCount()); 7971a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 7981a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek MinidumpException *md_exception = minidump.GetException(); 7991a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek ASSERT_TRUE(md_exception != NULL); 8001a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 8016162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com uint32_t thread_id; 8021a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek ASSERT_TRUE(md_exception->GetThreadID(&thread_id)); 8032971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com ASSERT_EQ(0x1234abcdU, thread_id); 8041a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 8051a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek const MDRawExceptionStream* raw_exception = md_exception->exception(); 8061a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek ASSERT_TRUE(raw_exception != NULL); 8071a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0xdcba4321, raw_exception->exception_record.exception_code); 8081a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0xf0e0d0c0, raw_exception->exception_record.exception_flags); 8091a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0x0919a9b9c9d9e9f9ULL, 8101a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_exception->exception_record.exception_address); 8111a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 8121a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek MinidumpContext *md_context = md_exception->GetContext(); 8131a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek ASSERT_TRUE(md_context != NULL); 8146162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com ASSERT_EQ((uint32_t) MD_CONTEXT_X86, md_context->GetContextCPU()); 8151a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek const MDRawContextX86 *md_raw_context = md_context->GetContextX86(); 8161a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek ASSERT_TRUE(md_raw_context != NULL); 8176162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com ASSERT_EQ((uint32_t) (MD_CONTEXT_X86_INTEGER | MD_CONTEXT_X86_CONTROL), 8181a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek (md_raw_context->context_flags 8191a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek & (MD_CONTEXT_X86_INTEGER | MD_CONTEXT_X86_CONTROL))); 8201a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0x3ecba80dU, raw_context.edi); 8211a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0x382583b9U, raw_context.esi); 8221a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0x7fccc03fU, raw_context.ebx); 8231a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0xf62f8ec2U, raw_context.edx); 8241a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0x46a6a6a8U, raw_context.ecx); 8251a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0x6a5025e2U, raw_context.eax); 8261a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0xd9fabb4aU, raw_context.ebp); 8271a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0x6913f540U, raw_context.eip); 8281a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0xbffe6edaU, raw_context.cs); 8291a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0xb2ce1e2dU, raw_context.eflags); 8301a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0x659caaa4U, raw_context.esp); 8311a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0x2e951ef7U, raw_context.ss); 8321a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek} 8331a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 834233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com// Testing that the CPU type can be loaded from a system info stream when 835233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com// the CPU flags are missing from the context_flags of an exception record 836233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.comTEST(Dump, OneExceptionX86NoCPUFlags) { 837233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com Dump dump(0, kLittleEndian); 838233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com 839233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com MDRawContextX86 raw_context; 840233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com // Intentionally not setting CPU type in the context_flags 841233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com raw_context.context_flags = 0; 842233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com raw_context.edi = 0x3ecba80d; 843233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com raw_context.esi = 0x382583b9; 844233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com raw_context.ebx = 0x7fccc03f; 845233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com raw_context.edx = 0xf62f8ec2; 846233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com raw_context.ecx = 0x46a6a6a8; 847233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com raw_context.eax = 0x6a5025e2; 848233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com raw_context.ebp = 0xd9fabb4a; 849233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com raw_context.eip = 0x6913f540; 850233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com raw_context.cs = 0xbffe6eda; 851233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com raw_context.eflags = 0xb2ce1e2d; 852233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com raw_context.esp = 0x659caaa4; 853233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com raw_context.ss = 0x2e951ef7; 854233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com Context context(dump, raw_context); 855233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com 856233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com Exception exception(dump, context, 857233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com 0x1234abcd, // thread id 858233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com 0xdcba4321, // exception code 859233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com 0xf0e0d0c0, // exception flags 860233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com 0x0919a9b9c9d9e9f9ULL); // exception address 861233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com 862233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com dump.Add(&context); 863233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com dump.Add(&exception); 864233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com 865233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com // Add system info. This is needed as an alternative source for CPU type 866233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com // information. Note, that the CPU flags were intentionally skipped from 867233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com // the context_flags and this alternative source is required. 868233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com String csd_version(dump, "Service Pack 2"); 869233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com SystemInfo system_info(dump, SystemInfo::windows_x86, csd_version); 870233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com dump.Add(&system_info); 871233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com dump.Add(&csd_version); 872233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com 873233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com dump.Finish(); 874233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com 875233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com string contents; 876233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com ASSERT_TRUE(dump.GetContents(&contents)); 877233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com 878233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com istringstream minidump_stream(contents); 879233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com Minidump minidump(minidump_stream); 880233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com ASSERT_TRUE(minidump.Read()); 881233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com ASSERT_EQ(2U, minidump.GetDirectoryEntryCount()); 882233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com 883233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com MinidumpException *md_exception = minidump.GetException(); 884233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com ASSERT_TRUE(md_exception != NULL); 885233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com 8866162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com uint32_t thread_id; 887233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com ASSERT_TRUE(md_exception->GetThreadID(&thread_id)); 888233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com ASSERT_EQ(0x1234abcdU, thread_id); 889233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com 890233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com const MDRawExceptionStream* raw_exception = md_exception->exception(); 891233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com ASSERT_TRUE(raw_exception != NULL); 892233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com EXPECT_EQ(0xdcba4321, raw_exception->exception_record.exception_code); 893233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com EXPECT_EQ(0xf0e0d0c0, raw_exception->exception_record.exception_flags); 894233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com EXPECT_EQ(0x0919a9b9c9d9e9f9ULL, 895233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com raw_exception->exception_record.exception_address); 896233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com 897233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com MinidumpContext *md_context = md_exception->GetContext(); 898233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com ASSERT_TRUE(md_context != NULL); 899233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com 9006162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com ASSERT_EQ((uint32_t) MD_CONTEXT_X86, md_context->GetContextCPU()); 901233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com const MDRawContextX86 *md_raw_context = md_context->GetContextX86(); 902233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com ASSERT_TRUE(md_raw_context != NULL); 903233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com 904233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com // Even though the CPU flags were missing from the context_flags, the 905233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com // GetContext call above is expected to load the missing CPU flags from the 906233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com // system info stream and set the CPU type bits in context_flags. 9076162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com ASSERT_EQ((uint32_t) (MD_CONTEXT_X86), md_raw_context->context_flags); 908233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com 909233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com EXPECT_EQ(0x3ecba80dU, raw_context.edi); 910233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com EXPECT_EQ(0x382583b9U, raw_context.esi); 911233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com EXPECT_EQ(0x7fccc03fU, raw_context.ebx); 912233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com EXPECT_EQ(0xf62f8ec2U, raw_context.edx); 913233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com EXPECT_EQ(0x46a6a6a8U, raw_context.ecx); 914233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com EXPECT_EQ(0x6a5025e2U, raw_context.eax); 915233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com EXPECT_EQ(0xd9fabb4aU, raw_context.ebp); 916233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com EXPECT_EQ(0x6913f540U, raw_context.eip); 917233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com EXPECT_EQ(0xbffe6edaU, raw_context.cs); 918233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com EXPECT_EQ(0xb2ce1e2dU, raw_context.eflags); 919233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com EXPECT_EQ(0x659caaa4U, raw_context.esp); 920233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com EXPECT_EQ(0x2e951ef7U, raw_context.ss); 921233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com} 922233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com 923233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com// This test covers a scenario where a dump contains an exception but the 924233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com// context record of the exception is missing the CPU type information in its 925233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com// context_flags. The dump has no system info stream so it is imposible to 926233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com// deduce the CPU type, hence the context record is unusable. 927233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.comTEST(Dump, OneExceptionX86NoCPUFlagsNoSystemInfo) { 928233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com Dump dump(0, kLittleEndian); 929233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com 930233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com MDRawContextX86 raw_context; 931233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com // Intentionally not setting CPU type in the context_flags 932233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com raw_context.context_flags = 0; 933233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com raw_context.edi = 0x3ecba80d; 934233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com raw_context.esi = 0x382583b9; 935233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com raw_context.ebx = 0x7fccc03f; 936233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com raw_context.edx = 0xf62f8ec2; 937233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com raw_context.ecx = 0x46a6a6a8; 938233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com raw_context.eax = 0x6a5025e2; 939233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com raw_context.ebp = 0xd9fabb4a; 940233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com raw_context.eip = 0x6913f540; 941233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com raw_context.cs = 0xbffe6eda; 942233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com raw_context.eflags = 0xb2ce1e2d; 943233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com raw_context.esp = 0x659caaa4; 944233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com raw_context.ss = 0x2e951ef7; 945233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com Context context(dump, raw_context); 946233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com 947233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com Exception exception(dump, context, 948233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com 0x1234abcd, // thread id 949233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com 0xdcba4321, // exception code 950233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com 0xf0e0d0c0, // exception flags 951233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com 0x0919a9b9c9d9e9f9ULL); // exception address 952233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com 953233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com dump.Add(&context); 954233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com dump.Add(&exception); 955233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com dump.Finish(); 956233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com 957233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com string contents; 958233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com ASSERT_TRUE(dump.GetContents(&contents)); 959233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com 960233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com istringstream minidump_stream(contents); 961233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com Minidump minidump(minidump_stream); 962233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com ASSERT_TRUE(minidump.Read()); 963233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com ASSERT_EQ(1U, minidump.GetDirectoryEntryCount()); 964233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com 965233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com MinidumpException *md_exception = minidump.GetException(); 966233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com ASSERT_TRUE(md_exception != NULL); 967233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com 9686162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com uint32_t thread_id; 969233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com ASSERT_TRUE(md_exception->GetThreadID(&thread_id)); 970233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com ASSERT_EQ(0x1234abcdU, thread_id); 971233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com 972233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com const MDRawExceptionStream* raw_exception = md_exception->exception(); 973233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com ASSERT_TRUE(raw_exception != NULL); 974233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com EXPECT_EQ(0xdcba4321, raw_exception->exception_record.exception_code); 975233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com EXPECT_EQ(0xf0e0d0c0, raw_exception->exception_record.exception_flags); 976233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com EXPECT_EQ(0x0919a9b9c9d9e9f9ULL, 977233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com raw_exception->exception_record.exception_address); 978233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com 979233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com // The context record of the exception is unusable because the context_flags 980233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com // don't have CPU type information and at the same time the minidump lacks 981233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com // system info stream so it is impossible to deduce the CPU type. 982233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com MinidumpContext *md_context = md_exception->GetContext(); 983233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com ASSERT_EQ(NULL, md_context); 984233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com} 985233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com 9861a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarekTEST(Dump, OneExceptionARM) { 9871a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek Dump dump(0, kLittleEndian); 9881a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 9891a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek MDRawContextARM raw_context; 9901a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.context_flags = MD_CONTEXT_ARM_INTEGER; 9911a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.iregs[0] = 0x3ecba80d; 9921a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.iregs[1] = 0x382583b9; 9931a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.iregs[2] = 0x7fccc03f; 9941a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.iregs[3] = 0xf62f8ec2; 9951a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.iregs[4] = 0x46a6a6a8; 9961a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.iregs[5] = 0x6a5025e2; 9971a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.iregs[6] = 0xd9fabb4a; 9981a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.iregs[7] = 0x6913f540; 9991a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.iregs[8] = 0xbffe6eda; 10001a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.iregs[9] = 0xb2ce1e2d; 10011a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.iregs[10] = 0x659caaa4; 10021a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.iregs[11] = 0xf0e0d0c0; 10031a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.iregs[12] = 0xa9b8c7d6; 10041a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.iregs[13] = 0x12345678; 10051a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.iregs[14] = 0xabcd1234; 10061a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.iregs[15] = 0x10203040; 10071a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.cpsr = 0x2e951ef7; 10081a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek Context context(dump, raw_context); 10091a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 10101a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek Exception exception(dump, context, 10111a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 0x1234abcd, // thread id 10121a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 0xdcba4321, // exception code 10131a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 0xf0e0d0c0, // exception flags 10141a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 0x0919a9b9c9d9e9f9ULL); // exception address 10151a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 10161a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek dump.Add(&context); 10171a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek dump.Add(&exception); 10181a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek dump.Finish(); 10191a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 10201a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek string contents; 10211a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek ASSERT_TRUE(dump.GetContents(&contents)); 10221a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 10231a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek istringstream minidump_stream(contents); 10241a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek Minidump minidump(minidump_stream); 10251a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek ASSERT_TRUE(minidump.Read()); 10261a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek ASSERT_EQ(1U, minidump.GetDirectoryEntryCount()); 10271a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 10281a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek MinidumpException *md_exception = minidump.GetException(); 10291a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek ASSERT_TRUE(md_exception != NULL); 10301a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 10316162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com uint32_t thread_id; 10321a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek ASSERT_TRUE(md_exception->GetThreadID(&thread_id)); 10332971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com ASSERT_EQ(0x1234abcdU, thread_id); 10341a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 10351a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek const MDRawExceptionStream* raw_exception = md_exception->exception(); 10361a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek ASSERT_TRUE(raw_exception != NULL); 10371a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0xdcba4321, raw_exception->exception_record.exception_code); 10381a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0xf0e0d0c0, raw_exception->exception_record.exception_flags); 10391a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0x0919a9b9c9d9e9f9ULL, 10401a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_exception->exception_record.exception_address); 10411a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 10421a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek MinidumpContext *md_context = md_exception->GetContext(); 10431a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek ASSERT_TRUE(md_context != NULL); 10446162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com ASSERT_EQ((uint32_t) MD_CONTEXT_ARM, md_context->GetContextCPU()); 10451a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek const MDRawContextARM *md_raw_context = md_context->GetContextARM(); 10461a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek ASSERT_TRUE(md_raw_context != NULL); 10476162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com ASSERT_EQ((uint32_t) MD_CONTEXT_ARM_INTEGER, 10481a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek (md_raw_context->context_flags 10491a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek & MD_CONTEXT_ARM_INTEGER)); 10501a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0x3ecba80dU, raw_context.iregs[0]); 10511a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0x382583b9U, raw_context.iregs[1]); 10521a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0x7fccc03fU, raw_context.iregs[2]); 10531a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0xf62f8ec2U, raw_context.iregs[3]); 10541a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0x46a6a6a8U, raw_context.iregs[4]); 10551a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0x6a5025e2U, raw_context.iregs[5]); 10561a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0xd9fabb4aU, raw_context.iregs[6]); 10571a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0x6913f540U, raw_context.iregs[7]); 10581a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0xbffe6edaU, raw_context.iregs[8]); 10591a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0xb2ce1e2dU, raw_context.iregs[9]); 10601a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0x659caaa4U, raw_context.iregs[10]); 10611a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0xf0e0d0c0U, raw_context.iregs[11]); 10621a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0xa9b8c7d6U, raw_context.iregs[12]); 10631a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0x12345678U, raw_context.iregs[13]); 10641a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0xabcd1234U, raw_context.iregs[14]); 10651a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0x10203040U, raw_context.iregs[15]); 10661a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0x2e951ef7U, raw_context.cpsr); 10671a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek} 10681a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 10691a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarekTEST(Dump, OneExceptionARMOldFlags) { 10701a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek Dump dump(0, kLittleEndian); 10711a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 10721a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek MDRawContextARM raw_context; 10731a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek // MD_CONTEXT_ARM_INTEGER, but with _OLD 10741a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.context_flags = MD_CONTEXT_ARM_OLD | 0x00000002; 10751a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.iregs[0] = 0x3ecba80d; 10761a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.iregs[1] = 0x382583b9; 10771a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.iregs[2] = 0x7fccc03f; 10781a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.iregs[3] = 0xf62f8ec2; 10791a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.iregs[4] = 0x46a6a6a8; 10801a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.iregs[5] = 0x6a5025e2; 10811a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.iregs[6] = 0xd9fabb4a; 10821a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.iregs[7] = 0x6913f540; 10831a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.iregs[8] = 0xbffe6eda; 10841a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.iregs[9] = 0xb2ce1e2d; 10851a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.iregs[10] = 0x659caaa4; 10861a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.iregs[11] = 0xf0e0d0c0; 10871a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.iregs[12] = 0xa9b8c7d6; 10881a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.iregs[13] = 0x12345678; 10891a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.iregs[14] = 0xabcd1234; 10901a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.iregs[15] = 0x10203040; 10911a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_context.cpsr = 0x2e951ef7; 10921a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek Context context(dump, raw_context); 10931a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 10941a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek Exception exception(dump, context, 10951a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 0x1234abcd, // thread id 10961a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 0xdcba4321, // exception code 10971a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 0xf0e0d0c0, // exception flags 10981a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 0x0919a9b9c9d9e9f9ULL); // exception address 10991a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 11001a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek dump.Add(&context); 11011a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek dump.Add(&exception); 11021a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek dump.Finish(); 11031a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 11041a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek string contents; 11051a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek ASSERT_TRUE(dump.GetContents(&contents)); 11061a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 11071a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek istringstream minidump_stream(contents); 11081a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek Minidump minidump(minidump_stream); 11091a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek ASSERT_TRUE(minidump.Read()); 11101a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek ASSERT_EQ(1U, minidump.GetDirectoryEntryCount()); 11111a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 11121a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek MinidumpException *md_exception = minidump.GetException(); 11131a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek ASSERT_TRUE(md_exception != NULL); 11141a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 11156162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com uint32_t thread_id; 11161a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek ASSERT_TRUE(md_exception->GetThreadID(&thread_id)); 11172971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com ASSERT_EQ(0x1234abcdU, thread_id); 11181a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 11191a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek const MDRawExceptionStream* raw_exception = md_exception->exception(); 11201a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek ASSERT_TRUE(raw_exception != NULL); 11211a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0xdcba4321, raw_exception->exception_record.exception_code); 11221a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0xf0e0d0c0, raw_exception->exception_record.exception_flags); 11231a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0x0919a9b9c9d9e9f9ULL, 11241a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek raw_exception->exception_record.exception_address); 11251a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 11261a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek MinidumpContext *md_context = md_exception->GetContext(); 11271a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek ASSERT_TRUE(md_context != NULL); 11286162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com ASSERT_EQ((uint32_t) MD_CONTEXT_ARM, md_context->GetContextCPU()); 11291a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek const MDRawContextARM *md_raw_context = md_context->GetContextARM(); 11301a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek ASSERT_TRUE(md_raw_context != NULL); 11316162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com ASSERT_EQ((uint32_t) MD_CONTEXT_ARM_INTEGER, 11321a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek (md_raw_context->context_flags 11331a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek & MD_CONTEXT_ARM_INTEGER)); 11341a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0x3ecba80dU, raw_context.iregs[0]); 11351a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0x382583b9U, raw_context.iregs[1]); 11361a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0x7fccc03fU, raw_context.iregs[2]); 11371a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0xf62f8ec2U, raw_context.iregs[3]); 11381a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0x46a6a6a8U, raw_context.iregs[4]); 11391a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0x6a5025e2U, raw_context.iregs[5]); 11401a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0xd9fabb4aU, raw_context.iregs[6]); 11411a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0x6913f540U, raw_context.iregs[7]); 11421a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0xbffe6edaU, raw_context.iregs[8]); 11431a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0xb2ce1e2dU, raw_context.iregs[9]); 11441a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0x659caaa4U, raw_context.iregs[10]); 11451a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0xf0e0d0c0U, raw_context.iregs[11]); 11461a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0xa9b8c7d6U, raw_context.iregs[12]); 11471a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0x12345678U, raw_context.iregs[13]); 11481a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0xabcd1234U, raw_context.iregs[14]); 11491a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0x10203040U, raw_context.iregs[15]); 11501a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek EXPECT_EQ(0x2e951ef7U, raw_context.cpsr); 11511a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek} 11521a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 11535f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.comTEST(Dump, OneExceptionMIPS) { 11545f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com Dump dump(0, kLittleEndian); 11555f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com 11565f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com MDRawContextMIPS raw_context; 11575f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com raw_context.context_flags = MD_CONTEXT_MIPS_INTEGER; 11585f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com raw_context.iregs[0] = 0x3ecba80d; 11595f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com raw_context.iregs[1] = 0x382583b9; 11605f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com raw_context.iregs[2] = 0x7fccc03f; 11615f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com raw_context.iregs[3] = 0xf62f8ec2; 11625f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com raw_context.iregs[4] = 0x46a6a6a8; 11635f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com raw_context.iregs[5] = 0x6a5025e2; 11645f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com raw_context.iregs[6] = 0xd9fabb4a; 11655f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com raw_context.iregs[7] = 0x6913f540; 11665f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com raw_context.iregs[8] = 0xbffe6eda; 11675f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com raw_context.iregs[9] = 0xb2ce1e2d; 11685f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com raw_context.iregs[10] = 0x659caaa4; 11695f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com raw_context.iregs[11] = 0xf0e0d0c0; 11705f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com raw_context.iregs[12] = 0xa9b8c7d6; 11715f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com raw_context.iregs[13] = 0x12345678; 11725f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com raw_context.iregs[14] = 0xabcd1234; 11735f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com raw_context.iregs[15] = 0x10203040; 11745f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com raw_context.iregs[16] = 0xa80d3ecb; 11755f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com raw_context.iregs[17] = 0x83b93825; 11765f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com raw_context.iregs[18] = 0xc03f7fcc; 11775f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com raw_context.iregs[19] = 0x8ec2f62f; 11785f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com raw_context.iregs[20] = 0xa6a846a6; 11795f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com raw_context.iregs[21] = 0x25e26a50; 11805f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com raw_context.iregs[22] = 0xbb4ad9fa; 11815f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com raw_context.iregs[23] = 0xf5406913; 11825f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com raw_context.iregs[24] = 0x6edabffe; 11835f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com raw_context.iregs[25] = 0x1e2db2ce; 11845f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com raw_context.iregs[26] = 0xaaa4659c; 11855f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com raw_context.iregs[27] = 0xd0c0f0e0; 11865f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com raw_context.iregs[28] = 0xc7d6a9b8; 11875f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com raw_context.iregs[29] = 0x56781234; 11885f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com raw_context.iregs[30] = 0x1234abcd; 11895f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com raw_context.iregs[31] = 0x30401020; 11905f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com 11915f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com Context context(dump, raw_context); 11925f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com 11935f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com Exception exception(dump, context, 11945f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com 0x1234abcd, // Thread id. 11955f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com 0xdcba4321, // Exception code. 11965f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com 0xf0e0d0c0, // Exception flags. 11975f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com 0x0919a9b9); // Exception address. 11985f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com 11995f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com dump.Add(&context); 12005f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com dump.Add(&exception); 12015f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com dump.Finish(); 12025f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com 12035f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com string contents; 12045f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com ASSERT_TRUE(dump.GetContents(&contents)); 12055f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com 12065f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com istringstream minidump_stream(contents); 12075f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com Minidump minidump(minidump_stream); 12085f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com ASSERT_TRUE(minidump.Read()); 12095f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com ASSERT_EQ(1U, minidump.GetDirectoryEntryCount()); 12105f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com 12115f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com MinidumpException *md_exception = minidump.GetException(); 12125f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com ASSERT_TRUE(md_exception != NULL); 12135f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com 12145f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com uint32_t thread_id; 12155f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com ASSERT_TRUE(md_exception->GetThreadID(&thread_id)); 12165f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com ASSERT_EQ(0x1234abcdU, thread_id); 12175f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com 12185f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com const MDRawExceptionStream* raw_exception = md_exception->exception(); 12195f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com ASSERT_TRUE(raw_exception != NULL); 12205f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com EXPECT_EQ(0xdcba4321, raw_exception->exception_record.exception_code); 12215f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com EXPECT_EQ(0xf0e0d0c0, raw_exception->exception_record.exception_flags); 12225f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com EXPECT_EQ(0x0919a9b9U, 12235f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com raw_exception->exception_record.exception_address); 12245f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com 12255f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com MinidumpContext* md_context = md_exception->GetContext(); 12265f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com ASSERT_TRUE(md_context != NULL); 12275f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com ASSERT_EQ((uint32_t) MD_CONTEXT_MIPS, md_context->GetContextCPU()); 12285f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com const MDRawContextMIPS* md_raw_context = md_context->GetContextMIPS(); 12295f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com ASSERT_TRUE(md_raw_context != NULL); 12305f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com ASSERT_EQ((uint32_t) MD_CONTEXT_MIPS_INTEGER, 12315f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com (md_raw_context->context_flags & MD_CONTEXT_MIPS_INTEGER)); 12325f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com EXPECT_EQ(0x3ecba80dU, raw_context.iregs[0]); 12335f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com EXPECT_EQ(0x382583b9U, raw_context.iregs[1]); 12345f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com EXPECT_EQ(0x7fccc03fU, raw_context.iregs[2]); 12355f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com EXPECT_EQ(0xf62f8ec2U, raw_context.iregs[3]); 12365f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com EXPECT_EQ(0x46a6a6a8U, raw_context.iregs[4]); 12375f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com EXPECT_EQ(0x6a5025e2U, raw_context.iregs[5]); 12385f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com EXPECT_EQ(0xd9fabb4aU, raw_context.iregs[6]); 12395f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com EXPECT_EQ(0x6913f540U, raw_context.iregs[7]); 12405f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com EXPECT_EQ(0xbffe6edaU, raw_context.iregs[8]); 12415f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com EXPECT_EQ(0xb2ce1e2dU, raw_context.iregs[9]); 12425f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com EXPECT_EQ(0x659caaa4U, raw_context.iregs[10]); 12435f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com EXPECT_EQ(0xf0e0d0c0U, raw_context.iregs[11]); 12445f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com EXPECT_EQ(0xa9b8c7d6U, raw_context.iregs[12]); 12455f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com EXPECT_EQ(0x12345678U, raw_context.iregs[13]); 12465f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com EXPECT_EQ(0xabcd1234U, raw_context.iregs[14]); 12475f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com EXPECT_EQ(0x10203040U, raw_context.iregs[15]); 12485f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com EXPECT_EQ(0xa80d3ecbU, raw_context.iregs[16]); 12495f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com EXPECT_EQ(0x83b93825U, raw_context.iregs[17]); 12505f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com EXPECT_EQ(0xc03f7fccU, raw_context.iregs[18]); 12515f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com EXPECT_EQ(0x8ec2f62fU, raw_context.iregs[19]); 12525f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com EXPECT_EQ(0xa6a846a6U, raw_context.iregs[20]); 12535f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com EXPECT_EQ(0x25e26a50U, raw_context.iregs[21]); 12545f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com EXPECT_EQ(0xbb4ad9faU, raw_context.iregs[22]); 12555f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com EXPECT_EQ(0xf5406913U, raw_context.iregs[23]); 12565f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com EXPECT_EQ(0x6edabffeU, raw_context.iregs[24]); 12575f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com EXPECT_EQ(0x1e2db2ceU, raw_context.iregs[25]); 12585f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com EXPECT_EQ(0xaaa4659cU, raw_context.iregs[26]); 12595f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com EXPECT_EQ(0xd0c0f0e0U, raw_context.iregs[27]); 12605f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com EXPECT_EQ(0xc7d6a9b8U, raw_context.iregs[28]); 12615f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com EXPECT_EQ(0x56781234U, raw_context.iregs[29]); 12625f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com EXPECT_EQ(0x1234abcdU, raw_context.iregs[30]); 12635f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com EXPECT_EQ(0x30401020U, raw_context.iregs[31]); 12645f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com} 12655f22d6a7f471f2352d394c188560fd06830e14f3gordana.cmiljanovic@imgtec.com 12669244496c6f875ef1f7166d65f218d57ae92cabaajimblandy} // namespace 1267