Question Comment utiliser GDB pour trouver quelle fonction correspond à une adresse mémoire


J'utilise le vérificateur de tas de Google pour retrouver une fuite de mémoire. Cela me donne une trace de pile telle que:

Leak of 21 bytes in 1 objects allocated from:                                                                                                                                                               
    @ 0xf6088241                                                                                                                                                                                               
    @ 0xf60890d2                                                                                                                                                                                               
    @ 0xf6089246                                                                                                                                                                                               
    @ 0x8054781                                                                                                                                                                                                
    @ 0x8054862                                                                                                                                                                                                
    @ 0xf684ee76                                                                                                                                                                                               
    @ 0xf684f343                                                                                                                                                                                               
    @ 0x804be4c                                                                                                                                                                                                
    @ 0x80544f6                                                                                                                                                                                                
    @ 0xf5e52bb6                                                                                                                                                                                               
    @ 0x804b101  

Comment déterminer quelles fonctions / lignes de code correspondent à ces adresses mémoire?


19
2017-10-03 18:51


origine


Réponses:


Utilisation info symbol Commande gdb. 16 Examen de la table des symboles.

info symbol addr
Print the name of a symbol which is stored at the address addr. If no symbol is stored exactly at addr, gdb prints the nearest symbol and an offset from it:
          (gdb) info symbol 0x54320
          _initialize_vx + 396 in section .text

This is the opposite of the info address command. You can use it to find out the name of a variable or a function given its address.

For dynamically linked executables, the name of executable or shared library containing the symbol is also printed:

          (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

35
2017-10-03 19:00



En supposant que votre fichier binaire a des informations de débogage g++ -g vous pourrez peut-être utiliser x/ pour obtenir l'info, je sais que cela fonctionne pour les vtables.

x/<num>xw imprimer <num> mots hexadécimaux de mémoire, et gdb annotera le côté gauche avec des informations sur ce qui est à l'adresse.


2
2017-10-03 19:34



La question initiale demandait comment faire cela dans GDB:

# NOT what you want; note the lack of '*':
(gdb) info symbol 0xfde09edc
blah() + 388 in section .text of /tmp/libblah.so

# IS what you want; note the presence of '*':
(gdb) info line *0xfde09edc
Line 91 of "blah.cc"
   starts at address 0xfde09ebc <blah()+356>
   and ends at 0xfde09ee4 <blah()+396>

le * est nécessaire pour info line et ne devrait pas être utilisé pour info symbol.

Vous pouvez également utiliser le disassemble commande avec ses /m drapeau:

(gdb) disassemble /m 0xfde09edc

... bien que ce soit plutôt verbeux et info line donne exactement ce qui a été demandé.


1
2018-06-29 18:15