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,其中包含进程中每个线程的时间戳,但这不包含在我见过的小型转储中。
答案 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 ) );
}