PDA

View Full Version : [c - Linux] debug: ddd con processi e thread


agosteeno
08-01-2011, 11:16
Salve a tutti, vorrei chiedervi qualche consiglio per il debug di programmi c che hanno vari processi e thread.
Finche' facevo programmi con un solo flusso di esecuzione con ddd nn avevo nessun problema, visto che sostanzialmente lo usavo per fermare l'esecuzione nel punto interessato e vedere il valore di variabili e strutture dati, ma ora, che invece sto' facendo un progetto di programmazione di sistema, e quindi ci sono vari processi e thread di mezzo, nn riesco piu' a usarlo.
In pratica il problema e' che nn so' come far muovere il flusso di esecuzione per far andare contemporanemente 2 processi: per esempio se faccio uno fork dove il padre fa' un server e il figlio un client, ddd segue il flusso del padre e basta. Quindi si blocca in attesa sulla accept per esempio. Ecco in questo punto vorrei cercare di far partire anche il figlio in modo da poter fare qualcosa.
Sapete come si puo' fare? Oppure con ddd proprio nn si puo' fare (anche se mi sembra strano).

Supdario
08-01-2011, 12:33
Salve a tutti, vorrei chiedervi qualche consiglio per il debug di programmi c che hanno vari processi e thread.
Finche' facevo programmi con un solo flusso di esecuzione con ddd nn avevo nessun problema, visto che sostanzialmente lo usavo per fermare l'esecuzione nel punto interessato e vedere il valore di variabili e strutture dati, ma ora, che invece sto' facendo un progetto di programmazione di sistema, e quindi ci sono vari processi e thread di mezzo, nn riesco piu' a usarlo.
In pratica il problema e' che nn so' come far muovere il flusso di esecuzione per far andare contemporanemente 2 processi: per esempio se faccio uno fork dove il padre fa' un server e il figlio un client, ddd segue il flusso del padre e basta. Quindi si blocca in attesa sulla accept per esempio. Ecco in questo punto vorrei cercare di far partire anche il figlio in modo da poter fare qualcosa.
Sapete come si puo' fare? Oppure con ddd proprio nn si puo' fare (anche se mi sembra strano).

Purtroppo GDB (e di conseguenza DDD, che è basato su esso) e gli altri debugger ordinari non sono in grado di debuggare i programmi multithread o multiprocesso, se provi a debuggare (ad esempio impostando un punto di interruzione) noterai spiacevolmente che ti si impallerà tutto.
Penso che questo sia dovuto ad una limitazione del kernel, non al debugger in sè.

Per eseguire il debug di applicazioni multithread dovrebbero esserci dei moduli specifici, ma non ti so dire niente in merito.

Tommo
08-01-2011, 14:14
Veramente se usi i threads gdb è capacissimo di distinguere tra i vari thread e mettere dei breaks su ognuno, almeno a me funzionava.
Il thread che esegue il break cattura l'interruzione e si ferma, gli altri continuano ad andare avanti.

In effetti però in caso di processi multipli gdb non si interessa ai figli :read:

Supdario
08-01-2011, 17:02
Veramente se usi i threads gdb è capacissimo di distinguere tra i vari thread e mettere dei breaks su ognuno, almeno a me funzionava.
Il thread che esegue il break cattura l'interruzione e si ferma, gli altri continuano ad andare avanti.

In effetti però in caso di processi multipli gdb non si interessa ai figli :read:

Sei sicuro? Quando lo provo io mi si impalla tutto e sono costretto a dare "killall -9 gdb" per sistemarlo. :D (usando la libreria pthread.h).

marco.r
08-01-2011, 20:19
Sei sicuro? Quando lo provo io mi si impalla tutto e sono costretto a dare "killall -9 gdb" per sistemarlo. :D (usando la libreria pthread.h).

sono un po' di anni ormai che gdb supporta i thread.
Per verificare se la tua versione lo fa scrivi un "info thread" dalla console di gdb.
Se non ti mostra niente non c'è il supporto.
Per i processi il supporto è piu' recente (mi sembra dalla versione 7.0 o 7.1), ma qui non è una tragedia perchè anche con una versione più vecchia al più puoi fare l'attach di un processo arbitrario in una seconda sessione di gdb (i.e. fai partire il programma, questo fa il fork, fai partire gdb ed esegui l'attach al pid del figlio). Un po' di lavoro in più ma niente che 5 righe di script non possano risolvere.

Supdario
09-01-2011, 12:34
sono un po' di anni ormai che gdb supporta i thread.
Per verificare se la tua versione lo fa scrivi un "info thread" dalla console di gdb.
Se non ti mostra niente non c'è il supporto.
Per i processi il supporto è piu' recente (mi sembra dalla versione 7.0 o 7.1), ma qui non è una tragedia perchè anche con una versione più vecchia al più puoi fare l'attach di un processo arbitrario in una seconda sessione di gdb (i.e. fai partire il programma, questo fa il fork, fai partire gdb ed esegui l'attach al pid del figlio). Un po' di lavoro in più ma niente che 5 righe di script non possano risolvere.

Hai assolutamente ragione. :D Ho appena riprovato e funziona tutto. Forse si impallava per il modo in cui avevo scritto il programma (forse quando il thread veniva stoppato dal breakpoint il main continuava facendo finire il programma).

Terrò a mente questo fatto quando mi capiterà di riutilizzare i pthread. :D

agosteeno
12-01-2011, 11:51
Grazie ragazzi per le risposte. Il punto e' che nn ho idea di come si faccia a fare quello che dite. Come faccio a capire quale flusso di esecuzione e' partito quando c'e' una fork o una pthread_create?