Déterminer la ligne de code qui provoque une erreur de segmentation?

Comment pouvons-nous déterminer où est l’erreur dans notre code qui provoque une erreur de segmentation ?

Après avoir écrit du code, pour déterminer où j’ai une erreur de segmentation, mon compilateur ( gcc ) peut-il me montrer l’emplacement de la panne dans mon programme?

GCC ne peut pas faire cela, mais GDB peut le faire. Comstackz votre programme en utilisant le commutateur -g , comme ceci:

 gcc program.c -g 

Ensuite, utilisez gdb:

 $ gdb ./a.out (gdb) run  (gdb) backtrace  

Voici un bon tutoriel pour vous aider à démarrer avec GDB.

Vous pouvez également essayer Valgrind: si vous installez Valgrind et exécutez valgrind –leak-check = full, il exécutera votre programme et affichera les traces de la stack pour tous les erreurs de segmentation, ainsi que toute lecture ou écriture de mémoire non valide. . C’est vraiment très utile.

Vous pouvez également utiliser un core dump puis l’examiner avec gdb. Pour obtenir des informations utiles, vous devez également comstackr avec l’ -g .

Chaque fois que vous recevez le message:

  Segmentation fault (core dumped) 

un fichier core est écrit dans votre répertoire actuel. Et vous pouvez l’examiner avec la commande

  gdb your_program core_file 

Le fichier contient l’état de la mémoire lorsque le programme est tombé en panne. Un core dump peut être utile lors du déploiement de votre logiciel.

Assurez-vous que votre système ne définit pas la taille du fichier de vidage de base à zéro. Vous pouvez le définir à illimité avec:

ulimit -c unlimited

Attention cependant! que les vidages de mémoire peuvent devenir énormes.

La réponse de Lucas au sujet des décharges est bonne. Dans mon .cshrc j’ai:

 alias core 'ls -lt core; echo where | gdb -core=core -silent; echo "\n"' 

pour afficher la trace en entrant ‘core’. Et le timbre à date, pour assurer que je regarde le bon fichier :(.

Ajout : S’il y a un bogue de corruption de la stack , le backtrace appliqué au core dump est souvent inutile. Dans ce cas, l’exécution du programme dans gdb peut donner de meilleurs résultats, conformément à la réponse acceptée (en supposant que l’erreur soit facilement reproductible). Et méfiez-vous aussi de plusieurs processus de dumping de base simultanément; certains systèmes d’exploitation ajoutent le PID au nom du fichier principal.