Как справиться с аварией драйвера DirectX 11 - PullRequest
0 голосов
/ 03 июня 2018

Прежде всего, извините, если этот вопрос задавался много раз, но я не смог найти правильного ответа в Интернете.

Я занимаюсь разработкой игры, использующей 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)

Я уже работаю со стандартными кодами возврата DXGI в случае удаления и сброса устройства (DXGI_ERROR_DEVICE_REMOVED && DXGI_ERROR_DEVICE_RESET) после MSDNguide

Спасибо

РЕДАКТИРОВАТЬ: я не против выйти из приложения, я просто хочу объяснить пользователю, что мое приложение столкнулось с фатальной ошибкой и теперь завершится (как можно лучше)

1 Ответ

0 голосов
/ 11 июня 2018

Самый простой способ отловить сбой и завершить работу - использовать структурированный обработчик исключений во всей вашей основной функции.Это позволит отследить нарушения доступа, разделить на нули и другие серьезные ошибки, которые могут привести к сбою.Оттуда вы можете отобразить всплывающее окно, в котором указывается характер сбоя перед завершением процесса.

Обратите внимание, что SEH не позволяет запускать деструкторы.Обычно это плохо, но здесь вы все равно убиваете процесс, так что это не такая большая проблема.Однако любые блокировки, которые были приняты в конструкторе объекта, не будут освобождены после выполнения обработчика SEH.Мало того, но сами объекты больше не будут существовать, если бы они были размещены в стеке, предотвращая любую реальную очистку.

Опять же, вышеизложенное не является проблемой, так как ваш процесс находится в середине сбоя.Повреждение данных в настоящее время не имеет значения, так как процесс уже FUBARed.Все, что вам нужно сделать, это открыть окно с сообщением о том, что вы потерпели крах, сохранить любую информацию, которая вам абсолютно необходима (здесь не используйте блокировки, поскольку состояние блокировки теперь неопределенно), и завершить (не выходить)process (при выходе из системы отправляются уведомления об отключении процесса / потока, что может привести к взаимоблокировкам).

Это может быть расширено на все другие потоки, которые вы явно создаете, если потоки начнутся с общей точки входа, войдут в рамку SEH и впоследствии ответвляются к своим соответствующим задачам.

...