Surfacing the process create time in google_breakpad::ProcessState
and updating minidump_stackwalk to show process uptime. I tested this with a minidump from Chrome and I got a result that is inline with what the Windows debugger is showing for that dump: minidump_stackwalk output: -------------------------- Process uptime: 601 seconds WinDBG output: -------------- Process Uptime: 0 days 0:10:01.000 I didn't update the machine readable output of minidump_stackwalk on purpose in order to avoid breaking someone that uses it. It can be added later to the machine output if needed. R=mark@chromium.org Review URL: https://breakpad.appspot.com/7754002 git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@1406 4c0a9323-5329-0410-9bdc-e9ce6186880e
This commit is contained in:
@@ -66,6 +66,7 @@ class MockMinidump : public Minidump {
|
||||
MOCK_CONST_METHOD0(header, const MDRawHeader*());
|
||||
MOCK_METHOD0(GetThreadList, MinidumpThreadList*());
|
||||
MOCK_METHOD0(GetSystemInfo, MinidumpSystemInfo*());
|
||||
MOCK_METHOD0(GetMiscInfo, MinidumpMiscInfo*());
|
||||
MOCK_METHOD0(GetBreakpadInfo, MinidumpBreakpadInfo*());
|
||||
MOCK_METHOD0(GetException, MinidumpException*());
|
||||
MOCK_METHOD0(GetAssertion, MinidumpAssertion*());
|
||||
@@ -126,6 +127,17 @@ class MockMinidumpMemoryRegion : public MinidumpMemoryRegion {
|
||||
MockMemoryRegion region_;
|
||||
};
|
||||
|
||||
// A test miscelaneous info stream, just returns values from the
|
||||
// MDRawMiscInfo fed to it.
|
||||
class TestMinidumpMiscInfo : public MinidumpMiscInfo {
|
||||
public:
|
||||
explicit TestMinidumpMiscInfo(const MDRawMiscInfo& misc_info) :
|
||||
MinidumpMiscInfo(NULL) {
|
||||
valid_ = true;
|
||||
misc_info_ = misc_info;
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace google_breakpad
|
||||
|
||||
namespace {
|
||||
@@ -135,6 +147,7 @@ using google_breakpad::CallStack;
|
||||
using google_breakpad::CodeModule;
|
||||
using google_breakpad::MinidumpContext;
|
||||
using google_breakpad::MinidumpMemoryRegion;
|
||||
using google_breakpad::MinidumpMiscInfo;
|
||||
using google_breakpad::MinidumpProcessor;
|
||||
using google_breakpad::MinidumpSystemInfo;
|
||||
using google_breakpad::MinidumpThreadList;
|
||||
@@ -402,6 +415,8 @@ TEST_F(MinidumpProcessorTest, TestBasicProcessing) {
|
||||
ASSERT_EQ(state.crash_address(), 0x45U);
|
||||
ASSERT_EQ(state.threads()->size(), size_t(1));
|
||||
ASSERT_EQ(state.requesting_thread(), 0);
|
||||
EXPECT_EQ(1171480435U, state.time_date_stamp());
|
||||
EXPECT_EQ(1171480435U, state.process_create_time());
|
||||
|
||||
CallStack *stack = state.threads()->at(0);
|
||||
ASSERT_TRUE(stack);
|
||||
@@ -529,6 +544,40 @@ TEST_F(MinidumpProcessorTest, TestThreadMissingMemory) {
|
||||
ASSERT_EQ(kExpectedEIP, state.threads()->at(0)->frames()->at(0)->instruction);
|
||||
}
|
||||
|
||||
TEST_F(MinidumpProcessorTest, GetProcessCreateTime) {
|
||||
const uint32_t kProcessCreateTime = 2000;
|
||||
const uint32_t kTimeDateStamp = 5000;
|
||||
MockMinidump dump;
|
||||
EXPECT_CALL(dump, path()).WillRepeatedly(Return("mock minidump"));
|
||||
EXPECT_CALL(dump, Read()).WillRepeatedly(Return(true));
|
||||
|
||||
// Set time of crash.
|
||||
MDRawHeader fake_header;
|
||||
fake_header.time_date_stamp = kTimeDateStamp;
|
||||
EXPECT_CALL(dump, header()).WillRepeatedly(Return(&fake_header));
|
||||
|
||||
// Set process create time.
|
||||
MDRawMiscInfo raw_misc_info;
|
||||
memset(&raw_misc_info, 0, sizeof(raw_misc_info));
|
||||
raw_misc_info.process_create_time = kProcessCreateTime;
|
||||
raw_misc_info.flags1 |= MD_MISCINFO_FLAGS1_PROCESS_TIMES;
|
||||
google_breakpad::TestMinidumpMiscInfo dump_misc_info(raw_misc_info);
|
||||
EXPECT_CALL(dump, GetMiscInfo()).WillRepeatedly(Return(&dump_misc_info));
|
||||
|
||||
// No threads
|
||||
MockMinidumpThreadList thread_list;
|
||||
EXPECT_CALL(dump, GetThreadList()).WillOnce(Return(&thread_list));
|
||||
EXPECT_CALL(thread_list, thread_count()).WillRepeatedly(Return(0));
|
||||
|
||||
MinidumpProcessor processor(reinterpret_cast<SymbolSupplier*>(NULL), NULL);
|
||||
ProcessState state;
|
||||
EXPECT_EQ(google_breakpad::PROCESS_OK, processor.Process(&dump, &state));
|
||||
|
||||
// Verify the time stamps.
|
||||
ASSERT_EQ(kTimeDateStamp, state.time_date_stamp());
|
||||
ASSERT_EQ(kProcessCreateTime, state.process_create_time());
|
||||
}
|
||||
|
||||
TEST_F(MinidumpProcessorTest, TestThreadMissingContext) {
|
||||
MockMinidump dump;
|
||||
EXPECT_CALL(dump, path()).WillRepeatedly(Return("mock minidump"));
|
||||
|
||||
Reference in New Issue
Block a user