c++ - 获取启动时崩溃的进程的转储

标签 c++ winapi startup crash-dumps

在我无法访问的客户机器 (WinXP SP2) 上,我有一个 Win32 EXE(非托管 C++)在启动时崩溃。我想解决此问题的最佳方法是获取(小型)转储并稍后使用 windbg 或类似工具对其进行分析。

现在,我通常会告诉客户安装 Windows 调试工具并运行

cscript adplus.vbs -crash

但是,您似乎无法将 adplus 用于在启动时崩溃的应用程序(http://support.microsoft.com/kb/q286350/ 表示“在以下情况下请勿使用 ADPlus:如果您必须对在启动期间意外退出的程序或进程进行故障排除” ).同一篇文章说“使用User Mode Process Dump”,但我没能成功安装。

知道如何获取在 Win32 上启动时崩溃的进程的转储吗?

最佳答案

或者,您可以设置自己的转储生成框架,该框架会在遇到任何未处理的异常时自动创建进程转储。这将避免客户端必须安装 Windbg。

使用 SetUnhandledExceptionFilter Win32 API 在应用程序启动时注册应用程序级异常处理程序。只要有任何未处理的异常,就会调用注册的回调函数。然后,您可以使用 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; 
}

注意:- 在调试进程时不会调用已注册的异常过滤器。因此,在调试期间,如果您在异常过滤器函数中放置断点,即使在导致未处理异常后它也没有命中,请不要感到惊讶。

关于c++ - 获取启动时崩溃的进程的转储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/696580/

相关文章:

CFB 中的 C# AES 加密,其中明文长度等于加密长度

c++ - UUID 和 uuid_t 数据类型在赋值后可以更改吗?

java - 将应用程序放在 Windows 启动上,无需 Java 中的用户交互

c++ - Matlab S Function Builder 如何将编译器更改为 g++

c++ - 模拟类来测试它的方法

c - 为什么 FormatMessage() 无法找到 WinINet 错误消息?

c# - 如何从不同应用程序的窗口控件中读取数据?

xcode - Xcode 9.1启动失败-UNCAUGHT EXCEPTION(NSInternalInconsistencyException)

batch-file - 如何将项目添加到注册表以在不使用UAC的情况下在启动时运行

c++ - 程序需要一个括号,但那里已经有一个