Y a-t-il une option gcc que je peux définir qui me donnera le numéro de ligne du défaut de segmentation?
Je sais que je peux:
Modifications:
bt
/where
sur gdb donne No stack.Je ne connais pas d'option gcc, mais vous devriez être en mesure d'exécuter l'application avec gdb, puis lorsqu'elle se bloque, tapez where
pour jeter un œil à la pile à sa sortie, ce qui devrait vous rapprocher .
$ gdb blah
(gdb) run
(gdb) where
Modifier pour l'exhaustivité:
Vous devez également vous assurer de créer l'application avec des indicateurs de débogage en utilisant le -g
option gcc pour inclure des numéros de ligne dans l'exécutable.
Une autre option consiste à utiliser la commande bt
(backtrace).
Voici une session Shell/gdb complète
$ gcc -ggdb myproj.c $ gdb a.out gdb> run --some-option = foo --other-option = bar ( gdb dira que votre programme a rencontré une erreur de segmentation) gdb> bt (gdb imprime une trace de pile) gdb> q [êtes-vous sûr, votre programme est cours toujours]? y $ emacs myproj.c # heh, je sais quelle est l'erreur maintenant ...
Bon piratage :-)
Vous pouvez demander à gcc de vous imprimer une trace de pile lorsque votre programme reçoit un signal SEGV, similaire à la façon dont Java et d'autres langages plus conviviaux gèrent les exceptions de pointeur nul. Voir ma réponse ici pour plus de détails:
La bonne chose à ce sujet est que vous pouvez simplement le laisser dans votre code; vous n'avez pas besoin d'exécuter les choses via gdb pour obtenir la sortie de débogage de Nice.
Si vous compilez avec -g et suivez les instructions qui s'y trouvent, vous pouvez utiliser un outil de ligne de commande comme addr2line pour obtenir des informations de fichier/ligne à partir de la sortie.
Exécutez-le sous valgrind.
vous devez également construire avec des drapeaux de débogage sur -g
Vous pouvez également ouvrir le vidage de mémoire avec gdb (vous avez besoin de -g cependant).
Si toutes les suggestions précédentes à compiler avec le débogage (-g) et à exécuter sous un débogueur (gdb, run, bt) ne fonctionnent pas pour vous, alors:
core
) lorsque vous exécutez gdb, sinon vous démarrez dans le même état, pas attaché à un processus particulier ou à une image mémoire .-fstack-protector-all
. Il peut être ajouté à GCC 3.x avec un patch.Le No stack
le problème semble se produire lorsque le programme se termine avec succès.
Pour mémoire, j'ai eu ce problème car j'avais oublié un retour dans mon code, ce qui a fait quitter mon programme avec un code d'échec.
Il n'y a pas de méthode pour GCC pour fournir ces informations, vous devrez vous fier à un programme externe comme GDB.
GDB peut vous donner la ligne où un crash s'est produit avec la commande "bt" (abréviation de "backtrace") après que le programme a été défectueux. Cela vous donnera non seulement la ligne du crash, mais toute la pile du programme (afin que vous puissiez voir ce qui a appelé la fonction où le crash s'est produit).