2011-06-10 8 views
28

No puedo mostrar el código fuente en windbg cuando canalizo ntsd -d en el destino a través de windbg -k, pero funciona cuando depuro localmente.¿Cómo se muestra el código fuente en windbg a través de ntsd -d?

Quiero depurar la primera ejecución de código de Winlogon.exe y LSASS.exe. Pero para que sea fácil de reproducir el problema, me hice a esta configuración:

  • utilizo el CrashMe sample application, la fuente y símbolos pre-construidos, con copia a C: \ crashme tanto en el objetivo y el anfitrión
  • Utilizo las herramientas de depuración de Windows para Windows (DTW) versión 6.12.0002.633 en todas partes.
  • El objetivo es ejecutar Windows XP SP3, el host Windows 7 ultimate.
  • Cada ruta y configuración es la misma en ambas máquinas: ruta a DTW y ruta a crashme.
  • Siempre uso una ruta de acceso totalmente calificada (como c: \ dtw \ ntsd.exe).
  • Tengo un XP en una máquina virtual, que iniciaron desde /noexecute=optin /fastdetect /debug /debugport=com1 /baudrate=115200

soy capaz de depurar a nivel local con este comando, lanzado desde C: \ crashme:

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

puedo lanzar el Windows XP máquina virtual y conectarse a ella con este comando:

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

Pero necesito depurar una máquina remota. En el objetivo, tengo estas opciones:

  1. de depuración a través de -server y -remote
  2. de los frenos en un proceso en ejecución
  3. Opciones de ejecución Uso de archivo de imagen (IFEO).

En cada una de estas opciones puedo ver los símbolos (x crashme!* funciona).

no puedo usar # 1 (-server) o # 2 (breakin.exe <pid>), porque quiero depurar el código de inicio de un proveedor de autenticación, así que necesito LSASS.exe inicio bajo ntsd -d. No puedo dejar que se ejecute y adjuntar más adelante.

Según tengo entendido, necesito usar IFEO. Usando gflags.exe en lugar de modificar el registro manualmente, defino las opciones ejecutables para

c:\dtw\ntsd -d -G -lines -x -y c:\symcache;c:\windows\system32 -n -srcpath C:\CrashMe\ 
  • puedo rompiendo la aplicación, pero yo pongo los puntos de interrupción no se ven afectados.
  • Puedo .open cualquier archivo, pero no puedo usar el archivo para establecer el punto de interrupción.
  • No puedo (examinar) ningún símbolo
  • No puedo ver el código fuente.

¿Cómo puedo ver mi código fuente DLL de un proceso que se ejecuta bajo ntsd -d través windbg -k?

+0

Todavía no he encontrado la respuesta, pero podría tener algo que ver con que ntsd no sea un depurador gráfico? – ixe013

+0

En una nota relacionada, en la misma configuración exacta, puedo depurar un controlador de kernel con código fuente completo en windbg. – ixe013

+0

Si puede depurar un controlador, ya tiene una conexión que también se puede usar para depurar el código del modo de usuario (es decir, su aplicación). – 0xC0000022L

Respuesta

1

TL; DR: Use -server <TRANSPORT> -difere y conéctese a través de una segunda sesión windbg que tenga .lsrcpath configurado para obtener lo que desea.

El resto: El modo de origen requiere acceso desde el sistema que ejecuta el depurador a los archivos de origen. En el caso de depurar el código de modo de usuario sobre la conexión de modo kernel, esto se vuelve complicado. Dado que la prueba se está ejecutando en el contexto de ntsd en la máquina de destino, y esa máquina está descompuesta en el depurador, generalmente no funciona cargar archivos de origen. Creo que si coloca un árbol de código fuente completo en la máquina de destino o apunta la ruta de origen a un recurso compartido, podría hacerlo, pero no lo he verificado.

Lo que se ha verificado es que you can use this method to get source files loaded in your host machine.

Esto funciona de la siguiente manera:

  1. Comience su anfitrión depurador de núcleo ntsd
  2. Inicio en el equipo de destino con (por ejemplo) `ntsd - tcp del servidor: puerto = 50000 -ddefer test.exe`
  3. Inicie una conexión con su servidor de depuración (por ejemplo, en WinDbg utilizo ctrl + r `tcp: puerto = 50000, servidor = tawnos-target`)
  4. La conexión se bloqueará al comenzar. Cambie a su depurador de kernel (que debe estar sentado en Input>) y ejecute `.sleep 5000` para permitir que se complete la conexión
  5. En este punto, su conexión remota debería completarse. Ahora puedes volver a cargar los símbolos según sea necesario y usar .lsrcpath para establecer un srcpath que windbg usará para ver el código fuente
+0

Estás usando los trabajos '-server' para los procesos normales de modo de usuario. Lo mencioné en mi (larga) publicación. ¿Pero cómo puedo usar la opción '-server' para depurar lsass o winlogon, que no puedo comenzar? – ixe013

+0

Si no me equivoco, esto funcionará (puedo probarlo este lunes). Combina '-server' con' -ddefer', en lugar de simplemente usar 'ntsd -d'.Esto le permitirá obtener los beneficios de irrumpir en el inicio del proceso inicial, así como la capacidad remota para ver su código fuente. Voy a verificar y le informaré si no escucho más el lunes. – Tawnos

Cuestiones relacionadas