2012-12-27 6 views
8

Diciamo che ho un programma come questoCome convertire un indirizzo di funzione per un simbolo

// print-addresses.cpp 
#include <stdio.h> 

void foo() { } 

void bar() { } 

void moo() { } 

int main(int argc, const char** argv) { 
    printf("%p\n", foo); 
    printf("%p\n", bar); 
    printf("%p\n", moo); 
    return 0; 
} 

esso stampa alcuni numeri come

013510F0 
013510A0 
01351109 

Come faccio a convertire quei numeri nuovamente dentro i simboli corretti ? Effettivamente mi piacerebbe essere in grado di fare questo

print-addresses > address.txt 
addresses-to-symbols < address.txt 

E averlo stampare

foo 
bar 
moo 

So che questo ha qualcosa a che fare con la Debug Interface Access SDK ma non è del tutto chiaro per me come vado da un indirizzo per un simbolo.

risposta

8

Questo sembra esattamente quello che stai cercando: Retrieving Symbol Information by Address. Questo utilizza DbgHelp.dll e si basa sulla chiamata SymFromAddr. Devi farlo (credo) dall'applicazione in esecuzione o leggendo in un file minidump.

È anche possibile utilizzare la DIA, ma la sequenza di chiamata è un po 'più complicata. Chiama IDiaDataSource::loadDataForExe e IDiaDataSource::openSession per ottenere un IDiaSession, quindi IDiaSession::getSymbolsByAddr per ottenere IDiaEnumSymbolsByAddr. Quindi, IDiaEnumSymbolsByAddr::symbolByAddr ti consentirà di cercare un simbolo per indirizzo. C'è anche un modo (mostrato nell'esempio all'ultimo link) per enumerare tutti i simboli.

EDIT: applicazione di esempio Questa DIA potrebbe essere un buon punto di partenza per l'utilizzo DIA: http://msdn.microsoft.com/en-us/library/hd8h6f46%28v=vs.71%29.aspx. Controllare in particolare le parti usando IDiaEnumSymbolsByAddr.

È anche possibile analizzare l'uscita di dumpbin, probabilmente con l'opzione/SYMBOLS o/DISASM.

+0

per quanto posso dire nessuna di queste soluzioni realmente rispondere alla domanda. Capita di sapere che i dati nel dumpbin non sono sufficienti. La tua prima risposta richiede di essere eseguita nel programma originale. La risposta centrale potrebbe funzionare ma non è chiaro. – gman

+0

@gman: Mi dispiace, potresti farmi sapere cosa non è chiaro sulla risposta centrale? La prima risposta * funziona * al di fuori del programma, è sufficiente generare un file minidump e caricarlo. –

1

se siete in Linux, si potrebbe provare addr2line

addr2line addr -e execuablebin -f