Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Ecovacs Deebot X12 OmniCyclone: lava grazie a FocusJet
Ecovacs Deebot X12 OmniCyclone: lava grazie a FocusJet
Il nuovo Deebot X12 OmniCyclone abbina un sistema di raccolta dello sporco senza sacchetto, un rullo di lavaggio esteso e la tecnologia FocusJet per intervenire più efficacemente sulle macchie più persistenti. Un robot completo e preciso che aiuta a tenere puliti i pavimenti di casa con il minimo sforzo
Narwal Flow 2: la pulizia di casa con un mocio a nastro
Narwal Flow 2: la pulizia di casa con un mocio a nastro
Narwal Flow 2 implementa un mocio a nastro che esegue una pulizia dettagliata del pavimento di casa, in abbinamento ad un potente motore di aspirazione della polvere: un prodotto ideale per gestire in autonomia e con grande efficacia le necessità di pulizia dei pavimenti di casa
Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless
Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless
MSI FORGE GK600 TKL WIRELESS: switch lineari hot-swap, tripla connettività, display LCD e 5 strati di fonoassorbimento. Ottima in gaming, a 79,99 euro
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 08-01-2011, 10:16   #1
agosteeno
Member
 
Iscritto dal: Aug 2009
Messaggi: 119
[c - Linux] debug: ddd con processi e thread

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).
agosteeno è offline   Rispondi citando il messaggio o parte di esso
Old 08-01-2011, 11:33   #2
Supdario
Member
 
Iscritto dal: Mar 2008
Messaggi: 267
Quote:
Originariamente inviato da agosteeno Guarda i messaggi
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.
Supdario è offline   Rispondi citando il messaggio o parte di esso
Old 08-01-2011, 13:14   #3
Tommo
Senior Member
 
L'Avatar di Tommo
 
Iscritto dal: Feb 2006
Messaggi: 1304
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
__________________
*ToMmO*

devlog | twitter
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 08-01-2011, 16:02   #4
Supdario
Member
 
Iscritto dal: Mar 2008
Messaggi: 267
Quote:
Originariamente inviato da Tommo Guarda i messaggi
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
Sei sicuro? Quando lo provo io mi si impalla tutto e sono costretto a dare "killall -9 gdb" per sistemarlo. (usando la libreria pthread.h).
Supdario è offline   Rispondi citando il messaggio o parte di esso
Old 08-01-2011, 19:19   #5
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da Supdario Guarda i messaggi
Sei sicuro? Quando lo provo io mi si impalla tutto e sono costretto a dare "killall -9 gdb" per sistemarlo. (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.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 09-01-2011, 11:34   #6
Supdario
Member
 
Iscritto dal: Mar 2008
Messaggi: 267
Quote:
Originariamente inviato da marco.r Guarda i messaggi
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. 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.
Supdario è offline   Rispondi citando il messaggio o parte di esso
Old 12-01-2011, 10:51   #7
agosteeno
Member
 
Iscritto dal: Aug 2009
Messaggi: 119
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?
agosteeno è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Ecovacs Deebot X12 OmniCyclone: lava grazie a FocusJet Ecovacs Deebot X12 OmniCyclone: lava grazie a Fo...
Narwal Flow 2: la pulizia di casa con un mocio a nastro Narwal Flow 2: la pulizia di casa con un mocio a...
Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless Tastiera gaming MSI GK600 TKL: switch hot-swap, ...
DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici DJI Osmo Pocket 4: la gimbal camera tascabile cr...
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori Sony INZONE H6 Air: il primo headset open-back d...
Funzioni nascoste nelle librerie ADLX Ra...
Itala rinasce: lo storico marchio automo...
Huawei Watch Fit 5 e 5 Pro ufficiali: di...
ECOVACS DEEBOT T90 PRO OMNI vs Roborock ...
Fastweb scompare dai partner Starlink Mo...
Huawei anticipa tutti con Pura X Max: il...
Amazon Tech Week 2026: RTX 5000, process...
Grandi offerte Amazon su scope elettrich...
Amazon e Anthropic rafforzano la partner...
Elden Ring: il film arriverà fra ...
Mercato PC, +3,2% nel Q1 2026: Lenovo se...
Corsair Platform: scrivanie gaming modul...
Assassin's Creed Black Flag Resynced: Ub...
La crisi delle memorie colpisce anche Ap...
NVIDIA accelera il Path Tracing: nuovo a...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 11:15.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v