2017-09-12 5 views
0

Je suis en train de faire ce travail de code: https://github.com/eliben/code-for-blog/blob/master/2011/dwarf_get_func_addr.c Il est extrait d'un tutoriel réalisé par Eli Bendersky sur http://eli.thegreenplace.net/2011/02/07/how-debuggers-work-part-3-debugging-information Malheureusement, faible pc et retour pc haut toujours le même adresse pour presque toutes les fonctions:Affichage PC haut et bas de toutes les fonctions du programme en utilisant la bibliothèque NAIN

DW_TAG_subprogram: 'aFunctionName' 

low pc : 0x00000001 
high pc : 0x7f3a00000001 

Alors que si objdump --dwarf = decodedline ./lulesh_normal >> dump_dwarf.txt me donne:

File name       Line number Starting address 
lulesh.cc         1297   0x402e00 

lulesh.cc         1297   0x402e11 
lulesh.cc         1299   0x402ee4 
lulesh.cc         1300   0x402ef0 
lulesh.cc         1301   0x402ef6 
lulesh.cc         1299   0x402f00 
[...] 

Donc, il parvient à relier la ligne et l'adresse, mais pas pour trouver la véritable adresse des fonctions. Une idée pourquoi?

Merci pour votre aide,

Répondre

1

Le code dwarf_get_func_addr.c a au moins un bug: il suppose que chaque fonction a DW_AT_low_pc et DW_AT_high_pc attributs, et imprimer des valeurs non initialisées si ce n'est pas le cas.

Vous devez initialiser lowpc = highpc = -1; sur la ligne 42, afin de ne pas imprimer les valeurs non initialisées.

À part cela, il est impossible de vous aider sans avoir accès à votre binaire lulesh_normal.

Vous devriez faire readelf -wi lulesh_normal, puis parcourir list_func_in_die dans un débogueur, et de comparer ce que le programme lit là avec la sortie de readelf - ils devraient correspondre à un à un. Si ce n'est pas le cas, votre version de libdwarf est peut-être buggée.