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.