2010-08-26 5 views
13

J'ai créé une application Windows/C++/WTL qui génère un processus enfant. Les deux processus communiquent via des tuyaux anonymes. Je voudrais être capable de déboguer le processus enfant.Débogage d'un processus généré avec CreateProcess dans Visual Studio

Étant donné que les projets parent et enfant sont dans la même solution dans Visual Studio 2008, est-il possible de dire à VS2008 que le débogueur doit déboguer les deux processus?

Lorsque je démarre le débogueur avec le processus parent, le débogueur ne casse aucun point d'arrêt dans le code de processus enfant. Et puisque le processus fils est engendré par le processus parent, je ne peux pas penser à un moyen facile d'attacher le processus enfant (peut-être via une autre instance de VS2008) quand il est engendré.

Toute idée grandement appréciée!

+0

Bonne question, je suis tombé sur ce problème en essayant de déboguer un module apache dans VS2008. – SirDarius

Répondre

3

Vous pouvez mettre un mutex global nommé autour de votre appel CreateProcess, puis essayez de récupérer le mutex dans le processus fils. Si vous mettez ensuite un point d'arrêt sur l'appel CreateProcess, vous devriez avoir le temps d'attacher à l'enfant avant qu'il ne fasse quelque chose de substantiel.

Notez que vous allez manquer tout ce qui se passe avant main dans le processus fils.

modifier: À titre d'exemple, quelque chose comme ça, non testé:

// 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); 

    ... 
} 

Vous ne voudrez probablement l'envelopper avec #if _DEBUG ou de l'environnement des contrôles variables.

+0

excellente idée, il est surprenant que VS2008/VS2010 n'a pas de facilité pour ce genre de chose - j'aurais imaginé ce genre de chose étant une exigence commune. –

4

Vous pouvez placer temporairement un appel à DebugBreak() quelque part dans le code de démarrage de votre processus fils. Cela entraînera Windows à vous inviter si vous souhaitez déboguer ce processus.

+0

J'ai essayé ceci, windows (7, x64). Lorsque l'appel DebugBreak() a été frappé dans le processus enfant, le système d'exploitation m'a dit que le processus enfant avait cessé de fonctionner via une boîte de message contextuelle. J'ai choisi de déboguer l'application, et je ne peux démarrer la session de débogage que dans une nouvelle instance de VS2008.Lorsque je fais cela, je ne peux pas parcourir le code, car "aucun code source n'est disponible pour l'emplacement actuel". Bien essayé! –

12

Beaucoup d'options:

  • Vous pouvez déboguer plusieurs .EXE avec une instance du débogueur en utilisant Debug + Joindre. J'utilise cependant toujours deux instances de Visual Studio, utilisez Debug + Attach dans le second.

  • Vous pourriez mettre un __debugbreak() dans le code de l'enfant, la fenêtre du débogueur JIT vous demandera de sélectionner un débogueur.

  • Vous pouvez utiliser la clé de Registre "Options d'exécution du fichier image" pour lancer automatiquement un débogueur dès que le fichier .exe enfant est démarré. Ajouter une clé nommée HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ image Exécution du fichier Options \ YourApp.exe, définissez sa valeur "Debugger" à "vsjitdebugger.exe"

  • Il y a un VS add-in qui le rend encore plus facile, Je ne l'ai pas encore essayé.
+0

Je voudrais essayer Debug + Attach afin de déboguer plusieurs .exes dans une instance du débogueur, mais je n'ai pas pu déterminer comment le faire avec un processus enfant engendré par le parent avec CreateProcess. Selon mon commentaire précédent, DebugBreak() ne fonctionnait pas, car le code source n'était pas disponible dans la nouvelle instance du débogueur. Aurais-je plus de succès si je casse l'enfant dans un fichier de solution séparée? –

+0

Debug + View + Modules, cliquez-droit sur le fichier .exe, Symbol Load Information vous indique où il a cherché le fichier .pdb nécessaire. –

+0

désolé, je ne comprends pas les modules debug + view + –

Questions connexes