2009-03-16 8 views
0

J'ai une application qui engendre plusieurs processus enfants. Avant de lancer un enfant, je crée des poignées stdOut et stdErr dans un fichier journal (par exemple, si je suis sur le point de lancer procA, je crée des poignées pour logA.log). J'ai placé ces poignées sur les processus de l'enfant.Comment pouvez-vous casser la création de poignée?

En regardant avec ProcExplorer, je peux voir que chaque processus enfant a des poignées à chaque fichier journal (si procA a des poignées à Loga, logb, etc.). Ceci crée des problèmes ultérieurs.

Je veux être en mesure de voir quand procA crée le handle to logB. Des idées?

Répondre

1

Une solution possible peut être que les descripteurs de fichiers sont partagés entre tous les processus enfants car ils sont créés par le processus parent. C'est la seule solution que je peux voir parce que je ne vois pas comment vous pouvez avoir un handle multpile (un pour chaque fichier journal) dans chaque processus enfant si vous concevez de sorte que vous ayez seulement un var pour le gérer. Pourquoi ne pas créer vos poignées dans les processus enfants? Je sais qu'il répond aux prix de la question mais évidemment si procA n'a besoin que des handles pour logA, il vaudra mieux créer le handle pour logA dans le processus fils procA.

+0

Merci, vous m'avez mis sur la bonne voie. Les processus enfants partagent les handles du parent. Je ne peux pas aller de l'avant avec votre solution, mais j'essaie de trouver un moyen de lister toutes les poignées ouvertes. –

+0

Résolu, le processus fils hérite des handles du parent, en tant qu'effet secondaire de la redirection de sortie. –

1

Demandez-vous comment percer dans un débogueur lorsque le processus enfant procA crée le handle pour logB? Je suppose que vous utilisez Windows depuis que vous avez mentionné Process Explorer. L'une des façons d'y parvenir est d'utiliser la clé de registre Image File Execution Options pour spécifier que chaque fois que procA.exe est démarré, vous voulez lancer le débogueur. Lorsque le débogueur démarre, vous pouvez définir un point d'arrêt dans le code qui crée le handle à logB, puis laisser le processus continuer. Cela fonctionne avec n'importe quel débogueur (tel que WinDbg ou ntsd, ou les outils de profilage tels que AQTime), pas seulement Visual Studio.

Une autre façon de procéder consiste à dire au débogueur de se connecter à tous les processus enfants. Il y a plusieurs façons de enable this behavior with WinDbg or ntsd. De cette façon, vous attachez le débogueur au processus parent et il se rattachera automatiquement au processus enfant procA, et vous pouvez définir un point d'arrêt dans le code approprié. Une autre solution consiste à modifier temporairement votre code pour générer une exception de point d'arrêt à l'aide de la fonction DebugBreak() lors de la création du handle to logB, puis à joindre un débogueur à l'aide du débogage juste-à-temps. Notez que si votre code gère les exceptions structurées sans expression de filtre d'exception (ce qui est une mauvaise idée), cela ne fonctionnera pas et peut avoir des résultats surprenants (blocage, fuite de mémoire, etc.).

+0

Belles techniques de débogage! –