L'analisi del core dump nella build di vendita al dettaglio richiede spesso di correlare lo objdump
di qualsiasi modulo specifico e l'origine. Normalmente correlare la discarica di assembly con la sorgente diventa un dolore se la funzione è abbastanza coinvolta. Oggi ho provato a creare un assembly listing
di un particolare modulo (con l'opzione di compilazione -S
) in attesa di vedere una sorgente di interleaving con assembly o una correlazione. Purtroppo l'elenco non è stato abbastanza gentile di correlare quindi mi chiedevoCorrela origine con elenco assembly di un programma C++
- Dato un core-discarica da cui è possibile determinare la posizione incidente
objdump
del modulo non aver Assemblea Inserite da ricompilare il modulo di- con Opzione
-S
.
È possibile eseguire una corrispondenza uno a uno con la fonte?
Come esempio vedo la lista di montaggio come
.LBE7923:
.loc 2 4863 0
movq %rdi, %r14
movl %esi, %r12d
movl 696(%rsp), %r15d
movq 704(%rsp), %rbp
.LBB7924:
.loc 2 4880 0
testq %rdx, %rdx
je .L2680
.LVL2123:
testl %ecx, %ecx
jle .L2680
movslq %ecx,%rax
.loc 2 4882 0
testl %r15d, %r15d
.loc 2 4880 0
leaq (%rax,%rax,4), %rax
leaq -40(%rdx,%rax,8), %rdx
movq %rdx, 64(%rsp)
ma non riuscivo a capire come interpretare le etichette come .LVL2123
e direttive come .loc 2 4863 0
Nota Poiché le risposte raffigurati, attraverso la lettura la fonte dell'assemblaggio e la determinazione intuitiva del modello in base ai simboli (come le chiamate di funzione, i rami, l'istruzione di ritorno) è ciò che generalmente faccio. Non sto negando che non funzioni, ma quando una funzione è abbastanza complicata, leggere le pagine di Assembly Listing è un problema e spesso si finisce con l'elencazione che raramente si combina o perché le funzioni di allineamento o ottimizzazione sono semplicemente sballottate il codice a piacere. Ho la sensazione di vedere quanto efficientemente Valgrind
gestisce i binari ottimizzati e come in Windows WinDBG sia possibile gestire i binari ottimizzati, c'è qualcosa che mi manca. Quindi, anche se vorrei iniziare con l'output del compilatore e usarlo per correlare. Se il mio compilatore è responsabile per la manipolazione del file binario sarebbe la persona migliore per dire come correlare con la fonte, ma sfortunatamente è stato meno utile e lo .loc
è davvero fuorviante. Sfortunatamente spesso devo leggere i dump non riproducibili su varie piattaforme e il minimo tempo che trascorro è nel debug di Windows Mini-dump attraverso WinDBG e un tempo considerevole nel debug di Linux Coredumps. Per quanto ciò possa essere, non sto facendo le cose correttamente, quindi mi è venuta questa domanda.
Questa non è una risposta alla tua domanda, ma potrebbe essere utile in ogni caso: http://msdn.microsoft.com/en-us/library/aa238730%28v=vs.60%29.aspx –
Il core dump dovrebbe avere indirizzi in esso. Quindi prova il programma 'addr2line' per tradurre in posizioni di origine. Questo ovviamente richiede un eseguibile con simboli di debug (dovrebbe funzionare anche se la tua versione distribuita è stata spogliata, basta confrontare con una versione non ridotta) –
@ edA-qamort-ora-y: Proverò questo e ti faccio sapere dove Finisco con. A proposito, non dovrebbe essere una risposta piuttosto che un commento? – Abhijit