我发现了许多关于如何在需要时手动创建崩溃转储的帖子,但我想要做的是确保在受监控的应用程序崩溃时生成崩溃转储。
TechNet PROCDUMP工具可以很好地做到这一点。我想知道的是,我如何在自己的管理程序中编写一些代码来做同样的事情,以便只在发生异常时创建一个转储文件。
我的程序是一个服务应用程序,它知道我希望监视的程序的进程I。
为了清楚起见,我想模仿一下这个对PROCDUMP的调用会做什么:
procdump -e someprocess.exe -w
理论上,Windows应该能够通过DrWatson为我完成这项工作。我遇到的问题是,我有大约200个客户系统在运行,它们声称我们的应用程序随机崩溃。Watson博士似乎没有确认我们的应用程序正在崩溃的事实,所以我决定由我们自己的软件来控制崩溃转储的生成。
我已经设法让我自己的应用程序使用带有MiniDumpWithFullMemory类型的__try/except和MiniDumpWriteDump()创建它们自己的转储文件。但我不能用WinDbg查看本地变量等,所以我猜这是因为它是从应用程序本身内部触发的。所以..。我希望使用监控/管理类型的应用程序来完成这项工作的另一个原因。
至少..。一个应用程序如何对另一个应用程序崩溃做出反应?您是否必须安装某种调试钩子,或者假装管理程序实际上是一个自定义调试器?
干杯
发布于 2011-09-16 09:00:36
好吧,我自己想出来了。我已经编写了自己的“调试器”,可以捕获在我的“调试器”附加到的程序中生成的异常。现在,我只需要弄清楚如何编写该外部进程的小型转储。棘手的部分似乎是我必须提供一个EXCEPTION_POINTERS数组。这是我现在需要弄清楚的唯一一点。
下面是一个示例代码片段。我希望它能在未来帮助其他人:
void WriteCrashDump( EXCEPTION_DEBUG_INFO *pExceptionInfo )
{
CONTEXT c;
memset( &c, 0, sizeof( c ) );
GetThreadContext( hThread, &c );
EXCEPTION_POINTERS ep;
ep.ContextRecord = &c;
ep.ExceptionRecord = &pExceptionInfo->ExceptionRecord;
MINIDUMP_EXCEPTION_INFORMATION minidump_exception;
minidump_exception.ThreadId = dwThreadId;
minidump_exception.ExceptionPointers = &ep;
minidump_exception.ClientPointers = true;
HANDLE hFile = CreateFile( "dump.dmp", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
if( hFile )
{
BOOL fSuccess;
fSuccess = MiniDumpWriteDump( hProcess, dwProcessId, hFile, MiniDumpWithFullMemory, &minidump_exception, NULL, NULL );
if( ! fSuccess )
printf( "MiniDumpWriteDump -FAILED\n" );
CloseHandle( hFile );
}
}
void DebugLoop( void )
{
DEBUG_EVENT de;
while( 1 )
{
WaitForDebugEvent( &de, INFINITE );
switch( de.dwDebugEventCode )
{
case CREATE_PROCESS_DEBUG_EVENT:
hProcess = de.u.CreateProcessInfo.hProcess;
break;
case EXCEPTION_DEBUG_EVENT:
printf( "EXCEPTION_DEBUG_EVENT\n" );
// PDS: Not interested in the fact that I have attached to it and caused a breakpoint..
if( de.u.Exception.ExceptionRecord.ExceptionCode == EXCEPTION_BREAKPOINT )
break;
dwProcessId = de.dwProcessId;
dwThreadId = de.dwThreadId;
WriteCrashDump( &de.u.Exception );
return;
default:
break;
}
ContinueDebugEvent( de.dwProcessId, de.dwThreadId, DBG_CONTINUE );
}
}https://stackoverflow.com/questions/7424528
复制相似问题