WinDBG适用于从Visual Studio 2015中保存的转储,但不是任务pipe理器。 显示exception代码“找不到”

我无法使用任务pipe理器(32位或64位)或Process Explorer创build转储文件,以便在WinDBG或Visual Studio 2015中提供有用的结果,而直接从VS编写的转储在两者中都非常出色。 我需要任务pipe理器转储工作,以便我可以分析我的最终用户发送的转储文件。

我已经将问题简化为在VS 2015 C ++中创build的最简单的可能的Win32应用程序,并且故意写入NULL指针以引发exception。 如果我在VS中运行程序并使用Save Dump As,当发生exception时,可以在VS和WinDBG中使用转储文件来查看导致问题的代码。 这是预期的。

但是,如果我在VS之外运行应用程序,那么Windows将显示通常的对话框:

“Win32Project.exe已停止工作…debugging/closures程序”。

虽然这个对话框仍然活跃,我去任务pipe理器32位,并select创build转储文件。 但是将这个转储文件加载到VS或者WinDBG中并没有提供有用的信息。 特别是VS显示exception代码为“未find”。 点击“仅使用本地debugging”会导致“应用程序处于中断模式”。 见下文…

我正在运行一个新的Win 10 64位PC。 DMP,PDB和EXE文件在同一个目录下,我已经无休止地尝试了符号目录

加载.DMP文件后的Visual Studio 2015输出:

Dump Summary ------------ Dump File: Win32Project1 (4).DMP : C:\Users\Rob\AppData\Local\Temp\Win32Project1 (4).DMP Last Write Time: 24/08/2017 16:38:27 Process Name: Win32Project1.exe : C:\Temp\ConsoleAp2\Win32Project2\Debug\Win32Project1.exe Process Architecture: x86 Exception Code: not found Exception Information: Heap Information: Present System Information ------------------ OS Version: 10.0.15063 CLR Version(s): Modules ------- Module Name Module Path Module Version ----------- ----------- -------------- Win32Project1.exe C:\Temp\ConsoleAp2\Win32Project2\Debug\Win32Project1.exe 0.0.0.0 ntdll.dll C:\Windows\System32\ntdll.dll 10.0.15063.447 kernel32.dll C:\Windows\System32\kernel32.dll 10.0.15063.296 ... 

Solutions Collecting From Web of "WinDBG适用于从Visual Studio 2015中保存的转储,但不是任务pipe理器。 显示exception代码“找不到”"

为什么会出现你所看到的?

它在Visual Studio中工作,因为调试器已经连接。 调试程序在进程终止之前被通知异常。 在Windows错误报告对话框出现之前,调试器将暂停进程,并在原始异常仍处于活动状态时创建崩溃转储。

要详细了解如何将异常从程序传递到调试器(第一次机会),再回到程序(catch块),再次调试器(第二次机会)以及最后到达操作系统,google中的术语“异常调度“。

它不适用于任务管理器,因为异常分派已经处于其“最终状态”,即“由操作系统处理”。 这使得Windows通过使用断点来暂停程序。 然后显示对话框。 现在创建崩溃转储时,已经太迟了,从崩溃转储中获取有用的信息非常困难。

你有什么选择?

a)Windows错误报告

这里适用的机制称为Windows错误报告。 如果您在Microsoft有一个帐户,您的客户可以简单地点击“提交”按钮。 你会从微软那里得到一些信息。 你问这个问题的方式让我假设你没有这样的账户。

然后,使用一个名为LocalDumps(MSDN)的功能 。 这是一个注册表项,用于配置Windows以将故障转储保存到磁盘上。 确保你明白你需要从这样的转储,以正确配置它。 有疑问,看看我如何为.NET做一个好的崩溃转储,并使用相同的设置(全内存用户模式迷你转储)。 这对C ++也是有好处的。

显示对话框时甚至可以激活此注册表项,但自2014年以来我没有再确认这一点,我不能推荐它。

通过使用空指针解引用示例应用程序来检查您的设置是否工作。 为此,请将您的可执行文件重命名为与您的实际程序相同的名称。

b)附加一个调试器

将调试器附加到进程,然后让应用程序继续。 按对话框中的“调试”,并确认“调试器已连接”的信息。 第二次机会异常再次抛出,调试器将得到它,你可以采取崩溃转储。

如果您需要截图,请参阅我的文章

请注意,在方法b)中,您可能会犯很多错误,从而导致不正确的结果。 安全的方法是按照a)所述激活LocalDump,

我建议从Windows Sysinternals给ProcDump一个镜头。 您可以将其设置为在应用程序崩溃时捕获应用程序的转储,或将其设置为即时调试程序,并让它为任何应用程序崩溃写入转储。

有关更多详细信息,请参阅上述网站中的文档和示例。