Подтвердить что ты не робот

Как показать исходный код в windbg через ntsd -d?

Я не могу показать исходный код в windbg, когда я нажимаю ntsd -d на цель через windbg -k, но он работает, когда я отлаживаю локально.

Я хочу отладить самое первое выполнение кода Winlogon.exe и LSASS.exe. Но чтобы облегчить воспроизведение проблемы, я составил эту настройку:

  • Я использую приложение примера CrashMe с исходными и условными символами, скопированными в C:\CrashMe как на целевом, так и на хост-сервере
  • Я использую средства отладки Windows для Windows (DTW) версии 6.12.0002.633 везде.
  • Цель работает под управлением Windows XP SP3, конечной версии Windows 7.
  • Каждый путь и настройки одинаковы на обоих машинах: путь к DTW и путь к crashme.
  • Я всегда использую полный путь (например, c:\dtw\ntsd.exe).
  • Я запускаю XP в виртуальной машине, загружаемой с помощью /noexecute=optin /fastdetect /debug /debugport=com1 /baudrate=115200

Я могу отлаживать локально с помощью этой команды, запущенной из C:\CrashMe:

windbg -g -G -srcpath C:\CrashMe -y C:\CrashMe debug\CrashMe.exe

Я могу запустить виртуальную машину Windows XP и подключиться к ней с помощью этой команды:

windbg -n -k com:pipe,port=\\.\pipe\com_1,reconnect -srcpath SRV*;C:\CrashMe -y   
c:\windows\system32;c:\windows\symbols;C:\CrashMe\debug  

Но мне нужно отлаживать удаленный компьютер. На цель у меня есть следующие варианты:

  • Отладка через -server и -remote
  • Нарушение работы
  • Используйте опции выполнения файла изображения (IFEO).

В каждой из этих опций я вижу символы (x crashme!* работает).

Я не могу использовать # 1 (-server) или # 2 (breakin.exe <pid>), потому что я хочу отлаживать код запуска поставщика проверки подлинности, поэтому мне нужно LSASS.exe начать с ntsd -d. Я не могу позволить ему запускать и присоединяться позже.

Я понимаю, что мне нужно использовать IFEO. Используя gflags.exe вместо изменения реестра вручную, я устанавливаю исполняемые параметры

c:\dtw\ntsd -d -G -lines -x -y c:\symcache;c:\windows\system32 -n -srcpath C:\CrashMe\ 
  • Я могу разбить приложение, но точки останова никогда не попадают.
  • Я могу .open любой файл, но я не могу использовать файл для установки точки останова.
  • Я могу x (проверить) любой символ
  • Я не вижу исходного кода.

Как я могу увидеть свой исходный код DLL для процесса, работающего под ntsd -d через windbg -k?

4b9b3361

Ответ 1

TL; DR: Использовать -server <TRANSPORT> -ddefer и соединитесь через вторую сессию windbg, у которой есть .lsrcpath, чтобы получить то, что вы хотите.

Остальное: Для режима источника требуется доступ из системы, запускающей отладчик, в исходные файлы. В случае отладки кода режима пользователя через соединение с режимом ядра это становится сложным. Поскольку тест выполняется в контексте ntsd на целевой машине, и эта машина разбита на отладчик, загрузка исходных файлов обычно не работает. Я считаю, что если вы поместите полное исходное дерево на целевую машину или указали исходный путь на общий ресурс, это может быть, но я не подтвердил это.

Я проверил, что вы можете использовать этот метод для загрузки исходных файлов на ваш хост-компьютер.

Это работает, выполняя следующие действия:

  • Запустите отладчик ядра хоста
  • Запустите ntsd на целевой машине с помощью (например) `ntsd -server tcp: port = 50000 -ddefer test.exe`
  • Запустите соединение с сервером отладки (например, в WinDbg я использую ctrl + r `tcp: port = 50000, server = tawnos-target`)
  • Соединение запустится. Переключитесь на свой отладчик ядра (который должен сидеть на входе > ) и запустите `.sleep 5000`, чтобы разрешить соединение
  • На этом этапе ваше удаленное соединение должно завершиться. Теперь вы можете перезагрузить символы по мере необходимости и использовать .lsrcpath для установки srcpath, который будет использовать windbg для просмотра исходного кода.