【问题标题】:Getting a dump of a process that crashes on startup获取启动时崩溃的进程的转储
【发布时间】:2009-03-30 09:33:29
【问题描述】:

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

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

cscript adplus.vbs -crash

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

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

【问题讨论】:

  • 你是用哪个版本的VS来创建exe的?如果是 2005 年或更晚,他需要正确的运行时。

标签: c++ winapi startup crash-dumps


【解决方案1】:

或者,您可以设置自己的转储生成框架,当遇到任何未处理的异常时,它会自动创建进程转储。这将避免客户端必须安装 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; 
}

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

【讨论】:

【解决方案2】:

您可以在客户端计算机上安装WinDBG,然后使用“Image File Execution Options”并将WinDBG 设置为在进程启动后打开。然后运行崩溃进程,WinDBG 将立即打开。按 g(Go)并等待进程崩溃,然后键入“.dump /mfh dumpFileName.dmp”。现在您有了可以调试的转储文件。

【讨论】:

  • 工作得非常好。谢谢。对您的答案进行小修改:在“.dump /mfh”之后需要添加转储文件名。
【解决方案3】:

这是收集 Vista SP1 崩溃的好方法:

http://msdn.microsoft.com/en-us/library/bb787181(VS.85).aspx

无需在机器上安装任何东西!

【讨论】:

    【解决方案4】:

    在客户端机器上安装开发者工具将是我最后的选择,我必须承认我讨厌这个想法,尤其是在有适合你的替代方案的情况下。

    首先注册WinQual。您现在可以自动访问客户的故障转储和其他错误。我记得这是一项免费服务,没有理由不使用它。

    由于 WinQual 可能需要一段时间才能将故障转储发送给您,而且对客户的响应速度更快一些总是很好的,尤其是在您的应用程序崩溃时,请使用 Dr. Watson。我记得当崩溃发生时,在单击对话框之前,您可以从 Start->Run 或命令行运行 drwatsn32,然后会弹出 Dr Watson。此时关闭崩溃对话框将生成一个崩溃转储文件。如果此操作失败,请通过在命令行中使用 -i 参数运行 Dr Watson 来安装它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-08
      • 1970-01-01
      • 2016-03-22
      • 1970-01-01
      • 1970-01-01
      • 2018-06-01
      • 1970-01-01
      • 2017-02-12
      相关资源
      最近更新 更多