Comment puis-je obtenir que GDB me dise quelle adresse a causé un segfault?

J’aimerais savoir si mon programme utilise des pointeurs NULL ou une mémoire obsolète.

La trace ressemble à ceci:

 Programmer le signal reçu SIGSEGV, Erreur de segmentation.
 [Passage au fil 0x2b0fa4c8 (LWP 1333)]
 0x299a6ad4 dans pthread_mutex_lock () à partir de /lib/libpthread.so.0
 (gdb) bt
 # 0 0x299a6ad4 dans pthread_mutex_lock () à partir de /lib/libpthread.so.0
 # 1 0x0058e900 dans ??  ()

À partir de GDB 7, vous pouvez examiner la structure $_siginfo qui est renseignée lorsque le signal se produit et déterminer l’adresse défaillante:

 (gdb) p $_siginfo._sifields._sigfault.si_addr 

S’il affiche (void *) 0x0 (ou un petit nombre), vous avez alors un déréférencement de pointeur NULL.

Exécutez votre programme sous GDB. Lorsque la erreur de segmentation se produit, GDB vous informera de la ligne et de l’instruction de votre programme, ainsi que de la variable et de l’adresse associée.

Vous pouvez utiliser la commande “print” (p) de GDB pour inspecter les variables. Si l’incident s’est produit lors d’un appel à la bibliothèque, vous pouvez utiliser la série de commandes “frame” pour afficher le cadre de stack en question.