Question

Si mes C ++ application se bloque sous Windows Je veux envoyer des informations de débogage utiles à notre serveur.

Sur Linux, je voudrais utiliser la fonction GNU backtrace() - est-il un équivalent pour Windows

Y at-il un moyen d'extraire des informations de débogage utile après un programme est tombé en panne? Ou seulement à l'intérieur du processus?

(conseils le long des lignes de « test que vous l'application afin qu'il ne tombe pas en panne » n'est pas utile - tous les programmes non triviales auront des bugs)

Était-ce utile?

La solution

La fonction StackWalk64 peut être utilisé pour prendre une trace de pile sous Windows.

Si vous avez l'intention d'utiliser cette fonction, vous devez être sûr de compiler votre code avec FPO désactivé -. Sans symboles, StackWalk64 ne sera pas capable de marcher correctement cadres FPO'd

Vous pouvez obtenir un code en cours d'exécution en cours au moment de l'accident par un haut niveau en appelant bloc __try/__except SetUnhandledExceptionFilter. C'est un peu fiable car il vous oblige à avoir l'exécution de code à l'intérieur d'un processus écrasé. Sinon, vous pouvez simplement intégré dans le rapport d'erreurs Windows pour recueillir des données accident. Ceci est plus fiable, car il ne nécessite pas d'ajouter l'exécution de code à l'intérieur du compromis, processus écrasements. Le seul coût est d'obtenir un certificat de signature de code, puisque vous devez soumettre un fichier binaire signé au service. https://sysdev.microsoft.com/en-US/Hardware/signup/ a plus de détails.

Autres conseils

Vous pouvez utiliser l'appel API Windows MiniDumpWriteDump si vous le souhaitez pour rouler votre propre code. Windows XP et Vist automatiser ce processus et vous pouvez vous inscrire à https://winqual.microsoft.com avoir accès aux rapports d'erreur.

Consultez également http://kb.mozillazine.org/Breakpad et http://www.codeproject.com/KB/debug/crash_report.aspx pour d'autres solutions .

Ce site offre un bon aperçu détaillé de la récupération de la pile sur Win32 après une exception C ++:

http://www.eptacom.net/pubblicazioni/pub_eng/except.html

Bien sûr, cela ne fonctionnera à l'intérieur du processus, donc si le processus se termine ou tombe en panne au point où il se termine avant que le code est exécuté, il ne fonctionnera pas.

Générer un fichier Minidump. Vous pouvez ensuite le charger dans Visual Studio ou windbg et inspecter l'ensemble de la pile où la collision est survenue.

est un bon endroit pour commencer la lecture.

Son assez simple pour vider les adresses StackFrame actuelles dans un fichier journal. Tout ce que vous devez faire est d'obtenir une telle fonction appelée sur les failles du programme (à savoir un gestionnaire d'interruption sous Windows) ou affirme. Cela peut être fait à des versions publiées ainsi. Le fichier journal peut alors être associé à un fichier de carte résultant en une pile d'appel avec des noms de fonction.

Je publiais un article à ce sujet il y a quelques années.

Voir http://www.ddj.com/architect/185300443

Permettez-moi de décrire la façon dont je gère les accidents dans mon C ++ / application WTL.

D'abord, dans la fonction principale, je l'appelle _set_se_translator , et passer dans une fonction qui jetteront une exception C ++ au lieu d'utiliser des fenêtres structurées exceptions. Cette fonction obtient un code d'erreur, pour lequel vous pouvez obtenir un message d'erreur Windows via FormatMessage , et un argument PEXCEPTION_POINTERS, que vous pouvez utiliser pour écrire un minidump ( Code ). Vous pouvez également vérifier le code d'exception pour certaines erreurs « meltdown » que vous devriez juste en liberté sous caution de, comme EXCEPTION_NONCONTINUABLE_EXCEPTION ou EXCEPTION_STACK_OVERFLOW :) (Si elle est récupérable, j'invite l'utilisateur à me envoyer ce fichier minidump.)

Le fichier minidump lui-même peut être ouvert dans Visual Studio comme un projet normal et à condition que vous avez créé un fichier pdb pour votre exécutable, vous pouvez exécuter le projet et il va sauter à l'emplacement exact de l'accident, en même temps que la pile d'appel et des registres, qui peut être examiné sous le débogueur.

Si vous voulez saisir un callstack (ainsi que d'autres bonnes infos) pour un accident d'exécution, sur une version release même sur place, alors vous devez configurer Dr Watson (run Drwtsn32.exe). Si vous cochez l'option "générer des décharges de crash-, lorsqu'un application se bloque, il va écrire un mini fichier de vidage sur le chemin d'accès spécifié (appelé user.dmp).

Vous pouvez prendre cela, combiner avec les symboles que vous avez créés lorsque vous avez construit votre serveur (défini dans votre compilateur / éditeur de liens pour générer des fichiers pdb - garder ces sécurité à la maison, vous les utilisez pour correspondre à la décharge afin qu'ils puissent travailler à la source où l'accident a eu lieu)

windbg , ouvrez-le et utilisez l'option de menu pour « charge vidage sur incident. Une fois qu'il est chargé tout ce que vous pouvez taper « ~ # kp » pour obtenir un callstack pour chaque thread (ou cliquez sur le bouton en haut pour le thread courant).

Il y a de bons articles pour savoir comment faire tout cela sur le Web, Celui est mon préféré, et vous voulez lire obtenir une compréhension de la façon de gérer les symboles helpyourself très facilement.

Vous devrez mettre en place un cadre de génération de décharge dans votre application, ici comment vous pouvez le faire.

Vous pouvez alors télécharger le fichier de vidage sur le serveur pour une analyse ultérieure en utilisant des analyseurs de décharges comme windbg.

Vous pouvez utiliser ADPlus pour capturer le callstack crash.

Vous pouvez télécharger et installer des outils de débogage pour Windows.

L'utilisation de adplus est mentionné ici: utilisation Adplus

Cela crée le crash complet ou accrocher décharge. Une fois que vous avez la décharge, Windbg vient à la rescousse. Carte les PDB et les symboles et vous êtes tous ensemble pour analyser la décharge. Pour commencer, utilisez la commande « ! Analyser -v »

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top