1

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,其中包含进程中每个线程的时间戳,但这不包含在我看到的小型转储中。

4

2 回答 2

1

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

我下面的代码假定您已将系统对象 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 ) );
}
于 2011-11-11T22:21:10.580 回答
0

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

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

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

于 2010-08-20T15:53:15.623 回答