我有一个简单的程序:WinDBG的转储不能进行调试
int ExecuteCommand(wchar_t* commandLine)
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
BOOL bRet;
DWORD lpExitCode;
memset(&si, 0, sizeof(si));
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
bRet = CreateProcess(
NULL, // pointer to name of executable module
commandLine, // pointer to command line string
NULL, // process security attributes
NULL, // thread security attributes
FALSE, // handle inheritance flag
NORMAL_PRIORITY_CLASS, // creation flags
NULL, // pointer to new environment block
NULL, // pointer to current directory name
&si, // pointer to STARTUPINFO
&pi // pointer to PROCESS_INFORMATION
);
if(bRet) WaitForSingleObject(pi.hProcess, INFINITE); // wait for process to finish
GetExitCodeProcess(pi.hProcess, &lpExitCode);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
return lpExitCode;
}
void CreateCoreDump()
{
wchar_t buffer[256];
wsprintf(buffer, _T("windbg -p %d -c \".dump /mfh /u C:\\Tmp\\crashdump.dmp\""), GetCurrentProcessId());
ExecuteCommand(buffer);
}
DWORD ExceptionFilter()
{
CreateCoreDump();
return EXCEPTION_CONTINUE_SEARCH;
}
int _tmain(int argc, _TCHAR* argv[])
{
__try
{
int* p = NULL;
*p = 100;
}
__except(ExceptionFilter())
{
}
return 0;
}
它会生成一个核心转储时,有一个例外,使用功能CreateCoreDump。虽然转储文件可以成功生成,但似乎没用:
如果我使用windbg打开这个转储文件,那么在调用堆栈中没有任何东西!
但是,如果我直接在WinDbg中调试这个应用程序,并调用CreateCoreDump线设置断点,然后运行WinDbg的命令:
.dump /mfh C:\Tmp\mydump.dmp
打开使用WinDbg这个转储文件,我可以看到完整的调用堆栈。
我是否在生成转储文件或使用windbg调试转储文件时出错?
谢谢。
谢谢约翰,它的工作原理。你提到“调试器没有看到异常事件”,这是因为转储文件是由代码创建的,对吧? –
当调试器连接到进程时,它正在侦听调试事件(请参阅http://msdn.microsoft.com/zh-cn/library/ms679302(VS.85).aspx)。当发生异常时附加调试器时,它将看到一个EXCEPTION_DEBUG_EVENT事件并知道该过程中存在异常。事件通知发生在异常处理之前(第一次机会),并且如果在链中没有发现异常处理程序,则可能会再次发生。当您连接调试器时,它会在第一次机会通知后发生。 – John
您可以通过使用'-g'和'-e event'来让调试器查看二次机会异常(如果该异常未被其他人捕获)。标志。'-e'告诉调试器在连接时发出给定事件的信号,所以你需要创建一个可继承的通知事件,发送它的句柄(作为十进制数)作为'-e'参数的值,然后等待事件创建子进程后。 – John