Domanda

Di solito come aggirare questo problema? Immaginiamo che un filo si blocca all'interno del codice libc (che è una libreria condivisa sistema) Computer1 e quindi genera un coredump. Ma il Computer2 su cui sarà analizzato questa coredump potrebbe avere una diversa versione di libc.

  1. Quanto è importante avere la stessa libreria condivisa sul computer remoto? Sarà StackTrace il gdb correttamente ricostruire senza avere esattamente lo stesso versione di libc su Conputer2?

  2. Quanto è importante avere i simboli di debug corretti per libc? Sarà il gdb stacktrace correttamente ricostruire senza avere esattamente lo stesso i simboli di debug sul Computer2?

  3. E qual è il modo "corretto" per evitare questo problema di debug simbolo non corrispondente per le librerie di sistema condivise? Per me sembra che non esiste un'unica soluzione che risolve questo problema in modo elegante? Forse chiunque può condividere la sua esperienza?

È stato utile?

Soluzione

  1. Dipende. Su alcuni processori, come x86_64, corretta svolgimento descrittori sono richiesti per GDB per rilassarsi correttamente lo stack. Su tale macchina, analizzando coredump con i non-matching libc probabilmente produrrà completa spazzatura.

  2. Non è necessario simboli di debug per libc per ottenere la traccia dello stack. Non si otterrebbe numeri di file e di linea, senza i simboli di debug, ma si dovrebbe ottenere i nomi delle funzioni corrette (tranne quando inlining ha avuto luogo).

  3. La premessa della sua domanda è sbagliato - simboli di debug non hanno nulla a che fare con questo. Il modo "corretto" per analizzare coredump in C2, quando quel coredump è stato prodotto in C1, è quello di avere una copia di librerie di C1 (per esempio in /tmp/C1/lib/...) e GDB diretto a utilizzare tale copia anziché della C2 installato libc con

    (gdb) set solib-absolute-prefix /tmp/C1

comando.

Nota : impostazione sopra deve essere in vigore prima di caricare il nucleo in GDB. Questo:

gdb exe core
(gdb) set solib-absolute-prefix /tmp/C1

non funzionerà (core viene letta prima l'impostazione è attiva).

Questa è la strada giusta:

gdb exe
(gdb) set solib-absolute-prefix /tmp/C1
(gdb) core core

(ho cercato di trovare un riferimento alla presente sul web, ma non lo fece).

Quali sono i descrittori di svolgimento?

descrittori di svolgimento sono necessari quando il codice viene compilato senza puntatori ai frame (predefinito per x86_64 in modalità ottimizzata). Tale codice non Salva% RBP registrati, e così GDB ha bisogno di essere detto come "passo indietro" dal frame corrente al telaio chiamante (questo processo è noto anche come pila di svolgimento).

Perché non è libc.so di C1 incluso nel core?

Il file core di solito contiene solo i contenuti dei segmenti scrivibili dello spazio indirizzo del programma. I segmenti di sola lettura (in cui il codice eseguibile e descrittori di svolgimento risiedono) non è di solito necessario -. Si può solo leggerli direttamente dal libc.so sul disco

A parte questo non funziona quando si analizza core C1 C2!

Alcuni sistemi (ma non tutti) che operano permettono di configurare i "coredumps pieni", dove farà il dump di sola lettura del sistema operativo mappature così, proprio in modo da poter analizzare il nucleo su qualsiasi macchina.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top