Newsgroup: it.comp.lang.c
Titolo: scrivere un debugger minimale

Salve a tutti,
come da titolo mi piacerebbe riuscire a scrivere un piccolo debugger
sotto linux. L'idea sarebbe quella di creare qualcosa di veramente
semplice, fermare un processo con dei breakpoint e poi farlo
ripartire. Qualcuno di voi sa indirizzarmi sul dove reperire
informazioni approfondite sulla gestione dei processi di linux.
grazie a tutti in anticipo


Io uso ddd. Non ho nemmeno idea se si tratti di software Open Source.
In ogni caso te lo segnalo. Purtroppo non posso aiutarti se non
indicartelo come spunto per lo sviluppo del tuo debugger. Magari lo
trovi un prodotto soddisfacente =).

 Magari lo trovi un prodotto soddisfacente =).
ddd non è un debugger, ma è solo un'interfaccia verso gdb od altri 
tools simili che sono il vero debugger.
gdb accetta solo comandi di linea e questi comandi sono molto complessi.
Un debugger minimale dovrebbe principalmente poter accedere alla 
memoria del processo da analizzare e questo può essere fatto in 
massima parte con la funzione ptrace() che, attraverso il kernel, 
permette lo scambio dei segnali che sospendono e riavviano il processo 
e dei contenuti dei registri e della memoria fra debugger e processo 
debuggato.
Altra funzione importante del debugger è la conoscenza dei formati dei 
file eseguibili per poter accedere alle informazioni relative ai 
simboli.  È dalle informazioni prodotte dal compilatore che il 
debugger ricava gli indirizzi (in memoria) delle istruzioni o delle 
variabili.
Aggiungi anche un disassemblatore per le istruzioni.
Ciao
Giovanni
-- 
   A computer is like an air conditioner,
   it stops working when you open Windows.
   < 
http://giovanni.homelinux.net/
 >

 gdb accetta solo comandi di linea e questi comandi sono molto complessi.
non è vero :)
gdb ha anche una modalità semigrafica (stile ncurses)
-- 
By ZeD

 gdb ha anche una modalità semigrafica (stile ncurses)
E mi sembra ci fosse anche una gui in tk.

 E mi sembra ci fosse anche una gui in tk.
Sono rutti front-end (come ddd) che generano i comandi e li passano a 
gdb e rielaborano output per offrirlo formattato.


 gdb e rielaborano output per offrirlo formattato.
guarda che io parlavo di gdb --tui 
http://sourceware.org/gdb/download/onlinedocs/gdb_23.html#SEC235
che poi ci siano *anche* dozzine di frontend (da ddd a kdbg passando per
emacs e xcode) è un altro conto
-- 
By ZeD

 
http://sourceware.org/gdb/download/onlinedocs/gdb_23.html#SEC235
Non è che hai molto di più con quella opzione, se non finestre 
multiple che ti permettono di seguire i sorgenti e/o l'assembly e la 
semplificazione di alcuni (pochi) comandi.
Il problema posto dall'OP era ben diverso.  Scrivere un debugger non è 
una cosa semplice e non basta suggerirgli di studiarsi una GUI.
A parte le semplificazioni che puoi avere usando la TUI rimane il 
fatto che il vero lavoro che fa gdb è ben altro e richiede una 
conoscenza dei formati degli eseguibili prodotti da ogni compilatore.



Tanto per essere precisi: il formato di eseguibili/librerie e il
compilatore utilizzato *non* sono la stessa cosa. ELF, COFF, A.OUT
sono formati: diversi tipi di compilatori o linker possono avere (ed
hanno) come output lo stesso formato, anche perché altrimenti il SO
non potrebbe farli partire :-)
La cosa difficile nello scrivere un debugger IMHO (specialemente sotto
linux) è riuscire a scavalcare tutte le palle di protezioni di memoria
di un programma che sta correndo (il debugger deve modificare il
codice run-time). Ecco, questo mi sembra non tanto immediato da
studiare.
Ciao!

 immediato da studiare.
Questo non è per niente difficile almeno per un ambiente Unix.  È gia 
risolto dalla funzione di libreria ptrace().
$ man ptrace



Certo certo. Pensavo a qualche combinazione di ptrace() con mprotect()
o simili. Non avendo mai provato sono un po' scettico al pensare che
sia così facile - ma mi posso anche sbagliare. Ho trovato cosa fare
stasera ;)
Ciao!

 trovato cosa fare stasera ;)
Se ti interessa qui trovi una implementazione per Minix.
http://giovanni.homelinux.net/pub/outgoing/mdb.tar.gz
È molto rudimentale anche perché in minix il compilatore genera poche 
informazioni di debug.  Comprende anche il disassembly per 386 (la 
versione originale del '96
< 
http://giovanni.homelinux.net/pub/minix/contrib/mdb.tar.Z
 >
era solo per 80286/8086) ed ha una interfaccia minimale.
Buon divertimento.
