2012-01-12 6 views
5

Posso configurare cosa va in un core dump su Linux? Voglio ottenere qualcosa come i mini-dump di Windows (informazioni minime sullo stack frame quando l'app si è bloccata). So che è possibile impostare una dimensione massima per i file core utilizzando ulimit, ma ciò non mi consente di controllare ciò che accade all'interno del core (cioè non c'è garanzia che se imposto il limite a 64kb scaricherà le ultime 16 pagine di lo stack, per esempio).Dump nucleo minimale (traccia stack + frame corrente solo)

Inoltre, vorrei impostarlo in modo programmatico (dal codice), se possibile. Ho visto il file /proc/PID/coredump_filter menzionato da man core, ma sembra troppo granuloso per i miei scopi.

Per fornire un piccolo contesto: ho bisogno di piccoli file core, per molteplici ragioni: ho bisogno di raccoglierli in rete, per numerosi (migliaia) di clienti; inoltre, questi sono dispositivi integrati con poche schede SD e modem GPRS per la connessione di rete. Quindi qualsiasi cosa al di sopra di ~ 200k è fuori questione.

EDIT: Sto lavorando su un dispositivo incorporato che esegue Linux 2.6.24. Il processore è PowerPC. Purtroppo, PowerPC-linux è non supportate in Breakpad al momento, in modo da google Breakpad non è un'opzione

+1

Non ho idea, e la risposta si trova probabilmente all'interno del codice sorgente del kernel (perché non ci sono specifiche relative a questo). Perché lo chiedi? Con i dischi attuali, un limite di dump del core di 64 Mb è ancora ridotto e molto probabilmente contiene informazioni sufficienti. Perché è necessario impostare il limite su un valore così piccolo come 64kb. ? –

+3

Google Breakpad scrive minidump su tutte le piattaforme, incluso Linux. –

+0

Chiedo perché sto usando un dispositivo embedded, che ha un piccolo disco flash e soprattutto una connessione gprs lenta per scaricare i dati .. Voglio che sia il più piccolo possibile! –

risposta

5

ho "risolto" il problema in due modi:

  1. Ho installato un gestore di segnale per SIGSEGV e ho utilizzato backtrace/backtrace_symbols per stampare la traccia dello stack. Ho compilato il mio codice con -dinamico, quindi, anche dopo aver rimosso le informazioni di debug, ottengo ancora un backtrace con nomi significativi (pur mantenendo l'eseguibile abbastanza compatto).
    Ho spogliato le informazioni di debug e l'ho messo in un file separato, che conserverò da qualche parte sicuro, usando strip; da lì, userò add22line con le informazioni salvate dal backtrace (indirizzi) per capire dove si è verificato il problema. In questo modo devo memorizzare solo pochi byte.
  2. In alternativa, ho trovato che potevo usare/proc/self/coredump_filter per scaricare memoria (impostando il suo contenuto su "0"): solo le informazioni su thread e proc, registri, stacktrace ecc. Vengono salvate nel core. Vedere di più su this answer

Perdendo ancora informazioni che potrebbero essere preziose (contenuto di variabili globali e locali, parametri ..). Potrei facilmente capire quale pagina (s) scaricare, ma sfortunatamente non c'è modo di specificare un "dump-these-pages" per i normali core dump (a meno che non si sia disposti ad andare e correggere la funzione maydump() nel kernel).

Per ora, sono abbastanza contento con là 2 soluzioni (è meglio di niente ..) Le mie prossime mosse saranno:

  • vedere quanto difficile sarebbe quella di porto Breakpad per PowerPC Linux: ci sono già powerpc-darwin e i386-linux quindi .. quanto può essere difficile? :)
  • tenta di utilizzare google-coredumper per scaricare solo poche pagine attorno all'ESP corrente (che dovrebbe darmi abitanti e parametri) e circa "& some_global" (che dovrebbe darmi globals).
+0

Mentre sarebbe semplice eseguire il fork di google-coredumper e modificare la funzione 'WriteCoreDump' per scaricare pagine/indirizzi specifici .. non ha supporto per powerpc :( –