web-dev-qa-db-fra.com

Numéro de ligne du défaut de segmentation

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:

  1. Déboguer ligne par ligne
  2. Mettez printfs dans le code pour affiner.

Modifications:

  1. bt/where sur gdb donne No stack.
  2. Suggestion utile
47
Rohit

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).

63
rck

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 :-)

21
Jonas Kölker

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.

10
Todd Gamblin

Exécutez-le sous valgrind.

7
anonnn

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).

4
cbrulak

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:

  • Élémentaire: vous n'exécutez peut-être pas sous le débogueur, vous essayez simplement d'analyser le vidage de mémoire post-mortem. (Si vous démarrez une session de débogage, mais n'exécutez pas le programme, ou s'il se termine, alors lorsque vous demandez une trace, gdb dira "Pas de pile" - car il n'y a aucun programme en cours d'exécution. N'oubliez pas pour taper "run".) S'il a subi une erreur de segmentation, n'oubliez pas d'ajouter le troisième argument (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 .
  • Difficile: si votre programme est/était vraiment en cours d'exécution mais que votre gdb dit "Pas de pile", votre pointeur de pile est peut-être mal écrasé. Dans ce cas, vous pouvez être un problème de débordement de tampon quelque part, suffisamment grave pour écraser complètement votre état d'exécution. GCC 4.1 prend en charge le "Stack Smashing Protector" de ProPolice qui est activé avec -fstack-protector-all. Il peut être ajouté à GCC 3.x avec un patch.
4
Liudvikas Bukys

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.

1
kiwixz

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).

1
SoapBox