2010-12-03 40 views
2

Je suis dans une situation unique où mon processus est en cours sans quitter aucune exception, juste en sortant silencieusement.Comment faire pour obtenir la pile d'appel d'un processus de mort, c'est-à-dire pour savoir comment le processus se termine

Je veux savoir quelle est la pile d'appels lorsque le processus se termine, par exemple, qui appelle exit (0) sur mon processus.

Ceci est une application C++ native, c'est-à-dire des millions de lignes, je ne pouvais pas savoir où les choses allaient mal.

Y a-t-il une telle facilité, par exemple si je cours sous Windbg?

+0

Etes-vous sûr que sys.exit() l'appelle et ne se fait pas tuer par oom ou autre chose? – Falmarri

Répondre

2

Vous pouvez configurer Process Dumper pour vider une image complète du processus à la sortie, pour le débogage post-mortem. De la vue d'ensemble:

Dump automatiquement lorsque le processus étant contrôlé quitté

+0

Il a besoin d'un déclencheur, c'est la grosse affaire. –

+0

@Hans - Je ne comprends pas ce commentaire. Pourquoi le vidage complet du processus à la sortie ne serait-il pas utile pour déterminer la raison de sa sortie? –

+0

La documentation semble suggérer que Process Dumper peut se déclencher à la sortie du processus, de sorte que des déclencheurs supplémentaires peuvent ne pas être nécessaires. – Praetorian

2

WinDbg est configuré par défaut pour rompre lorsqu'un processus se termine, tout ce que vous devez faire est de joindre à votre processus et attendez. Et bien sûr, tapez 'k' pour avoir votre callstack une fois que votre processus est cassé.

0

Le Microsoft Debugging Toolkit de Microsoft est livré avec un tel utilitaire, appelé ADPlus. ADPlus est un outil de ligne de commande (il s'agissait d'un script vb glorifié apparemment) qui fait un tas de choses. Mais vous et moi nous intéressons à obtenir le callstack d'un processus qui est mort. AdPlus peut être configuré pour capturer l'appel d'un processus externe lorsqu'il rencontre une exception non gérée.

La syntaxe est comme ceci:

ADPlus -p <process id> -crash -o <output path> 

-p est l'argument où vous passez l'ID du processus. Vous pouvez obtenir ceci de l'explorateur de processus à TList (je pense). Il existe d'autres arguments qui vous permettent de spécifier le nom du processus, mais vous devrez le rechercher vous-même.

-crash est de lui dire de générer un minidump lorsqu'il se bloque, ou rencontre une exception non gérée.

-o est le chemin d'accès à un répertoire dans lequel vous souhaitez enregistrer le minidump Ce qu'ADPlus va faire, c'est alors créer un sous-répertoire qui incorpore le nom du processus et un horodatage.

Ensuite, vous pouvez exécuter votre application, et quand elle se bloque, ADPlus va créer le minidump, puis votre processus se terminera.

La boîte à outils de débogage Microsoft fait désormais partie de l'installation de Windows SDK. Vous allez ici pour le trouver:

http://www.microsoft.com/whdc/devtools/debugging/default.mspx

Cliquez sur le lien de téléchargement pour télécharger une petite application qui va installer à partir du Web la chose. L'installateur vous donnera beaucoup d'options pour différents composants à installer. Vous pouvez ignorer la plupart d'entre eux et installer uniquement la boîte à outils de débogage.