minidump文件是否包含崩溃的时间戳?

时间:2010-03-15 09:52:49

标签: minidump postmortem-debugging

minidump文件中的MiscInfoStream包含进程创建时间。我想知道崩溃前该过程运行了多长时间。 minidump文件是否包含异常时间戳?

此转储文件上的WinDbg显示以下内容,这意味着它位于某处......

Debug session time: Tue Dec 29 15:49:20.000 2009 (GMT+0)
System Uptime: not available
Process Uptime: 0 days 0:33:03.000

(DumpChk在流列表的末尾显示相同的信息)

请注意,今天是3月15日,所以这几乎肯定是崩溃的时间戳。我想用一种编程方式来检索该值和“Process Uptime”值。

我找到了MINIDUMP_MISC_INFO_3结构,其中包含一些时区信息,但它似乎没有包含异常时间。

某些转储文件似乎有一个ThreadInfoListStream,其中包含进程中每个线程的时间戳,但这不包含在我见过的小型转储中。

2 个答案:

答案 0 :(得分:0)

我不认为异常的时间存储在minidump文件中的任何位置。异常结构当然不包含此信息: http://msdn.microsoft.com/en-us/library/ms680367%28VS.85%29.aspx

misc info结构确实包含进程开始时间,但不包含异常时间: http://msdn.microsoft.com/en-us/library/ms680389%28VS.85%29.aspx

您可以在此处查看minidump的所有可能内容: http://msdn.microsoft.com/en-us/library/ms680394%28v=VS.85%29.aspx

答案 1 :(得分:0)

您可以使用dbgeng api获取崩溃时间和进程时间的值。有关dumpstk示例,请参阅Windbg sdk目录 - 您可以对其进行修改以获取此信息。

我的代码假设您已将系统对象2接口的新查询接口添加到新的全局g_SysObjects中。

IDebugSystemObjects2* g_SysObjects;

并将g_Control从IDebugControl更改为IDebugControl2。

#include <time.h>
void DumpUpTimeAndCrashTime()
{
    ULONG upTime = 0;

    g_SysObjects->GetCurrentProcessUpTime(&upTime);
    int days = upTime / (60*60*24);
    int hours = (upTime % (60*60*24)) / (60*60);
    int minutes = (upTime % (60*60))/60;
    int seconds = upTime % 60;
    printf("Process uptime %d days %02d:%02d:%02d.000\n", 
            days, hours, minutes, seconds);

    ULONG crashTime = 0;
    g_Control->GetCurrentTimeDate(&crashTime);
    time_t ct = crashTime;
    printf( "Crash time and date: %s", _ctime64( &ct ) );
}