【发布时间】:2011-03-12 16:25:22
【问题描述】:
在运行时,当 myApp.exe 崩溃时,我收到“未处理的 Win32 异常”,但我怎么知道发生了哪个异常?哪里出了问题?
【问题讨论】:
-
您使用什么语言?这是.NET吗? C++?
标签: c++ exception-handling win32exception
在运行时,当 myApp.exe 崩溃时,我收到“未处理的 Win32 异常”,但我怎么知道发生了哪个异常?哪里出了问题?
【问题讨论】:
标签: c++ exception-handling win32exception
对于原生 C++ 应用程序,请参阅我之前的回答:Detect/Redirect core dumps (when a software crashes) on Windows 用于捕获未处理的异常(这还提供了用于创建崩溃转储的代码,您可以使用它稍后分析崩溃。如果崩溃发生在开发中系统然后在 Visual Studio 中(我假设您正在使用它,如果不是其他 IDE 也会有类似的东西),在 Debug/Exceptions 中勾选 'Win32 Exceptions' 的 'Thrown' 框。
【讨论】:
通常,Windows 也会为您提供几个十六进制数字。异常代码可能是0xC0000005。这是访问冲突的代码。发生这种情况时,您还将获得三个额外的信息位:违规地址、违规地址和违规类型(读取、写入或执行)。
Windows 不会进一步缩小范围,而且通常也不会。例如,如果您在程序中走过数组的末尾,Windows 可能不会意识到您甚至在遍历数组。它只看到“读取:OK,读取:OK,读取:越界 => 页面错误 => 访问违规”。您必须从违规地址(您的数组迭代代码)和违规地址(您的数组后面的越界地址)中找出答案。
【讨论】:
如果它是一个 .Net 应用程序,您可以尝试为 UnhandledException 事件添加一个处理程序。您可以找到有关它的更多信息和一些示例代码here。
一般来说,您的异常处理被破坏是一个好兆头,因此可能值得仔细检查您的代码并找到可能抛出但您不处理异常的地方。
【讨论】:
使用调试器。您可以运行该程序并查看引发的哪些异常会杀死您的应用程序。它也许能够查明投掷的位置。我没有为此使用VS调试器,但是在gdb中您可以使用catch throw在抛出异常时强制断点,应该有类似的东西。
【讨论】: