In che modo GDB trova il simbolo di una funzione durante il backtracing in MIPS Linux?

StackOverflow https://stackoverflow.com/questions/1051872

  •  20-08-2019
  •  | 
  •  

Domanda

Sto cercando di implementare una funzione per tornare indietro nel processo dello spazio utente in crash nel kernel. Da allora, sto lavorando in Kernel, non ho il lusso di nessuna libreria e la funzione backtrace fornita non supporta l'architettura MIPS. Mi chiedo solo se posso emulare ciò che fa GDB. La versione del kernel è 2.6.21.

È stato utile?

Soluzione

Penso che puoi fare riferimento all'implementazione di oprofile .

Oprofile usa frame-pointer per ottenere le informazioni di back trace, quindi richiede che le applicazioni dello spazio utente e le sue librerie correlate siano tutte costruite con frame-pointer abilitato. (" -fno-omit-frame-pointer quot; opzione).

Un altro modo è che se le applicazioni utente contengono informazioni di debug, potrebbe essere necessario controllare le informazioni DWARF dell'applicazione utente, l'informazione del frame di chiamata DWARF fornisce al debugger informazioni sufficienti sul modo in cui una funzione ha chiamato, in modo che possa individuare ciascuno degli argomenti sulla funzione, individuare il frame di chiamata corrente e individuare il frame di chiamata per le informazioni di chiamata.

Se vuoi semplicemente scansionare le informazioni di back trace senza " frame-pointer " supportato o qualsiasi informazione di debug, quindi è necessario controllare le istruzioni mips dell'applicazione utente, scorrere le cose nel contesto del bambino (SP, IP, RP) per ottenere il contesto principale (SP, IP, RP) dalle specifiche ABI mips, questo è un un po 'complicato e richiede tempo poiché devi smontare molte istruzioni in memoria, ma non funziona male. Ad esempio, per molte routine, c'è un & Quot; aggiungi sp, sp, -32 & Quot; come le istruzioni sull'accattonaggio, e saprai che il p del genitore è attualmente sp più 32.

Il secondo e il terzo modo è necessario implementarlo da soli poiché si lavora nel kernel.

Altri suggerimenti

Il file principale è in formato ELF . Questo è uno standard, disponibile su molti siti Web a solo un google di distanza.

TUTTAVIA, questo formato di file è non-trival. Un sacco di stranezze e bit. Ogni persona ragionevole dovrebbe usare una biblioteca di terze parti. Se vuoi davvero farlo, inizia con libelf e leggi. e auguro buona fortuna.

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