2015-08-28 21 views
5

Ho un file eseguibile e un gcore.relazione tra memoria virtuale e core dump

Ho creato il file di dump di base con gcore.

Ora, vorrei mappare l'indirizzo virtuale del file eseguibile al core dump.

So che il core dump è un dump di memoria di un file eseguibile e se desidero analizzare l'indirizzo virtuale dal core dump. Posso supporre che l'indirizzo virtuale 0x0000 corrisponda all'offset 0x0000 del core dump?

risposta

3

So che il core dump è un dump di memoria di un file eseguibile,

No. Un core dump in gdb (gcore indica che si sta utilizzando questo) è di solito in formato ELF, così c'è un ampio intestazione che definisce quali mappe a cosa.

Non sono abbastanza sicuro di quanto GDB/Linux faccia del mangling dello spazio degli indirizzi quando si scaricano i core, ma non si può supporre che l'offset del file x si associ all'offset della memoria x - perché lo spazio degli indirizzi virtuali può estendersi su uno spazio indirizzo, di cui utilizza solo poche pagine. (ad esempio, un processo a 64 bit può avere uno spazio di indirizzamento virtuale molto più grande del tuo disco rigido, mentre potrebbe avere solo una memoria riservata che è molto più piccola, e anche quella, non tutte le pagine devono essere effettivamente allocate).

Tuttavia, GDB può leggere queste intestazioni e se gli chiedi di stampare cose (ad esempio usando il comando print o x), ti darà la cosa giusta.

Se si desidera leggere un file di dump di base, la cosa giusta da fare è quindi utilizzare le funzionalità di GDB per farlo. Fortunatamente, c'è libgdb, che fa esattamente quello per l'applicazione C/C++. In pratica, parliamo di GDB come se fossi un utente seduto davanti alla shell gdb. Quindi, scopri come fare ciò che vuoi in GDB, e poi usa libgdb per farlo a livello di programmazione.

Se si desidera eseguire un livello inferiore (non farlo, è una seccatura, e GDB è davvero ciò che si desidera utilizzare, in realtà) è possibile utilizzare direttamente lo Binary File Descriptor Library per analizzare e rappresentare il core dump. È una parte essenziale di GDB, e sarà difficile farlo funzionare con il tuo programma C++ senza re-implementare molte routine GDB.

+0

Conosci un modo per leggere i dati dell'indirizzo virtuale nel core dump da C++? –

+0

@JohnDoyle: vedere l'emendamento alla mia risposta. –

+0

Grazie mille! sei un eroe! :) –