2011-04-01 12 views
9

¿Cómo puedo detener el programa antes de cargar cualquiera de los archivos DLL vinculados?Cómo establecer el punto de interrupción al principio de la ejecución del programa

He tratado de establecer LoadLibraryExW función en la opción de depuración Break At Function y se detiene en esa función, pero antes de que he lo siguiente en ventanas de salida de Visual Studio:

 
'test.exe': Loaded 'C:\Windows\System32\ntdll.dll', Symbols loaded (source information stripped). 
'test.exe': Loaded 'C:\Windows\System32\kernel32.dll', Symbols loaded (source information stripped). 
'test.exe': Loaded 'C:\Windows\System32\KernelBase.dll', Symbols loaded (source information stripped). 
'test.exe': Loaded 'C:\Windows\System32\uxtheme.dll', Symbols loaded (source information stripped). 
'test.exe': Loaded 'C:\Windows\System32\msvcrt.dll', Symbols loaded (source information stripped). 
---- plus about 30 DLLs --- 

Entonces, ¿cómo puedo detener la programa en el depurador antes de cargar el ntdll.dll? Ok, no antes de cargar, pero antes de ejecutar cualquiera de las funciones DllMain y antes de inicializar cualquiera de los objetos estáticos.

Respuesta

7

Puede hacer esto agregando una clave de registro a "Opciones de ejecución de archivo de imagen" con el nombre de su ejecutable. Agregue un valor de tipo cadena llamada "Depurador" y configúrelo en vsjitdebugger.exe para iniciar el diálogo de depuración justo a tiempo. Que luego le permite elegir uno de los depuradores disponibles, incluido Visual Studio. Este diálogo se desencadena justo después de que Windows haya cargado el EXE, antes de que el código comience a ejecutarse.

Aquí hay un archivo .reg de muestra que desencadena el diálogo cuando inicia notepad.exe. Modificar el nombre clave para su .exe:

REGEDIT4 

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe] 
"Debugger"="vsjitdebugger.exe" 
+0

He intentado esto y Process Explorer me muestra que el proceso ya ha asignado alrededor de 30 objetos GDI en este momento. Pero en este momento esto es lo mejor que puedo obtener. –

+0

Puede usar la herramienta GFlags del Kit del depurador de Windows para editar fácilmente el registro automáticamente. Se puede encontrar en las herramientas de depuración para Windows en http://msdn.microsoft.com/en-us/windows/hardware/gg463009.aspx que también incluye muchas otras herramientas de depuración útiles, incluido WinDbg, de forma gratuita desde microsoft. – StarPilot

1

En lugar de comenzar con F5, simplemente comience a depurar con F11 o F10.

+2

En este caso, se detiene en la función 'main', después de cargar todas las DLL y después de la inicialización de todos los objetos estáticos. –

+0

Eso fue ... inesperadamente simple, gracias: D – porges

0

ntdll.dll es cargado por el kernel, durante la creación del proceso. No sé sobre los otros dlls específicamente, pero lo más probable es que también estén cargados por el kernel.

Que yo sepa, lo que intentas hacer no se puede hacer, a menos que escribas un rootkit para sobrescribir parte del código de creación del proceso. Incluso entonces, no estoy seguro de si el proceso que se está creando realmente se considera un proceso antes de que se carguen estas bibliotecas.

0

No creo que pueda hacer esto con el depurador de modo de usuario normal en Visual Studio. Microsoft proporciona un kit de herramientas gratuito de otras herramientas de depuración, como kd (kernel depurador) y windbg, que pueden interrumpir la carga, pero dudo que alguna vez pueda inspeccionar el proceso antes de cargar ntdll. En realidad no es un proceso en ese punto.

¿Qué estás tratando de lograr?

0

No hay forma de hacerlo porque las DLL de las que depende su ejecutable PE son cargadas por el sistema (no por su proceso) antes de que el proceso sea creado. El proceso comienza solo cuando su ejecutable está vinculado con todas las funciones importadas de otras DLL.

ADD: Pero, por supuesto, las rutinas DllMain se ejecutan para cada DLL solo cuando se inicia el proceso y puede depurarlas.

1

Usando Gflags y WinDbg, puede conectar automáticamente a la aplicación de destino, y establecer un punto de descanso antes de cualquier DLL se cargan.

Para hacer esto, necesitará las "Herramientas de depuración para Windows" instaladas. Puedes obtenerlo gratis de Microsoft. Incluye GFlags y WinDbg. Puede encontrarlo en: http://msdn.microsoft.com/en-us/windows/hardware/gg463009.aspx

Use GFlags para establecer las opciones automáticas de depuración en su programa de destino. Esta es la forma más fácil de configurar su sistema para iniciar un depurador que se iniciará automáticamente cuando se inicie la aplicación de destino.No hay necesidad de perder el tiempo con el registro, hará todos los cambios necesarios para usted.

Use GFlags para establecer que WinDbg se inicie como el depurador. Cambie los filtros de eventos para WinDbg en el evento "Crear proceso" de "Ignorar" a "Activado". Por defecto, WinDbg no se rompe en la creación del proceso de su objetivo. Pero si necesita o desea establecer un punto de corte en el proceso de creación, puede cambiar esta opción de evento. La forma más fácil de cambiar esta opción es dejar que WinDbg se inicie en su aplicación, usar su GUI para cambiar la opción a través de la opción de menú "DEBUG | Event Filters ..." y su diálogo, guardar su espacio de trabajo y detener el debuguging. Luego comience lo que conduzca a su aplicación de destino comenzando, y desde ese momento en adelante para ese objetivo de depuración en particular, WinDbg se dividirá en "Crear proceso".

Hay otras maneras de configurar esta opción automáticamente en WindDbg, pero no son tan fáciles como usar su GUI. Puede establecer las opciones de línea de comando para su invocación para habilitar el evento Crear proceso. Puede hacer que WinDbg ejecute un archivo de script que establecerá la opción por usted. Puede establecer la variable de entorno TOOLS de WinDbg para apuntarlo a su archivo "Tools.ini" y habilitar allí el evento de proceso de creación. Y hay un par de métodos más para configurar la opción de evento para habilitar un punto de interrupción en Crear proceso.

El enlace anterior incluye enlaces para la ayuda de depuración con GFlags y WinDbg.

Para la mayoría de las necesidades de depuración, los desarrolladores no necesitan ni desean un punto de interrupción en la creación del proceso (antes de que se carguen todos los dlls normales y básicos necesarios para ejecutar). Pero si lo hace, WinDbg y otros depuradores gratuitos proporcionados por Microsoft pueden hacerlo. Solo necesita cambiar el valor predeterminado para ese evento de ignorado a habilitado.

Cuestiones relacionadas