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

时间:2018-06-03 12:10:53

标签: c++ crash directx directx-11

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

我正在开发一款使用DirectX 11.1的游戏。我一直在使用谷歌的Crash-Pad library女巫将Minidumps上传到服务器的崩溃记者,以后可以使用Visual Studio打开或取消符号化并打印每个线程的堆栈跟踪崩溃的时间。

我总是被一些有线堆栈跟踪垃圾邮件发送到驱动程序dll(当然不能去符号化),而且我一直认为这些堆栈跟踪与驱动程序崩溃有关。 / p>

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

由于

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

1 个答案:

答案 0 :(得分:0)

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

请注意,SEH不允许析构函数运行。通常情况下,这是一件坏事,但无论如何你都要杀死这个过程,所以这不是一个问题。但是,在执行SEH处理程序时,不会释放在对象的构造函数中获取的任何锁定。不仅如此,如果在堆栈上分配对象本身将不再存在,从而阻止任何类型的实际清理。

同样,上面不是问题,因为你的进程正处于崩溃的中间。数据损坏现在无关紧要,因为该流程已经过了FUBAR。所有你需要做的就是弹出一个消息框,说你崩溃了,保存你绝对需要的任何信息(这里没有锁,因为锁定状态现在是不确定的),并且终止(不退出)进程(如果退出,则发送进程/线程分离通知,这可能会导致死锁)。

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