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:
ivanpe@chromium.org
2014-11-25 22:45:23 +00:00
parent 57e5b074f6
commit 63919583ba
10 changed files with 123 additions and 15 deletions

View File

@@ -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"));