Как мне показать исходный код в windbg через ntsd -d? - PullRequest
28 голосов
/ 10 июня 2011

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

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

  • Я использую пример приложения CrashMe , с предварительно созданным исходным кодом и символами, скопированными в C: \ CrashMe как на цели, так и на хосте
  • Я использую средства отладки Windows для Windows (DTW) версии 6.12.0002.633 везде.
  • Цель - Windows XP SP3, хост Windows 7. Ultimate.
  • Каждый путь и настройки одинаковы на обеих машинах: путь к DTW и путь к сбою.
  • Я всегда использую полный путь (например, 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  

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

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

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

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

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

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

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

1 Ответ

1 голос
/ 23 июня 2012

TL; DR: используйте -server -ddefer и подключитесь через второй сеанс windbg, для которого установлено значение .lsrcpath.

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

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

Это работает следующим образом:

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