dd_action('wp_footer', function() { ?>
Практические инструкции: что делать, если что-то сломалось дома. Только причины и реальные решения.
WinDbg (Windows Debugger) — профессиональный отладчик Microsoft для анализа сбоев программ Windows.
Он используется для глубокого поиска причин:
В отличие от:
WinDbg позволяет посмотреть:
что происходило внутри программы в момент падения.
Схема работы:
Игра падает
↓
Создание дампа памяти
↓
WinDbg
↓
Анализ стека
↓
Поиск виновного модуля
↓
ИсправлениеДля обычного отсутствия DLL WinDbg не нужен.
Он используется, когда:
0xc0000005;Современная версия:
WinDbg Previewустанавливается через:
Microsoft StoreСтарая версия:
Windows SDK Debugging ToolsДля большинства пользователей достаточно:
WinDbg PreviewDump (дамп памяти) — это сохранение состояния программы в момент сбоя.
Он содержит:
Основные виды:
Файл:
.dmpСодержит:
Содержит:
Используется для сложного анализа.
Есть несколько способов.
Windows иногда автоматически создаёт:
Crash dumpПапки:
C:\ProgramData\Microsoft\Windows\WERProcess Explorer:
ПКМ по игре
↓
Create Dump
↓
Create MinidumpПолучаем:
Game.dmpИнструмент Sysinternals:
procdump.exeПример:
procdump -ma Game.exeСоздаёт полный дамп.
Запустить:
WinDbg PreviewОткрыть:
File
↓
Open dump fileВыбрать:
Game.dmpПосле загрузки дампа:
ввести:
!analyze -vWinDbg покажет:
Пример:
EXCEPTION_CODE:
c0000005Это:
Access ViolationAccess Violation.
Означает:
программа попыталась:
Причины:
Часто:
архитектурная проблема.
Например:
x86
+
x64 DLLОшибка загрузки DLL.
Проверять:
WinDbg показывает:
MODULE_NAME:
d3d9Это помогает понять направление поиска.
Примеры:
Возможные причины:
Проверять:
Проверять:
Проверять:
Один из самых важных разделов.
Команда:
kили:
kbПоказывает:
какие функции выполнялись перед падением.
Пример:
Game.exe
↓
d3d9.dll
↓
nvwgf2umx.dllВывод:
возможна проблема видеодрайвера NVIDIA.
Команда:
lmПоказывает:
Пример:
ddraw
7A000000
GameFolder\ddraw.dllМожно увидеть:
какой именно wrapper используется.
Команда:
lmvm ddrawПоказывает:
Пример:
Company:
dgVoodooили:
Microsoft CorporationEvent Viewer:
Faulting module:
ddraw.dllWinDbg:
lmvm ddrawПоказывает:
GameFolder\ddraw.dllВывод:
используется установленный фикс.
Дальше:
WinDbg:
Stack:
Game.exe
↓
d3d11.dll
↓
nvwgf2umx.dllВывод:
вероятно:
Event Viewer:
0xc0000005WinDbg:
!analyze -vПоказывает:
Module:
mss32.dllВывод:
проверять:
Не использовать для:
отсутствующего d3dx9_43.dll;
отсутствующего MSVCP140.dll;
установки DirectX;
обычной проверки DLL.
Для этого:
Игра не запускается
↓
Dependencies
↓
ProcMon
↓
Event Viewer
↓
Process Explorer
↓
WinDbg| Команда | Назначение |
|---|---|
!analyze -v | общий анализ сбоя |
k | стек вызовов |
kb | стек с параметрами |
lm | список DLL |
lmvm имя | информация о DLL |
!process | информация о процессе |
!thread | информация о потоке |
WinDbg Preview имеет современный UI, но вся сила — в командах. Ключевые панели:
Горячие клавиши:
Ctrl+S — Symbol File Path.F9 — Toggle Breakpoint (на строке в Disassembly).F5 — Go.Shift+F11 — Step Out.F10 — Step Over.F11 — Step Into.Без символов вы видите только адреса. Настройка:
C:\Symbols.SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols
...;C:\Games\MyGame\Symbols
.reload (или .reload /f для принудительной перезагрузки)..symopt +0x40 (чтобы видеть статус загрузки), затем снова .reload.Проверка: введите lm m kernel32 — если рядом с модулем стоит (deferred) или (private), символы подгрузились. Если (no symbols) — проблема в пути или сети.
| Сценарий | Как сделать | Когда использовать |
|---|---|---|
| Игра не стартует вообще | File → Open Executable | Чтобы поймать самый первый краш или исключение загрузки DLL. |
| Игра стартует, но вылетает | File → Attach to a Process | Если краш происходит через N секунд после запуска. |
| Есть .dmp файл | File → Open Crash Dump | Самый быстрый способ диагностики. |
Важно: некоторые античиты (EAC, BattlEye) блокируют Attach. В таких случаях используйте только Open Executable или анализ дампов.
При краше WinDbg пишет: *** Fatal Error: Exception c0000005 ....
Ключевые команды:
.lastevent — последнее событие (исключение) и адрес..exr -1 — детали исключения (код, информация).k — стек вызовов.kp — стек с аргументами функций (часто раскрывает причину).Пример разбора:
*** Fatal Error: Exception c0000005 (Access Violation)
Выполняем:
.lastevent
k
kp
Ищем в стеке имя игры и смотрим, какая функция вызвала краш. Аргументы в kp часто указывают на нулевой указатель или неверный адрес.
lm
Ищите:
d3d11.dll, vcruntime140.dll).Unloaded или Bad Image.!lmi MyGame.exe
Показывает, какие функции игра пытается импортировать. Если функция помечена как unresolved — игра не сможет стартовать.
Если стек указывает на объект, проверьте его:
dt MyGame!GraphicsDevice 0x0000012345678900
dq 0x0000012345678900 L10
Если структура показывает мусор или много нулей — объект не инициализирован или уже уничтожен.
| Код | Название | Что означает | Как диагностировать |
|---|---|---|---|
c0000005 | Access Violation | Чтение/запись по неверному адресу (чаще всего разыменование NULL) | k, kp, r, dt, dq. |
c0000094 | Integer Division by Zero | Деление на ноль | k, смотреть аргументы. |
e06d7363 | MSVC C++ Exception | Исключение C++ (try/catch не сработал) | !peb, стек, иногда !heap. |
80070002 | File Not Found | Не найден файл (конфиг, ассет, DLL) | bp kernel32!CreateFileW, bp kernel32!LoadLibraryExW. |
Если игра создала дамп:
!analyze -v
Результат содержит:
FAULTING_CODE — код ошибки.IMAGE_NAME — проблемный модуль.STACK_TEXT — стек.Для повторяющихся крашей удобно сохранять workspace: File → Save Workspace, чтобы не настраивать символы каждый раз.
Чтобы понять, какой файл или DLL не удаётся загрузить:
bp kernel32!CreateFileW
bp kernel32!LoadLibraryExW
Когда игра попытается открыть файл или загрузить библиотеку, отладчик остановится. В регистре RCX будет имя файла/DLL.
Если краш в рендере:
dxgkrnl.sys, nvlddmkm.sys, atikmdag.sys.!dxg (если доступно) или смотрите HRESULT в аргументах..exr -1 покажет ExceptionInformation, где часто лежит код ошибки DirectX.Игры активно используют динамическую память. Команды:
!heap
!heap -s
!heap -stat
Позволяют найти утечки, повреждения кучи и аномальные аллокации.
WinDbg поддерживает скрипты и Python (PYKD).
Создайте startup.cmd:
.symfix
.reload
bp MyGame!GameEngine::Init
g
Запустите WinDbg с флагом -c "$$>a< C:\Scripts\startup.cmd".
Установите PYKD и используйте:
from pykd import *
print(loadModule("MyGame"))
Это полезно для повторяющихся проверок и автоматизации анализа дампов.
Проблема: SpaceWar.exe не стартует, сразу закрывается.
Шаги:
Exception c0000005..lastevent, k, kp → видим, что краш в Player::LoadInventory, который вызывает FileManager::OpenFile.bp SpaceWar!FileManager::OpenFile
g
kp) — функция пытается открыть C:\Users\User\Documents\SpaceWar\savegame.dat.| Команда | Описание |
|---|---|
.reload | Перезагрузить символы. |
lm | Список модулей. |
k / kp / kv | Стек вызовов (с аргументами, с переменными). |
dt <Type> <Address> | Показать структуру. |
db/dd/dq <Address> L<Count> | Просмотр памяти. |
bp <Function> | Точка останова. |
g | Продолжить выполнение. |
r | Регистры. |
u <Address> | Дизассемблировать. |
!analyze -v | Анализ дампа. |
!heap | Информация о куче. |
.exr -1 | Детали последнего исключения. |
Эти команды начинаются с точки (.) и управляют самим отладчиком.
| Команда | Описание | Пример использования |
|---|---|---|
.help или .hh | Вызов справки. .hh <команда> — справка по конкретной команде. | .hh .reload |
.sympath | Задать путь к символам (PDB). | .sympath SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols |
.reload | Перезагрузить символы. Флаг /f — принудительно, /u — выгрузить. | .reload /f |
.symopt | Управление опциями загрузки символов. +0x40 показывает статус загрузки. | .symopt +0x40 |
.load / .unload | Загрузить/выгрузить расширение (например, SOS для .NET, PYKD). | .load sos.dll |
.chain | Показать загруженные расширения. | — |
.logopen / .logclose | Начать/остановить запись лога сессии в файл. | .logopen C:\Logs\debug.log |
.cls | Очистить окно команд. | — |
.restart | Перезапустить отлаживаемое приложение (без закрытия WinDbg). | — |
Критично для пошаговой отладки.
| Команда | Описание | Горячие клавиши |
|---|---|---|
g | Go: продолжить выполнение до следующей точки останова или исключения. | F5 |
p | Step Over: выполнить одну инструкцию, не заходя внутрь функций. | F10 |
t | Step Into: выполнить инструкцию, заходя внутрь вызовов функций. | F11 |
pr | Step Out: выполнить до возврата из текущей функции. | Shift+F11 |
gu | Go Up: выполнить до выхода из текущей функции (быстрее, чем pr). | — |
wt | Trace and Watch: трассировать выполнение функции и вывести отчет. Полезно для анализа медленных функций. | — |
~*s | Переключить контекст на все потоки (для анализа многопоточных крашей). | — |
~<N>s | Переключить контекст на поток с ID N. | — |
WinDbg имеет мощную систему точек останова.
| Команда | Описание |
|---|---|
bp <addr/symbol> | Обычная точка останова (срабатывает один раз, затем удаляется). |
bu <addr/symbol> | Unresolved breakpoint: срабатывает, даже если модуль еще не загружен (идеально для LoadLibrary). |
bm <pattern> | Break on Match: установить точки по маске (например, bm MyGame!*Init*). |
bl | List: показать список всех установленных точек останова. |
bc <ID> | Clear: удалить точку останова по ID. |
bd <ID> / be <ID> | Disable/Enable: отключить/включить точку останова. |
ba <access> <size> <addr> | Access breakpoint: срабатывает при чтении/записи в память (например, при повреждении данных). ba r 4 <addr> — при чтении 4 байт. |
Основа диагностики крашей (Access Violation и т.д.).
| Команда | Описание | Нюансы |
|---|---|---|
k / kb / kc | Call Stack: показать стек вызовов. k — кратко, kb — с аргументами в регистрах, kc — сжато. | Для игр kP (параметры) часто важнее всего. |
kp | Stack with Parameters: показывает аргументы функций (C++). | Может показывать мусор, если оптимизация компилятора удалила фреймы. |
kv | Stack with Local Variables: попытка показать локальные переменные. | Работает не всегда. |
r | Registers: показать содержимое регистров (RAX, RBX, RIP и т.д.). | r @$ip — текущий адрес инструкции. |
dt <Type> <Address> | Display Type: показать структуру данных по адресу. | Требует символов. dt -r — рекурсивный вывод. |
db / dw / dd / dq | Dump Bytes/Words/Dwords/Qwords: просмотр сырых данных в памяти. | dq <addr> L10 — вывести 10 QWORD. |
u <addr> | Unassemble: дизассемблировать код по адресу. | Показывает ассемблерные инструкции. |
ln <addr> | List Nearest Symbols: найти ближайший символ по адресу (если не знаете имя функции). | Очень полезно при анализе дампов. |
Именно эти команды помогают понять, почему игра не стартует (нет DLL, неверная версия и т.п.).
| Команда | Описание | Применение |
|---|---|---|
lm | List Modules: список всех загруженных DLL/EXE. | Ищите отсутствующие или помеченные как Unloaded. |
lm m <name> | List Module by name: найти конкретный модуль. | lm m d3d11 — проверить наличие DirectX. |
!lmi <module> | List Import/Export: таблица импорта модуля. | Показывает, какие функции игра пытается вызвать. Статус unresolved = проблема. |
!peb | Process Environment Block: детальная информация о процессе. | Секция Ldr покажет статус загрузки всех DLL. |
!chkimg | Check Image: проверить целостность бинарного файла (повреждение). | Редко, но бывает полезно. |
Игры часто падают из-за повреждения кучи или двойного освобождения памяти.
| Команда | Описание |
|---|---|
!heap | Показать информацию обо всех кучах процесса. |
!heap -s | Статистика кучи (сколько свободно/занято). |
!heap -stat | Статистика по блокам (размер, количество). |
!heap -l <handle> | Легаси-команда для детального анализа конкретной кучи. |
!address | Показать карту виртуальной памяти процесса. |
!verify | Включить проверку кучи в реальном времени (может замедлить игру). |
Команды, начинающиеся с восклицательного знака (!), — это расширения (extensions). Они добавляют функционал.
| Команда | Описание |
|---|---|
!analyze -v | Автоматический анализ дампа/краша. Самая важная команда. |
.exr -1 | Показать детали последнего исключения. |
.lastevent | Показать последнее событие (исключение). |
!thread | Показать информацию о текущем потоке. |
!threads | Показать список всех потоков. |
| Команда | Описание |
|---|---|
.loadby sos clr | Автоматически загрузить расширение SOS, зная, где лежит CLR. |
!dumpheap -stat | Показать статистику объектов в куче .NET (утечки памяти). |
!gcroot <address> | Найти ссылки на объект (почему он не удаляется сборщиком мусора). |
!clrstack | Стек вызовов .NET (понятные имена методов, а не ассемблер). |
| Команда | Описание |
|---|---|
!process 0 0 | Показать все процессы в системе. |
!irp | Показать IRP-пакеты (запросы ввода-вывода). |
!object | Поиск объектов ядра по имени. |
!vm | Показать статистику виртуальной памяти системы. |
!pfn <page_number> | Информация о физической странице памяти. |
| Команда | Описание |
|---|---|
!dxg | Диагностика DirectX Graphics (требует расширения). |
!gpu | Информация о состоянии GPU. |
| Команда | Описание |
|---|---|
$<script.txt> | Выполнить скрипт (набор команд) из файла. |
as <alias> <string> | Создать алиас (псевдоним) для длинной команды. |
al | List Aliases: показать все созданные алиасы. |
? <expression> | Вычислить выражение (арифметика, адреса). |
ed / eb / ew / eq | Edit Memory: изменить значение в памяти (байт, слово, dword, qword). |
n | Name: задать имя для текущего контекста (удобно при работе с несколькими процессами). |
Если вы диагностируете сбой игры, вот готовые «наборы» команд под конкретную проблему:
Игра не запускается (сразу крашится):
Open Executable..lastevent, k, kp.lm, !lmi MyGame.exe.c0000005: проверить аргументы в kp, найти нулевой указатель.Игра вылетает через 5 минут (утечка памяти):
Attach to Process).!heap -s, !address.!dumpheap -stat.Черный экран / ошибка рендера:
dxgkrnl, nvlddmkm.kp..exr -1.Анализ готового дампа (.dmp):
File → Open Crash Dump.!analyze -v.k, dt, dq по адресам из отчета.BP = bp), но в именах символов (функций, типов) регистр важен.dq (esp + 4) L10.!process) ведут себя по-разному в User Mode и Kernel Mode. WinDbg обычно сам подсказывает, если команда неприменима.ba (аппаратные точки останова) или ed (правка памяти) могут быть заблокированы античитами (EAC, BattlEye). В таких случаях анализ возможен только через дампы или пассивное наблюдение.WinDbg — самый глубокий уровень диагностики игр.
Он помогает:
анализировать падения;
искать настоящий виновный модуль;
проверять DLL и драйверы;
разбирать сложные ошибки памяти.
Использовать его стоит тогда, когда обычные инструменты уже не дают ответа.
Главная схема:
Crash Dump
↓
WinDbg
↓
!analyze -v
↓
Faulting Module
↓
Stack Trace
↓
Причина ошибки