2013-04-23 10 views
6

Sto sviluppando un'applicazione server C ad alta rete che viene eseguita come un demone. In alcune circostanze, l'app si arresta in modo anomalo (sempre senza core). Come posso eseguire il debug del daemon in esecuzione con gdb per trovare il posto che genera SIGSEGV?Debug di un demone in esecuzione utilizzando gdb

Note esplicative:

  1. so come collegare utilizzando gdb a un processo in esecuzione utilizzando il comando attach

  2. Dopo aver fissato al processo, si ferma. Se corro quindi "continua", gdb rimane bloccato se il programma non si blocca. Se premo CTRL-C, il processo sta uscendo e non riesco a staccare semplicemente gdb.

Quindi la domanda è: esiste un modo per continuare il processo senza il gdb essere bloccato ma essere in grado di staccare, se il processo non va in crash?

+0

Hai provato cambiare il impostazioni di coredump con es il comando 'ulimit'? E/o eseguire una versione di debug? O forse aggiungendo più registrazioni per restringere le possibili posizioni per l'incidente? –

+0

Ho provato tutte le possibilità. Il processo viene eseguito come servizio upstart su un server Ubuntu ed è impostato su un determinato utente all'avvio del servizio. Il limits.conf contiene valori illimitati sia per nofile che per core per quell'utente. Ho impostato fs.suid_dumpable e kernel.core_uses_pid in /etc/sysctl.conf Ho aggiunto più logging ma è un server ad alto traffico e genera troppi output. –

risposta

3

Questa pagina attach/detach dice che il comando detach funzionerebbe all'interno di gdb.

Se si desidera rilevare un errore di segmentazione in un'applicazione, è necessario eseguire l'applicazione dal debugger. Quindi, quando viene rilevato il segnale, è possibile utilizzare where o bt per visualizzare una traccia dello stack dell'applicazione. Ovviamente non è possibile continuare l'applicazione dopo che è fallita, come dovrebbe ripristinarsi? Se si prevede di attivare l'errore a breve, è possibile allegare al processo in esecuzione e attendere di nuovo l'errore nel debugger.

Se si desidera una traccia stack dopo che si è verificato l'errore, è necessario un file core in quanto non ci sarà alcun processo a cui collegarsi. Ora se il tuo demone è avviato come parte del sistema, potrebbe essere difficile ottenere la configurazione per eseguire il dump di core, inoltre potresti non volere che altre applicazioni lascino i dump di core ovunque. Quindi consiglierei di fermare il demone di sistema e avviarlo di nuovo nel tuo spazio utente, quindi puoi permetterlo di eseguire il dump core. Se è veramente essenziale che si avvii come parte del sistema, controlla se l'avvio del daemon è limitato a una singola sotto-shell e usa ulimit -c in quella sotto-shell per impostare una dimensione massima appropriata per il core discarica.

+0

Lo so, ma dopo aver eseguito il comando "continue", l'unico modo per uscire da gdb è premere CTRL-C, che interrompe il processo in esecuzione. –

+0

Usa 'detach' invece di' continue' e quindi usa 'quit'. Per me va bene. –

+0

Capisco, ma voglio essere in grado di ottenere un backtrace se il processo si blocca. –

6

modalità Prova asincrono e "continuano &":

Salva qui sotto per non stop.gdb

set target-async on 
set pagination off 
set non-stop on 

Poi gestita:

$ gdb -x non-top.gdb 
(gdb) !pgrep YOUR-DAEMON 
1234 
(gdb) attach 1234 
(gdb) continue -a & 
(gdb) 
+0

Grazie. Proverò questo e posterò un feedback. –