2010-08-26 11 views
13

He creado una aplicación de Windows/C++/WTL que genera un proceso secundario. Los dos procesos se comunican a través de tuberías anónimas.depurando un proceso creado con CreateProcess en Visual Studio

Me gustaría poder depurar el proceso secundario.

Dado que los proyectos padre e hijo están en la misma solución en Visual Studio 2008, ¿hay alguna forma de decirle a VS2008 que me gustaría que el depurador depure ambos procesos?

Cuando inicio el depurador con el proceso principal, el depurador no romperá ningún punto de interrupción en el código de proceso secundario.

Y dado que el proceso principal genera el proceso secundario, no puedo pensar en una forma fácil de adjuntar el proceso secundario (tal vez a través de otra instancia de VS2008) cuando se genera.

¡Cualquier idea muy apreciada!

+0

Buena pregunta, me encontré con este problema al intentar depurar un módulo de Apache en VS2008. – SirDarius

Respuesta

3

Puede poner un mutex con nombre global alrededor de su CreateProcess llamada, y luego tratar de agarrar el mutex en el proceso secundario. Si luego coloca un punto de interrupción en la llamada CreateProcess, debe tener tiempo para conectar al niño antes de que haga algo sustancial.

Tenga en cuenta que se perderá todo lo que sucede antes de main en el proceso secundario.

de edición: A modo de ejemplo, algo como esto, no probado:

// parent.cpp 
HANDLE hMutex = ::CreateMutex(NULL, TRUE, "Global\\some_guid"); 
::CreateProcess(...); 
::ReleaseMutex(hMutex); // breakpoint here 
::CloseHandle(hMutex); 

// child.cpp 
int main(...) 
{ 
    HANDLE hMutex = ::OpenMutex(MUTEX_ALL_ACCESS, FALSE, "Global\\some_guid"); 
    ::WaitForSingleObject(hMutex, INFINITE); 
    ::CloseHandle(hMutex); 

    ... 
} 

Probablemente querría envolverlo con #if _DEBUG o cheques de entorno variable.

+0

excelente idea, es sorprendente que VS2008/VS2010 no tenga una instalación para este tipo de cosas, hubiera imaginado que este tipo de cosas era un requisito común. –

4

Puede llamar temporalmente al DebugBreak() en algún lugar del código de inicio de su proceso hijo. Esto hará que Windows le pregunte si desea depurar ese proceso.

+0

Intenté esto, Windows (7, x64). Cuando se golpeó la llamada a DebugBreak() en el proceso secundario, el sistema operativo me dijo que el proceso hijo había dejado de funcionar a través de un cuadro de mensaje emergente. Elegí depurar la aplicación, y solo puedo iniciar la sesión de depuración en una nueva instancia de VS2008.Cuando hago esto, no puedo pasar por el código, ya que "no hay código fuente disponible para la ubicación actual". ¡Buen intento! –

12

Un montón de opciones:

  • Puede depurar múltiples .EXEs con una instancia del depurador mediante el uso de depuración + Adjuntar. Sin embargo, siempre uso dos instancias de Visual Studio, use Debug + Attach en el segundo.

  • Puede poner __debugbreak() en el código del niño, la ventana del depurador JIT le pedirá que seleccione un depurador.

  • Puede usar la clave de registro "Opciones de ejecución de archivo de imagen" para iniciar automáticamente un depurador tan pronto como se inicie el .exe hijo. Añadir una clave denominada HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Image File Execution Options \ YourApp.exe, establecer su valor "depurador" a "vsjitdebugger.exe"

  • Hay una VS add-in que hace que sea más fácil, sin embargo, aún no lo he probado.
+0

Me interesaría probar Debug + Attach para depurar múltiples .exes en una instancia del depurador, pero no pude determinar cómo hacerlo con un proceso hijo generado por el padre con CreateProcess. Según mi comentario anterior, DebugBreak() no funcionó, ya que el código fuente no estaba disponible en la nueva instancia del depurador. ¿Tendría más éxito si rompiera al niño en un archivo de solución independiente? –

+0

Depurar + Ver + Módulos, haga clic con el botón derecho en .exe, la información de carga de símbolos le indica dónde buscó el archivo .pdb necesario. –

+0

lo siento, no entiendo depurar + ver + módulos –

Cuestiones relacionadas