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

How to handle DirectX 11 driver crash

本文关键字:DirectX 驱动程序 崩溃 处理 何处理      更新时间:2023-10-16

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

我正在开发一款使用 DirectX 11.1 的游戏。我已经使用崩溃报告器很长一段时间了,使用Google的Crash-Pad库女巫将小型转储上传到服务器,以后可以使用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设备(

我已经按照MSDN指南处理标准DXGI返回代码,以防设备删除和重置(DXGI_ERROR_DEVICE_REMOVED && DXGI_ERROR_DEVICE_RESET(

谢谢

编辑:我不介意退出我的应用程序,我只想向用户解释我的应用程序遇到致命错误,现在将退出(尽可能正确(

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

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

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

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