Видео: отладка драйвера с помощью исходного кода WDF
В этом разделе содержится видеоруководство, в котором показано, как отладить драйвер Windows Driver Frameworks (WDF) с полным доступом к исходному коду WDF. Ниже приведена пошаговая процедура, описанная в видео для удобства использования.
Отладка источника WDF позволяет свободно переходить к коду платформы без необходимости скачивания исходного кода WDF. Отладчик автоматически скачивает правильную версию WDF из GitHub.
Например, если вы используете WinDbg для отладки драйвера WDF на Windows 10 компьютере, а отладчик не работает с кодом платформы в стеке вызовов, можно дважды щелкнуть фрейм WDF в представлении Стек вызовов, и WinDbg автоматически скачивает и открывает соответствующий исходный файл WDF в соответствующей строке. Затем можно выполнить пошаговое выполнение кода и задать точки останова.
Эта функция доступна для целевых систем под управлением общедоступных выпусков Windows 10 Technical Preview сборки 10041 или более поздней версии. Эти сборки имеют файлы символов с индексированием частного источника для KMDF (Wdf01000.sys) и UMDF (Wudfx02000.dll), доступные на сервере общедоступных символов Майкрософт. Отладка кода WDF на уровне исходного кода доступна только в WinDbg, а не в отладчике Visual Studio.
Быстрое начало
Запустите сеанс отладки ядра WinDbg на целевом компьютере, войдите в систему и выполните следующие действия.
Задайте путь к символам по умолчанию с помощью .symfix. При этом путь к символу будет указывать на сервер символов в https://msdl.microsoft.com/download/symbols.
kd> .symfix
Задайте исходный путь по умолчанию с помощью SRCFIX. При этом в качестве исходного пути задается значение srv*, которое указывает отладчику получать исходные файлы из расположений, указанных в файлах символов целевых модулей.
kd> .srcfix Source search path is: SRV*
Перезагрузите символы с помощью .reload и убедитесь, что символы Wdf01000.sys (или Wudfx02000.dll для UMDF) индексируются по источнику. Как показано в выходных данных !lmi ниже, Wdf01000.sys PDB индексируется в источнике. Если это не так, см. раздел Настройка WinDbg ниже.
kd> .reload ... kd> !lmi wdf01000.sys Loaded Module Info: [wdf01000.sys] ... Load Report: private symbols & lines, source indexed C:\...\Wdf01000.pdb\...\Wdf01000.pdb
Теперь все готово! Простой способ пошагового выполнения исходного кода WDF — установить точку останова в подпрограмме диспетчеризации IRP платформы, а затем выполнить оставшуюся часть кода. Так как в системе Windows есть много драйверов KMDF для папки "Входящие", WDF всегда загружается и работает, поэтому эта точка останова будет достигнута сразу (без необходимости загружать собственный драйвер).
kd> bp Wdf01000!FxDevice::DispatchWithLock kd> g Breakpoint 0 hit Wdf01000!FxDevice::DispatchWithLock: 87131670 8bff mov edi,edi
Если это не сработает, проверка приведенные ниже действия по настройке WinDbg.
Программа установки WinDbg
Если приведенный выше пример не работает должным образом, может потребоваться выполнить одну или несколько приведенных ниже инструкций.
Включение отладки в исходном режиме
Убедитесь, что отладка в режиме источника включена. Откройте меню Отладка и убедитесь, что установлен флажок Режим источника.
Очистка кэша устаревших символов
Если вы ранее отладили драйверы WDF для того же целевого объекта Windows, возможно, вы используете локально кэшированные символы WDF, которые не были индексированы источником. Это можно проверка с помощью команды !lmi:
kd> !lmi Wdf01000.sys
Loaded Module Info: [wdf01000.sys]
...
Load Report: private symbols & lines, not source indexed
C:\...\Wdf01000.pdb\...\Wdf01000.pdb
Согласно приведенному выше отчету о загрузке, Wdf01000.pdb не индексируется в источнике. Это означает, что локальный кэш символов WinDbg устарел. Чтобы устранить эту проблему, выгрузите PDB из WinDbg, очистите локальный кэш (путь может отличаться в зависимости от выходных данных !lmi выше) и перезагрузите PDB:
kd> .reload /u Wdf01000.sys
CMD> del
C:\...\Wdf01000.pdb\...\Wdf01000.pdb
kd> .reload Wdf01000.sys
Теперь запустите !lmi, чтобы проверка еще раз: PDB-файл должен отображаться как исходный индекс, и должно появиться окно исходного кода.
kd> !lmi Wdf01000.sys
Loaded Module Info: [wdf01000.sys]
...
Load Report: private symbols & lines, source indexed
C:\...\Wdf01000.pdb\...\Wdf01000.pdb
Отладку исходного уровня WDF можно использовать не только для динамической отладки и анализа аварийных дампов, но и для получения дополнительных знаний о внутренних компонентах платформы, задав точки останова в основных функциях, таких как диспетчер IRP, и изучая последующие пути кода.