2010-12-01 4 views
1

J'ai débogué dans GDB (code C). Le problème est que si j'exécute mon application et si elle plante, le contrôle revient à main() (l'application redémarre). Par conséquent, n'aura aucune idée de l'endroit où il s'est écrasé. Je passe donc beaucoup de temps à parcourir chaque fonction.Aide pour la journalisation de plantage de débogage gdb

Je voudrais savoir s'il y a de toute façon un journal qui peut générer la dernière ligne d'exécution avant le crash. Ceci est juste mon hypothèse, s'il y a une autre façon plus simple de le faire s'il vous plaît faites le moi savoir, cela me ferait gagner beaucoup de temps!

De même si le gdb génère un journal où serait le chemin?

Merci d'avance.

+2

Pouvez-vous définir "crash"? S'il y a un signal non géré (par exemple SIGSEGV) GDB devrait l'intercepter et s'arrêter immédiatement, mais il semble que ce n'est pas ce qui se passe, donc vous devez "crasher" d'une manière différente –

+1

GDB peut gérer les commandes prédéfinies si vous le pouvez. Ou, si par log vous voulez dire une trace de pile, regardez http://tlug.up.ac.za/wiki/index.php/Obtaining_a_stack_trace_in_C_upon_SIGSEGV. Il montre comment générer une trace de pile sur SIGSEGV. Si vous connaissez le signal qui provoque votre crash, générez la trace de la pile lors de la réception de ce signal au lieu de SIGSEGV. – vpit3833

+0

Le contrôle retournant à main() et le redémarrage de l'application ne sont pas vraiment la même chose - redémarre-t-il réellement à la ligne 1 de main(), ou revient-il à la ligne après un appel de fonction? – Cascabel

Répondre

3

Cette question est un peu clair pour moi, mais je vais essayer de répondre:

Si vous avez GDB attaché au processus de plantage quand il tombe en panne, un accident doit arrêter le programme et vous remettre à l'invite (gdb). Si vous tapez alors bt, vous devriez voir la pile.

Si vous n'avez pas de GDB attaché, alors this answer to a related question pourrait vous aider. (En bref, vous voulez peut-être que le système crée un vidage de base lorsque le programme se bloque.Un vidage de base est juste un fichier qui contient beaucoup d'informations sur le processus planté.Vous pouvez utiliser GDB avec le vidage du noyau pour voir la pile.

Si vous ne savez pas, affichez ce que vous voyez à l'écran lorsque cela se produit, et nous devinerons.

Dans tous les cas, le programme ne devrait certainement pas recommencer à main(). Il semble intéressant de savoir pourquoi cela se produit et précisément ce qui se passe. Est-ce que le contrôle passe vraiment à maindans le même processus, par opposition à un autre processus démarré automatiquement?

0

Exécutez votre programme en mode gdb.

$ gdb ./myProgram 


Définissez le point d'arrêt sur l'emplacement prévu.

$ break functionName 


Vous pouvez également définir le point d'arrêt sur un numéro de ligne particulier.

$ break 15 


Lancer l'exécution

$ r 


étape dans ou sortir l'exécution par 's' ou 'n'

$ s 


une fois que le plantage du programme, faire 'bt' pour la traçabilité.

$ bt 


vous pouvez monter et descendre dans votre trace par 'up' & 'down' commande

$ up 


peut également prendre autre façon. Programme de débogage avec "core" en tant que fichier de vidage de base.

$ gdb executableFilename core 
$ bt 
Questions connexes