Ecco due alternative per addr2line . Supponendo che tu abbia la toolchain del bersaglio corretta, puoi eseguire una delle seguenti operazioni:
Usa objdump :
-
individua il tuo
vmlinuxo il.kofile nella directory radice del kernel, quindi disassemblare il file oggetto :objdump -dS vmlinux > /tmp/kernel.s -
Apri il file di assieme generato,
/tmp/kernel.s. con un editor di testo comevim. Vai aunwind_backtrace+0x0/0xf8, ovvero cerca l'indirizzo diunwind_backtrace+offset. Infine, hai individuato la parte problematica nel tuo codice sorgente.
Usa gdb :
IMO, un'opzione ancora più elegante è usare l'unico gdb . Supponendo che tu abbia la toolchain adatta sul tuo computer host:
- Esegui
gdb <path-to-vmlinux>. - Esegui nel prompt di gdb:
list *(unwind_backtrace+0x10).
Per ulteriori informazioni, puoi consultare le seguenti risorse:
- Trucchi per il debug del kernel.
- Debug del kernel Linux utilizzando Gdb
In
unwind_backtrace+0x0/0xf8cosa il+0x0/0xf8sta per?
Il primo numero (+0x0 ) è l'offset dall'inizio della funzione (unwind_backtrace in questo caso). Il secondo numero (0xf8 ) è la lunghezza totale della funzione . Date queste due informazioni, se hai già un'idea di dove si è verificato l'errore, questo potrebbe essere sufficiente per confermare il tuo sospetto (puoi dire (approssimativamente) a che punto eri nella funzione).
Per ottenere l'esatta riga sorgente dell'istruzione corrispondente (generalmente meglio di humches), usa addr2line o gli altri metodi in altre risposte.
È solo un normale backtrace, quelle funzioni sono chiamate in ordine inverso (la prima chiamata è stata chiamata dalla precedente e così via):
unwind_backtrace+0x0/0xf8
warn_slowpath_common+0x50/0x60
warn_slowpath_null+0x1c/0x24
ocal_bh_enable_ip+0xa0/0xac
bdi_register+0xec/0x150
Il bdi_register+0xec/0x150 è il simbolo + l'offset/lunghezza ci sono maggiori informazioni a riguardo in Comprendere un kernel Oops e come puoi eseguire il debug di un kernel oops. Inoltre c'è questo eccellente tutorial sul debug del kernel
Nota:come suggerito di seguito da Eugene, potresti provare prima addr2line, ha comunque bisogno di un'immagine con simboli di debug, ad esempio
addr2line -e vmlinux_with_debug_info 0019594c(+offset)