Question

Je débogage d'un processus à plusieurs threads en GDB. Je compilé le fichier unique source avec le drapeau de -g. Cependant, lors de l'exécution dans GDB, le scénario suivant se produit:

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xb7fe2b70 (LWP 2604)]
0x00000011 in ?? ()

Avant le commutateur, le fil particulier exécute un sleep(5);

Pourquoi ne peut GDB identifier le point à partir duquel le code "crashait"?

Était-ce utile?

La solution

0x00000011 est pas une adresse valide, surtout pas pour le code. Cela nous dit qu'il n'y a pas de code (donc pas de fonction) à 0x00000011. Et cela nous dit, que votre pile est corrompu. Sans une pile « travail », gdb est incapable de comprendre comment votre fil a fini par où est a, parce qu'il ne se connecte pas d'appels par défaut et doit donc compter uniquement sur la pile.

EDIT Notez que sur x86 vous allez vous retrouver avec le même comportement que vous avez décrit par code comme

_start:
   mov eax,0x11
   jmp eax

Cela conduit à un saut / branche à une région (0x11) où il n'y a pas de code et par conséquent pas des symboles de débogage ni. Cela peut se produire dans un cas comme dans mon exemple, mais aussi si la pile est surchargée (corrompu) et que les fils de saut retour à une adresse invalide (comme 0x11)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top