Gui*_*ici 4 c++ winapi startup crash-dumps
在我无法访问的客户机器(WinXP SP2)上,我有一个在启动时崩溃的Win32 EXE(非托管C++).我想解决此问题的最佳方法是获取(小型)转储并稍后使用windbg或类似方法进行分析.
现在,我通常会告诉客户安装Windows调试工具并运行
cscript adplus.vbs -crash
Run Code Online (Sandbox Code Playgroud)
但是,您似乎无法将adplus用于在启动时崩溃的应用程序(http://support.microsoft.com/kb/q286350/说"在以下情况下不要使用ADPlus:如果必须对程序进行故障排除或在启动期间意外退出的进程").同一篇文章说"使用用户模式进程转储",但我未能成功安装它.
知道如何在Win32上启动崩溃的进程转储?
Can*_*pus 13
或者,您可以设置自己的转储生成框架,在遇到任何未处理的异常时自动创建进程转储.这将避免客户端必须安装Windbg.
使用SetUnhandledExceptionFilter Win32 API在应用程序启动时注册应用程序级异常处理程序.只要有任何未处理的异常,就会调用已注册的回调函数.然后,U可以使用DbgHelp.dll中的MiniDumpWriteDump api创建进程转储.
示例代码: -
LONG WINAPI My_UnhandledExceptionFilter(struct _EXCEPTION_POINTERS* ExceptionInfo)
{
HANDLE hFile = CreateFile("FileName",
GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
MINIDUMP_EXCEPTION_INFORMATION aMiniDumpInfo;
aMiniDumpInfo.ThreadId = GetCurrentThreadId();
aMiniDumpInfo.ExceptionPointers = ExceptionInfo;
aMiniDumpInfo.ClientPointers = TRUE;
MiniDumpWriteDump(GetCurrentProcess(),
GetCurrentProcessId(),
hFile,
(MINIDUMP_TYPE) (MiniDumpWithFullMemory|MiniDumpWithHandleData),
&aMiniDumpInfo,
NULL,
NULL);
CloseHandle(hFile);
return EXCEPTION_EXECUTE_HANDLER;
}
int main(int argc, char* argv[])
{
SetUnhandledExceptionFilter(&My_UnhandledExceptionFilter);
// User code throwing exception..
return 0;
}
Run Code Online (Sandbox Code Playgroud)
注意: - 正在调试进程时,不会调用已注册的异常过滤器.因此,在调试期间,如果在异常过滤器函数中放置断点,即使在导致未处理的异常后仍未命中,也不要感到惊讶.
| 归档时间: |
|
| 查看次数: |
4772 次 |
| 最近记录: |