WinDBG 适用于从 Visual Studio 2015 保存的转储,但不适用于任务管理器。显示异常代码 "not found"
WinDBG works with Dump saved from Visual Studio 2015 but not Task Manager. Shows Exception Code "not found"
我无法获取使用任务管理器(32 位或 64 位)或 Process Explorer 创建的转储文件以在 WinDBG 或 Visual Studio 2015 中提供有用的结果,而直接从 VS 写入的转储在两者中都表现出色。我需要任务管理器转储才能工作,以便我可以分析最终用户发送的转储文件。
我已将问题简化为最简单的 Win32 应用程序,它是在 VS 2015 C++ 中创建的,故意写入 NULL 指针以导致异常。如果我运行VS中的程序,在异常发生时使用Save Dump As,那么可以在VS和WinDBG中使用转储文件来查看导致问题的代码。这符合预期。
但是,如果我 运行 VS 之外的应用程序,则 Windows 显示通常的对话框:
“Win32Project.exe has stopped working … Debug / Close Program”.
虽然此对话框仍处于活动状态,但我转到任务管理器 32 位并 select 创建转储文件。但是将此转储文件加载到 VS 或 WinDBG 中不会提供有用的信息。特别是 VS 将异常代码显示为“未找到”。单击“Debug with Native only”会导致“The application is in break mode to be shown”。见下文……
我正在 运行安装一台新的 Win 10 64 位 PC。 DMP、PDB、EXE文件都在同一个目录下,符号目录我试了无数次
Visual Studio 加载.DMP 文件后的 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
...
为什么会出现您所看到的情况?
它在 Visual Studio 中工作,因为调试器已经附加。在进程终止之前,调试器会被告知异常。调试器将在 Windows 错误报告对话框出现之前停止进程,并在原始异常仍处于活动状态时创建故障转储。
要了解有关异常如何从程序传递到调试器(第一次机会)、返回到程序(catch 块)、再次传递到调试器(第二次机会)以及最后传递到 OS, google 表示 "exception dispatching".
它不适用于任务管理器,因为异常调度已经处于其最后状态,即 "get handled by the OS"。这使得 Windows 通过使用断点停止程序。然后它显示该对话框。当您现在创建故障转储时,为时已晚并且很难从该故障转储中获取有用的信息。
你有什么选择?
a) Windows 错误报告
此处应用的机制称为 Windows 错误报告。如果您在 Microsoft 拥有帐户,您的客户只需单击 "submit" 按钮即可。然后您将从 Microsoft 获得一些信息。你问问题的方式让我假设你没有这样的帐户。
然后,使用名为 LocalDumps (MSDN). It's a Registry key to configure Windows to save a crash dump on disk. Make sure you understand what you need from such a dump in order to configure it correctly. In doubt, have a look at How do I take a good crash dump for .NET 的功能并使用相同的设置(全内存用户模式小型转储)。它对 C++ 也有好处。
甚至有可能 activate this Registry key while the dialog is shown 但我自 2014 年以来就没有再证实这一点,因此我不能推荐它。
使用空指针取消引用示例应用程序检查您的设置是否有效。为此,请将可执行文件重命名为与实际程序相同的名称。
b) 附加调试器
将调试器附加到进程,然后让应用程序继续。在对话框中按 "Debug" 并确认显示 "a debugger is already attached" 的消息。第二次机会异常再次抛出,调试器会得到它,你可以进行故障转储。
如需截图,见my article about it
请注意,在方法 b) 中,您可能会犯很多错误,从而导致不正确的结果。安全的方法是按照 a)
中的描述激活 LocalDumps
我建议 ProcDump from Windows Sysinternals 试一试。您可以将其设置为在应用崩溃时捕获应用转储,或将其设置为即时调试器并让它为任何应用崩溃写入转储。
有关详细信息,请参阅上述网站中的文档和示例。
我无法获取使用任务管理器(32 位或 64 位)或 Process Explorer 创建的转储文件以在 WinDBG 或 Visual Studio 2015 中提供有用的结果,而直接从 VS 写入的转储在两者中都表现出色。我需要任务管理器转储才能工作,以便我可以分析最终用户发送的转储文件。
我已将问题简化为最简单的 Win32 应用程序,它是在 VS 2015 C++ 中创建的,故意写入 NULL 指针以导致异常。如果我运行VS中的程序,在异常发生时使用Save Dump As,那么可以在VS和WinDBG中使用转储文件来查看导致问题的代码。这符合预期。
但是,如果我 运行 VS 之外的应用程序,则 Windows 显示通常的对话框:
“Win32Project.exe has stopped working … Debug / Close Program”.
虽然此对话框仍处于活动状态,但我转到任务管理器 32 位并 select 创建转储文件。但是将此转储文件加载到 VS 或 WinDBG 中不会提供有用的信息。特别是 VS 将异常代码显示为“未找到”。单击“Debug with Native only”会导致“The application is in break mode to be shown”。见下文……
我正在 运行安装一台新的 Win 10 64 位 PC。 DMP、PDB、EXE文件都在同一个目录下,符号目录我试了无数次
Visual Studio 加载.DMP 文件后的 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
...
为什么会出现您所看到的情况?
它在 Visual Studio 中工作,因为调试器已经附加。在进程终止之前,调试器会被告知异常。调试器将在 Windows 错误报告对话框出现之前停止进程,并在原始异常仍处于活动状态时创建故障转储。
要了解有关异常如何从程序传递到调试器(第一次机会)、返回到程序(catch 块)、再次传递到调试器(第二次机会)以及最后传递到 OS, google 表示 "exception dispatching".
它不适用于任务管理器,因为异常调度已经处于其最后状态,即 "get handled by the OS"。这使得 Windows 通过使用断点停止程序。然后它显示该对话框。当您现在创建故障转储时,为时已晚并且很难从该故障转储中获取有用的信息。
你有什么选择?
a) Windows 错误报告
此处应用的机制称为 Windows 错误报告。如果您在 Microsoft 拥有帐户,您的客户只需单击 "submit" 按钮即可。然后您将从 Microsoft 获得一些信息。你问问题的方式让我假设你没有这样的帐户。
然后,使用名为 LocalDumps (MSDN). It's a Registry key to configure Windows to save a crash dump on disk. Make sure you understand what you need from such a dump in order to configure it correctly. In doubt, have a look at How do I take a good crash dump for .NET 的功能并使用相同的设置(全内存用户模式小型转储)。它对 C++ 也有好处。
甚至有可能 activate this Registry key while the dialog is shown 但我自 2014 年以来就没有再证实这一点,因此我不能推荐它。
使用空指针取消引用示例应用程序检查您的设置是否有效。为此,请将可执行文件重命名为与实际程序相同的名称。
b) 附加调试器
将调试器附加到进程,然后让应用程序继续。在对话框中按 "Debug" 并确认显示 "a debugger is already attached" 的消息。第二次机会异常再次抛出,调试器会得到它,你可以进行故障转储。
如需截图,见my article about it
请注意,在方法 b) 中,您可能会犯很多错误,从而导致不正确的结果。安全的方法是按照 a)
中的描述激活 LocalDumps我建议 ProcDump from Windows Sysinternals 试一试。您可以将其设置为在应用崩溃时捕获应用转储,或将其设置为即时调试器并让它为任何应用崩溃写入转储。
有关详细信息,请参阅上述网站中的文档和示例。