未处理的Win32异常

3

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


你使用哪种编程语言?是.NET吗?C++? - Oded
4个回答

2
对于一个本地的C++应用程序,请查看我之前在这里的答案:在 Windows 上检测/重定向核心转储(当软件崩溃时),以捕获未处理的异常 (同时提供了创建崩溃转储的代码,您可以使用它来分析崩溃。如果崩溃发生在开发系统上,则在Visual Studio(我假设您正在使用它,如果不是其他IDE将有类似的操作),在“调试 / 异常”中勾选“Win32异常”的“抛出”框。

1

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

Windows 不会进一步缩小范围,而且通常也无法缩小范围。例如,如果你在程序中超出数组的末尾,Windows 可能甚至不会意识到你正在迭代一个数组。它只看到“读取:OK,读取:OK,读取:越界 => 页面错误 => 访问冲突”。你需要从违反地址(你的数组迭代代码)和被违反的地址(数组后面的越界地址)中找出问题所在。


0
如果它是一个 .Net 应用程序,你可以尝试为 UnhandledException 事件添加一个处理程序。你可以在此处找到更多关于此的信息和一些示例代码 here
总的来说,你的异常处理可能存在问题,所以值得检查代码并找出可能抛出异常但没有处理的地方。

0
使用调试器。您可以运行程序并查看导致应用程序崩溃的异常是什么。它可能能够确定抛出的位置。我没有使用VS调试器进行此操作,但是在gdb中,您可以使用catch throw来强制在抛出异常时触发断点,应该有类似的功能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接