2009-09-07 8 views
3

Je suis en train de déboguer une erreur de segmentation, et j'ai cette sortie de gdb:Aide interprétation gdb: segfault en fonction

(gdb) n 

Program received signal SIGSEGV, Segmentation fault. 
0x08048af9 in parse_option_list (ptr=0x6f72505f <Address 0x6f72505f out of bounds>, box_name=0x696d6978 <Address 0x696d6978 out of bounds>, option_list=0x313a7974, 
    num_elements=0x33313532) at submit.c:125 
125       memcpy(&(option_list[(*num_elements)].value), value, 24); 
(gdb) p num_elements 
$15 = (int *) 0x33313532 
(gdb) p *num_elements 
Cannot access memory at address 0x33313532 
(gdb) 

Il me semble que quelque chose dans memcpy() va détraquer. Mais je ne peux pas comprendre exactement quel est le problème, puisque cette ligne fait référence à tant de variables.

Quelqu'un peut-il aider à comprendre ce que la ligne 0x8048af9 in parse_option_list... me dit?

Ma signature de la fonction est:

int parse_option_list(char *ptr, char *box_name, 
    struct option_list_values *option_list, int *num_elements) 

Et cela pourrait être utile:

struct option_list_values { 
    char value[24]; 
    char name[24]; 
}; 

En outre, les variables value et name ne sont pas segfaulting (mais si vous pensez qu'ils sont, je peux poster le code qui définit ces valeurs.) Mais maintenant, si je peux comprendre cette sortie gdb, je serai heureux comme une palourde! Je vous remercie!

+0

Je suppose que 0x8048af9 est juste l'adresse de l'instruction de défaut (que gdb a pu trouver existant dans la fonction parse_option_list). Ce binaire a-t-il été construit avec des optimisations? Il pourrait être plus facile de déboguer une version non optimisée. – reuben

+0

Les optimisations sont désactivées. (par défaut, je viens d'ajouter -O0 pour être sûr, le même problème.) – poundifdef

Répondre

14

Vous avez tous les signes d'un dépassement de tampon classique. Les valeurs de tous les paramètres de la pile ont été remplacés par du texte ASCII - est ici la traduction de ces valeurs (en supposant que vous avez une architecture petit-boutiste, qui ressemble à droite):

ptr = 0x6f72505f = "_Pro" 
box_name = 0x696d6978 = "ximi" 
option_list = 0x313a7974 = "ty:1" 
num_elements = 0x33313532 = "2513" 

les concaténer donne ensemble "_Proximity:12513" - si cette sous-chaîne vous semble familière, vous devriez être capable de localiser les données copiées - quelque part vous les copiez dans un tableau stocké sur la pile, sans vérifier les limites.

+0

ah. Je n'avais pas pensé à l'endianness (idiot). et cette sous-chaîne est en effet familière - quelle bonne technique pour utiliser gdb. Je vous remercie! – poundifdef

1

0x8048af9 est le pointeur d'instruction - l'adresse du code exécutable dans la mémoire que votre code était lors de l'apparition de SEGFAULT.

Etes-vous sûr que la valeur de option_list [(* num_elements)]. Valeur est une adresse valide? Vous pourriez avoir un débordement de tampon, et écraser quelque chose que vous ne devriez pas être.

Si num_elements est la longueur de option_list, alors option_list [(* num_elements)] fait référence à juste après la fin de la liste.

+0

L '"adresse" 0x33313532 a l'air assez suspicieusement comme il est plein de caractères ascii (par exemple "3152"). Je seconde la suggestion de a1kmm de débordement de tampon. –

+0

pas tout à fait sûr que ce soit. (Je veux dire, c'est probablement un débordement de buffer mais) cette séquence de caractères ASCII n'existe nulle part dans mon flux de données. et son différent à chaque fois (avec plus de caractères qui ne sont pas présents dans cette séquence) – poundifdef

+0

ah. tu avais raison! J'étais juste confus par l'endianité quand je regardais la valeur hexadécimale. – poundifdef

0

ptr = 0x6f72505f - Adresse 0x6f72505f en dehors des limites Ceci est la partie utile dans ce cas La première entrée de parse_option_list n'est pas valide. Peut-être un pointeur non initialisé.

+0

Peut-être - bien que je puisse printf() ce type très bien. Il semble être terminé par zéro (puisque printf ne segfault pas) et contient des données valides/attendues. – poundifdef

Questions connexes