Pile d'appel au moment de l'Exécution
Je veux accéder à la pile d'appel lors de l'exécution dans un Natif C++ de l'application. Je ne suis pas à l'aide de l'IDE. Comment puis-je afficher la pile d'appel?
Mise à jour: j'ai une fonction qui est appelée à partir de nombreux points de tous les plus de l'application. Il se bloque à de rares occasions. Je cherchais un moyen d'obtenir le nom de l'appelant et de l'enregistrer.
OriginalL'auteur Agnel Kurian | 2008-09-24
Vous devez vous connecter pour publier un commentaire.
Je crois que cette page a la réponse que vous cherchez. Vous avez dit Visual C donc je suppose que vous voulez dire windows.
OriginalL'auteur Mark
Ont un coup d'oeil à StackWalk64.
Si vous avez l'habitude de faire cela .NET, alors vous êtes dedans pour une surprise désagréable.
OriginalL'auteur Will Dean
Vous devriez envisager de mettre votre exception non gérée du filtre et l'écriture d'un fichier minidump de l'intérieur. Il n'est pas du tout compliqué, et bien documenté.
Simplement s'en tenir à un minimum de choses à faire une fois dans votre filtre d'exceptions non gérées (lire ce que peut tout va mal si vous êtes créatifs).
Mais pour être sur le côté sécuritaire (vos exception non gérée filtre peut obtenir, par inadvertance, écrasé), vous pourriez mettre votre code à l'intérieur d' __try/__à l'exception du bloc et écrire le minidump de l'intérieur de la fonction de filtre (remarque, vous ne pouvez pas avoir des objets qui nécessitent automatique de vous détendre dans une fonction __try/__à l'exception du bloc, si vous en avez, pensez à les mettre dans une fonction séparée):
Vous pouvez ensuite inspecter le fichier de vidage avec un débogueur de votre choix. Visual Studio et débogueurs à partir d'Outils de Débogage de Windows package peut gérer les minidumps.
OriginalL'auteur deemok
Si vous voulez obtenir un pile des appels de l'accident, ce que vous voulez vraiment, c'est post mortem de débogage. Si vous voulez vérifier si une pile d'exécution de l'application en cours d'exécution, c'est l'une des nombreuses fonctions SysInternals Process Explorer peuvent offrir.
OriginalL'auteur Suma
Si vous n'êtes pas activement de débogage, vous pouvez "crash" de l'application pour générer un minidump (ce qui peut être fait de manière non invasive et permet à l'application de continuer à exécuter). IIRC DrWatson vous permettra de faire cela, si ce n'est userdump à partir de MS de soutien sera.
Vous pouvez ensuite charger le dump dans windbg et de voir la pile d'appels + variables etc il. Vous aurez besoin de votre application symboles de faire sens de la trace.
Si vous êtes à la recherche pour un simple moment de l'exécution code de style de traces, je vous recommande une classe simple qui vous instanciez sur chaque méthode, le constructeur écrit le nom de la méthode à l'aide de OutputDebugString. Utilisation WinDebug pour afficher la trace que le programme s'exécute. (mettre une certaine forme de contrôle dans votre classe, même si c'est juste une variable globale ou la valeur de registre, ou un Atome global de sorte que vous pouvez activer le traçage ou de désactiver à volonté).
OriginalL'auteur gbjbaanb
Qu'entendez-vous par il se bloque? Violation D'Accès? Diviser par zéro? qu'est-ce exactement? Est-il interagir avec les composants de mode noyau?
Tour sur appverifier. cela devrait éliminer un grand nombre de choses.
créer ce:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\FileName.exe
sous cette clé, créez une nouvelle chaîne
nom : débogueur
valeur: c:\pathtowindbg\windbg.exe -gG -xe av
Si vous êtes en cours d'exécution 32 bits de code avec WOW, vous avez besoin pour ce faire en vertu de la wow3264node.
OriginalL'auteur