2017-09-12 8 views
0

mit Mir versuche, diesen Code funktioniert: https://github.com/eliben/code-for-blog/blob/master/2011/dwarf_get_func_addr.c es von einem Tutorial von Eli Bendersky auf http://eli.thegreenplace.net/2011/02/07/how-debuggers-work-part-3-debugging-information Leider niedrigen PC und hohe pc Rückkehr aus extrahiert wird, immer die gleiche Adresse für fast jede Funktion:Zeigte hohen und niedrigen PC von jeder Programmfunktion ZWERG Bibliothek

DW_TAG_subprogram: 'aFunctionName' 

low pc : 0x00000001 
high pc : 0x7f3a00000001 

Während, wenn objdump --dwarf = decodedline ./lulesh_normal >> dump_dwarf.txt gibt mir:

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 
[...] 

So schafft es, Linie und Adresse zu verknüpfen, aber nicht die reale Adresse der Funktionen zu finden. Irgendeine Idee warum?

Vielen Dank für Ihre Hilfe,

Antwort

1

Der Code in dwarf_get_func_addr.c hat mindestens einen Fehler: Es wird davon ausgegangen, dass jede Funktion DW_AT_low_pc und DW_AT_high_pc Attribute hat, und wird nicht initialisierte Werte drucken, wenn das nicht der Fall ist.

Sie sollten in Zeile 42 lowpc = highpc = -1; initialisieren, um nicht unitialisierte Werte zu drucken.

Abgesehen davon ist es unmöglich, Ihnen ohne Zugriff auf Ihre lulesh_normal Binärdatei zu helfen.

Sie sollten readelf -wi lulesh_normal tun, und dann durch list_func_in_die in einem Debugger gehen und vergleichen, was das Programm dort mit der Ausgabe von readelf liest - sie sollten eins zu eins übereinstimmen. Wenn nicht, ist Ihre Version von libdwarf möglicherweise fehlerhaft.

Verwandte Themen