3

在运行时,当 myApp.exe 崩溃时,我收到“未处理的 Win32 异常”,但我怎么知道发生了哪个异常?哪里出了问题?

4

4 回答 4

2

对于 Native C++ 应用程序,请参见我之前的答案:Detect/Redirect core dumps (when a software crashs) on Windows以捕获未处理的异常(这也提供了用于创建故障转储的代码,您可以稍后使用它来分析崩溃。如果崩溃发生在开发系统上,然后在 Visual Studio 中(我假设您正在使用它,如果不是其他 IDE 也会有类似的东西),在调试/异常中勾选“Win32 异常”的“抛出”框。

于 2010-07-07T07:49:04.443 回答
1

通常,Windows 也会为您提供几个十六进制数字。异常代码可能是0xC0000005. 这是访问冲突的代码。发生这种情况时,您还将获得三个额外的信息:违规地址、违规地址和违规类型(读取、写入或执行)。

Windows 不会进一步缩小范围,而且通常也不会。例如,如果您在程序中走过数组的末尾,Windows 可能不会意识到您甚至在遍历数组。它只看到“读取:OK,读取:OK,读取:越界 => 页面错误 => 访问违规”。您必须从违规地址(您的数组迭代代码)和违规地址(数组后面的越界地址)中找出答案。

于 2010-07-07T14:40:53.160 回答
0

如果它是一个 .Net 应用程序,您可以尝试为该UnhandledException事件添加一个处理程序。您可以在此处找到有关它的更多信息和一些示例代码。

一般来说,这是一个很好的迹象,表明您的异常处理已被破坏,因此可能值得仔细阅读您的代码并找到可能抛出但您不处理异常的地方。

于 2010-07-07T07:31:12.200 回答
0

使用调试器。您可以运行该程序并查看引发了哪些异常会杀死您的应用程序。它可能能够精确定位投掷的位置。我没有为此使用VS调试器,但是在gdb中你可以catch throw在抛出异常时使用强制断点,应该有类似的东西。

于 2010-07-07T07:43:37.453 回答