c++ - 如何处理 DirectX 11 驱动程序崩溃

标签 c++ crash directx directx-11

首先,如果这个问题被问了很多次,我很抱歉,但我在网上找不到任何合适的答案。

我正在开发一款使用 DirectX 11.1 的游戏。我使用 Google 的 Crash-Pad library 的崩溃报告器已经有一段时间了。女巫将 Minidump 上传到服务器,稍后可以使用 Visual Studio 打开该服务器,或者在崩溃时取消符号化并打印每个线程的堆栈跟踪。

我一直被一些真正深入到驱动程序 dll 中的有线堆栈跟踪信息所困扰(当然不能去符号化),我一直认为这些堆栈跟踪信息与驱动程序崩溃有关。

Thread 10224 Crashed:
0   igd10iumd64.dll                 0x7ffbddcb4cba      <unknown>
1   igd10iumd64.dll                 0x7ffbddcae78e      <unknown>
2   igd11dxva64.dll                 0x7ffbaef99377      <unknown>
3   igd10iumd64.dll                 0x7ffbddcae2f9      <unknown>
4   igd10iumd64.dll                 0x7ffbddd89e17      <unknown>
5   igd11dxva64.dll                 0x7ffbaef73c5c      <unknown>
6   igd11dxva64.dll                 0x7ffbaef7314d      <unknown>
7   igd11dxva64.dll                 0x7ffbaef3efcf      <unknown>
8   igd11dxva64.dll                 0x7ffbaeff158a      <unknown>
9   igd11dxva64.dll                 0x7ffbaefe8cf6      <unknown>
10  igd11dxva64.dll                 0x7ffbaefe96b8      <unknown>

我现在的问题是,在典型的 DirectX 应用程序中,您如何处理此类崩溃并确保您的应用程序稳健且不会崩溃? (即使我需要重新创建整个 D3D11 设备)

我已经在处理标准的 DXGI 返回代码,以防在 DXGI_ERROR_DEVICE_REMOVED && DXGI_ERROR_DEVICE_RESET 之后的设备移除和重置 (MSDN guide)

谢谢

编辑:我不介意必须退出我的应用程序,我只是想向用户解释我的应用程序遇到了 fatal error ,现在将退出(尽可能适本地)

最佳答案

捕获崩溃和终止的最简单方法是在整个主函数周围使用结构化异常处理程序。这将捕获访问冲突、被零除和其他会导致崩溃的硬错误。从那里,您可以在终止进程之前显示一个弹出窗口,说明崩溃的性质。

请注意,SEH 不允许运行析构函数。通常,这是一件坏事,但在这里您无论如何都会终止进程,所以这不是什么大问题。但是,在执行 SEH 处理程序时不会释放在对象的构造函数中获取的任何锁。不仅如此,如果对象被分配到堆栈上,它们本身将不再存在,从而阻止任何类型的真正清理。

同样,以上不是这里的问题,因为您的进程正在崩溃。数据损坏现在无关紧要,因为该过程已经 FUBARed。您需要做的就是弹出一个消息框说您崩溃了,保存您绝对需要的任何信息(这里不要使用锁,因为锁状态现在不确定),然后终止(不退出)进程(如果退出,将发送进程/线程分离通知,这可能会导致死锁)。

这可以扩展到您显式创建的所有其他线程,方法是让线程从公共(public)入口点开始,进入 SEH 框架,然后分支到各自的任务。

关于c++ - 如何处理 DirectX 11 驱动程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50666254/

相关文章:

c++ - 将游戏 handle 摇杆值转换为范围

c++ - DXGI.h 编译错误?

c++ - 需要一些建议以使代码多线程

c++ - QT对话框关闭和删除

java - 为什么我的 Android 应用程序在启动新 Activity 时崩溃?

android - Android应用程式在安装时当机

wpf - 如何调试WPF vb.NET App崩溃?

c++ - 纹理重复

c++ - 将数据从 C++ 应用程序写入数据库

c++ - 使用静态库比包含头文件有什么好处?