Поделиться через


Видео: отладка драйвера с помощью исходного кода WDF

В этом разделе содержится видеоролик, в котором показано, как отлаживать драйвер Windows Driver Framework (WDF) с полным доступом к исходному коду WDF. После этого видео выполняется пошаговая процедура, описанная в видео, для удобной справки.

Отладка источника WDF позволяет свободно переходить в код платформы без необходимости скачивать исходный код WDF. Отладчик автоматически загружает правильную версию WDF из GitHub.

Например, если вы используете WinDbg для отладки драйвера WDF на компьютере с Windows 10, и отладчик остановился на коде платформы в стеке вызовов, вы можете дважды щелкнуть на фрейме WDF в представлении стека вызовов, и WinDbg автоматически скачает и откроет соответствующий исходный файл WDF на нужной строке. Затем можно выполнить шаги по коду и задать точки останова.

Эта функция доступна для целевых систем под управлением общедоступных выпусков Windows 10, Technical Preview сборки 10041 или более поздней версии. Эти сборки имеют файлы символов с индексированием частного источника для KMDF (Wdf01000.sys) и UMDF (Wudfx02000.dll) доступны на сервере символов Microsoft Public Symbol Server. Отладка на уровне источника кода WDF доступна только в WinDbg, а не в отладчике Visual Studio.

Краткое руководство

Запустите сеанс отладки ядра WinDbg на целевом компьютере, прервите его выполнение и выполните следующие действия:

  1. Задайте путь символа по умолчанию с помощью Symfix. При этом путь к символам указывает на сервер символов https://msdl.microsoft.com/download/symbols.

    kd> .symfix

  2. Задайте исходный путь по умолчанию с помощью SRCFIX. Это задает исходный путь к srv*, который сообщает отладчику получать исходные файлы из расположений, указанных в файлах символов целевых модулей.

    kd> .srcfix
    Source search path is: SRV*
    
  3. Перезагрузите символы с помощью .reload и убедитесь, что символы Wdf01000.sys (или Wudfx02000.dll для UMDF) индексируются по исходным файлам. Как показано в выходных данных !lmi ниже, PDB Wdf01000.sys индексирован исходным кодом. Если у вас нет, см. раздел настройки WinDbg ниже.

    kd> .reload
    ...
    
    kd> !lmi wdf01000.sys
    Loaded Module Info: [wdf01000.sys] 
    ...
    Load Report: private symbols & lines, source indexed 
    C:\...\Wdf01000.pdb\...\Wdf01000.pdb
    
  4. Теперь вы готовы! Простой способ выполнить переход к исходному коду 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 и изучение последующих путей кода.