web-dev-qa-db-fra.com

Comment obtenir le nom du symbole pour une adresse mémoire dans GDB?

Par exemple, je sais que 0x46767f0 appartient à une chaîne NSString *. Existe-t-il un moyen de connaître la nature de la chaîne NSString pour m'aider à trouver les bogues que je recherche?

34
Coocoo4Cocoa

Je crois que tu cherches:

info symbol <addresss>

Imprimer le nom d'un symbole qui est stocké à l'adresse addr. Si aucun symbole n'est stocké exactement à l'adresse addr, GDB imprime le symbole le plus proche et un décalage.

Exemple:

(gdb) info symbol 0x400225
_start + 5 in section .text of /tmp/a.out

(gdb) info symbol 0x2aaaac2811cf
__read_nocancel + 6 in section .text of /usr/lib64/libc.so.6

Vous pouvez en lire plus à ce sujet ici .

49
Brian Gianforcaro

gdb> liste * 0xAABBCCDD

Cela vous indique le nom de fichier et le numéro de ligne.

12
Jay Ram

Si c'est une variable de pile, il n'y a aucun moyen que je sache le faire. Sinon, essayez p/a <pointer symbol or address> et le nom du symbole sera imprimé (ou décalé vers le nom du symbole le plus proche).

3
Simon Broadhead

po 0x46767f0 

enverra un message -description à l'objet. Cela imprimera le contenu de votre NSString mais je suggère d'utiliser la réponse de Brian pour vérifier le contenu de votre adresse avant d'envoyer des messages aléatoires à des adresses aléatoires.

3
Rog

addr2line

Cet utilitaire Binutils peut gérer n’importe quelle adresse de symbole, y compris les variables et les noms de fonction.

Par défaut, il n’est pas interactif, ce qui est utile dans certains cas pour les post-mortem.

principal c:

#include <stdio.h>

int myvar;

int main(void) {
    printf("myvar = %d\n", myvar);
}

Compiler et désassembler:

gcc -O 0 -g gdb3 -o main -pedantic-errors -std=c89 -Wextra main.c
readelf -s tmp.out  | grep -E ' (main|myvar)'

Donne:

55: 0000000000201014     4 OBJECT  GLOBAL DEFAULT   24 myvar
65: 000000000000064a    32 FUNC    GLOBAL DEFAULT   14 main

Et maintenant nous pouvons essayer:

addr2line -e main 201014 64a

qui donne:

/full/path/to/main.c:3
/full/path/to/main.c:5