2010-01-12 11 views
7

Sto provando a eseguire il debug di un server che ho scritto con gdb in quanto segfaults in condizioni molto specifiche e rare.Come eseguire gdb su un demone in background?

Esiste un modo per eseguire gdb in background (tramite modalità batch o silenziosa? in un file designato) una volta che il programma si blocca?

+0

http: // stackoverflow.it/questions/17965/generate-a-core-dump-in-linux SO post sulla produzione di core dump –

+0

@HassanSyed: http://vmlinux.org/jocke/mirror/www.objsw.com/docs/gdb_22.html è un collegamento morto. – bgoodr

risposta

6

Perché non basta eseguire il processo in modo interattivo in una sessione di screen persistente? Perché deve essere un demone durante il debug? O semplicemente esegui gdb nella sessione dello schermo e collegalo al processo in esecuzione (ad esempio gdb/percorso/a/binario -p PID_of_binary) dopo il fork.

+0

Questa è davvero una grande idea, non ho idea del perché non ci ho pensato: P Grazie per la soluzione elementare! –

+0

+1 per tmux anziché per schermo – lkraav

1

io non sono davvero un esperto di gdb, ma due cose vengono in mente

  1. Tracepoints che potrebbe dare le informazioni necessarie come il vostro programma viene eseguito o
  2. Usa di remote debugging facility gdb per testare il programma mentre è in esecuzione come demone.
3

In primo luogo, imposterei la tua shell/ambiente per darti un core dump. In bash:

ulimit -c unlimited 

Una volta che hai il core dump, è possibile utilizzare gdb per esaminare la traccia dello stack:

gdb /path/to/app /path/to/core/file 
+2

Si noti che avere il file core non è la stessa cosa che avere lo stesso processo interrotto dal debugger. Il file principale non conserva le informazioni sui descrittori di file aperti o sullo stato di mappatura della memoria. Quindi questo non è sempre un suggerimento utile. –

+1

E non è possibile chiamare le funzioni definite nel programma. –

7

Supponendo di disporre delle autorizzazioni appropriate, è possibile collegare gdb a qualsiasi processo. È possibile farlo su riga di comando con:

gdb /path/to/binary _pid_ 

o dall'interno gdb con il comando attach:

attach _pid_ 

Quindi, una volta che il demone è avviato, è possibile utilizzare una di queste tecniche da allegare al PID finale il tuo demone è in esecuzione come. Allegando gdb si arresta il processo che si sta tracciando quindi è necessario emettere un "continua" per riavviarlo.

Non conosco un modo diretto per ottenere gdb per eseguire comandi arbitrari quando il programma si blocca. Ecco una soluzione che posso pensare:

  1. Creare e registrare un gestore di segnale per SIGSEGV.
  2. Dire a gdb di non fermarsi su quel segnale (handle SIGSEGV nostop)
  3. Impostare un punto di interruzione sulla prima riga del gestore di segnale.
  4. Assegna commands to the breakpoint dal punto 3
1

Si potrebbe voler dare un'occhiata a come Samba facilita il debugging; ha un "panic action" configurabile che può sospendere l'applicazione, avvisare lo sviluppatore, generare gdb, ecc. ed essere eseguito come parte del gestore di segnale. Vedi lib/util/fault.c nell'albero dei sorgenti di Samba.

Problemi correlati