Rev 2742 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
3139 | fedesco | 1 | Introduzione. |
1737 | clevermous | 2 | |
3139 | fedesco | 3 | mtdbg è un debugger per il sistema operativo KolibriOS. Questo documento |
4 | descrive come utilizzare tale programma. Per eventuali domande conviene |
||
5 | scrivere sul forum (in russo, ma esiste anche una sezione inglese) |
||
6 | -- board.kolibrios.org. |
||
1737 | clevermous | 7 | |
3139 | fedesco | 8 | Descrizione generica. |
1737 | clevermous | 9 | |
3139 | fedesco | 10 | mtdbg è in grado di fare il debug di un solo programma alla volta, se non |
11 | viene caricato nessun programma, il debug viene disabilitato. |
||
1737 | clevermous | 12 | |
3139 | fedesco | 13 | Il programma è a linea di comando, e accetta in input comandi da tastiera |
14 | La linea di comando è posizionata in basso, e accetta in input tasti |
||
15 | Backspace,Delete,Home,End,frecce sinistra/destra. |
||
16 | I comandi non sono case-sensitive e il delimitatore è un numero arbitrario |
||
17 | non nullo di spazi. |
||
1737 | clevermous | 18 | |
3139 | fedesco | 19 | Per chiudere il debugger è sufficiente usare il comando "quit" senza |
20 | nessun argomento, altrimenti da interfaccia cliccando sul pulsante di |
||
21 | chiusura come per le altre applicazioni. |
||
1737 | clevermous | 22 | |
3139 | fedesco | 23 | Quando il debugger viene avviato senza argomenti, non viene caricato |
24 | nessun programma. Se invece viene avviato con degli argomenti, mtdbg |
||
25 | cercherà di caricare il programma indicato come primo argomento e con |
||
26 | eventuali parametri per il programma passati come argomenti successivi. |
||
1737 | clevermous | 27 | |
3139 | fedesco | 28 | È possibile caricare un qualsiasi programma in un secondo |
29 | momento con il comando |
||
30 | load |
||
31 | ad esempio: |
||
1737 | clevermous | 32 | load /rd/1/example |
33 | LOAD /rd/1/aclock w200 h200 |
||
34 | LoaD /hd0/1/menuetos/dosbox/dosbox |
||
3139 | fedesco | 35 | negli esempi, mtdbg caricherà il programma passato come primo argomenti, |
36 | un eventuale secondo argomento è il parametro da passare al programma |
||
37 | che si vuole caricare. |
||
38 | Il comando "load" restituisce in output nel "messages window", poco più |
||
39 | in alto della linea di comando, se il programma è stato caricato con |
||
40 | successo o meno. In caso di errore, verra mostrata la causa. |
||
41 | L'errore più comune è del tipo, "file not found", probabilmente perché |
||
42 | si è digitato in modo errato il percorso o il nome del programma da |
||
43 | caricare. |
||
1737 | clevermous | 44 | |
3139 | fedesco | 45 | Il debugger è in grado di caricare file con simboli relativi al |
46 | programma di cui si vuole effetuare il debug. |
||
47 | Si tratta di file di testo, dei quali ogni riga inizia con |
||
1737 | clevermous | 48 | 0x |
3139 | fedesco | 49 | (righe che non iniziano in questo modo vengono ignorate). Tali file si |
50 | possono creare a mano o tramite fasm. È possibile caricare questi file |
||
51 | esplicitamente con il comando |
||
52 | load-symbols |
||
53 | Inoltre, quando viene eseguito il comando "load", mtdbg controllerà |
||
54 | la presenza di un file contenente simboli relativi al programma e di |
||
55 | estensione .dbg (nel primo esempio controlla la presenza del file |
||
56 | /rd/1/example.dbg). Se tale file esiste, questo viene caricato |
||
57 | automaticamente and if such file exists, e verrà notificato tramite il |
||
58 | messaggio "Symbols loaded", se il caricamento viene eseguito con |
||
59 | successo. |
||
1737 | clevermous | 60 | |
3139 | fedesco | 61 | Può succedere che un programma che si vuole caricare è stato |
62 | compresso. La compressione funziona, in linea generale, nel |
||
63 | seguente modo: il file di input viene compresso (da qualche |
||
64 | programma apposito), successivamente viene aggiunto un pezzo di codice |
||
65 | che all'avvio del programma effettua una decompressione in memoria. |
||
66 | Se un programma è stato compresso, il suo codice non è visibile al |
||
67 | debugger, e deve venir prima decompresso. |
||
68 | mtdbg è in grado di determinare la maggior parte di compressori |
||
69 | (mxp,mxp_lzo,mxp_nrv,mtappack) e in questi casi suggerisce in automatico |
||
70 | di effettuare la decompressione per vedere il codice del programma. |
||
71 | È sufficiente pigiare 'y' e enter per accettare l'opzione, altrimenti |
||
72 | rifiutarla. Se non viene riconosciuto il metodo di compressione, è |
||
73 | sempre possibile usare il comando unpack (senza argomenti). |
||
74 | Tale comando è da usare solamente se si è sicuro che il programma sia |
||
75 | compresso e che non sia già stato decompresso dal debugger. |
||
76 | [A partire da Kolibri 0.6.5.0, questo paragrafo non è più attuale poiché |
||
77 | è possibile comprimere le applicazioni con kpack e il decompressore è |
||
78 | implementato a livello kernel, in modo da rendere il debug trasparente] |
||
1737 | clevermous | 79 | |
3139 | fedesco | 80 | Un programma caricato può essere terminato tramite il comando |
81 | "terminate" senza argomenti. Il comando "detach", senza parametri |
||
82 | aggiuntivi "stacca" il programma dal debugger, nel senso che questo |
||
83 | continuerà la sua normale esecuzione senza il debugger, come se questo |
||
84 | non vi fosse mai stato. |
||
85 | Dato uno di questi due comandi, l'attività di debug viene terminata. |
||
1737 | clevermous | 86 | |
3139 | fedesco | 87 | È possibile ricaricare il programma precedente con il comando "reload", |
88 | senza parametri. Se nel frattempo è stato caricato un altro programma, |
||
89 | questo viene terminato e viene ricaricato il programma precedente con |
||
90 | gli argomenti passati precedentemente, come se fossero stati dati i |
||
91 | comandi |
||
1737 | clevermous | 92 | terminate |
3139 | fedesco | 93 | load |
94 | Il vantaggio di reload sta nel fatto di essere più immediato e che viene |
||
95 | mantenuto l'indirizzo di memoria, mentre con il comando load questo |
||
96 | viene spostato all'indirizzo 0. (vedi sotto) |
||
1737 | clevermous | 97 | |
3139 | fedesco | 98 | Il comando "help", oppure "h", è sempre disponibile. |
99 | Tutti i comandi sono divisi in gruppi |
||
100 | "help" senza argomenti mostra l'elenco dei comandi disponibili |
||
101 | "help" con il nome di un gruppo mostra i comandi relativi al gruppo |
||
102 | "help" con il nome di un comando mostra informazioni sull'uso di tale |
||
103 | comando |
||
104 | esempi: |
||
1737 | clevermous | 105 | help |
106 | help control |
||
107 | h LoaD |
||
108 | |||
3139 | fedesco | 109 | La finestra del debugger è composta dai seguenti elementi enumerati |
110 | dall'alto al basso: |
||
111 | - status string. Se è stato caricato un programma, mostra il suo nome e |
||
112 | stato ("Running/Paused"), altrimenti "No program |
||
113 | loaded". |
||
114 | - registers window - Mostra valori di caratteri generico, valori di |
||
115 | registro e stato delle singole flag: |
||
116 | CF,PF,AF,ZF,SF,DF,OF: se una flag viene rimossa, |
||
117 | allora è contrassegnata da lettere minuscole, se |
||
118 | creata allora da lettere maiuscole. I valori di |
||
119 | registro che vengono modificati sono contrassegnati |
||
120 | in verde. |
||
121 | - data window (dump window) - mostra la porzione di memoria contenente |
||
122 | il programma caricato |
||
123 | - code window (disassembler window) - mostra il codice del programma come |
||
124 | "disassembled instructions" |
||
1737 | clevermous | 125 | - messages window |
126 | - command line window |
||
127 | |||
3139 | fedesco | 128 | Nella "Dump window" è possibile osservare i dati a partire da ogni |
129 | indirizzo, usare il comando |
||
130 | d |
||
131 | Il comando "d", senza parametri mostra la "dump window". |
||
132 | In modo analogo funziona il seguente comando per la "code window" |
||
133 | u |
||
134 | oppure "u". |
||
135 | Esempi: |
||
136 | d esi - mostra i dati all'indirizzo esi (e.g. utile prima di eseguire |
||
137 | una istruzione rep movsb) |
||
138 | d esp - mostra lo stack |
||
139 | u eip - disassembla le istruzioni a partire dall'attuale indirizzo |
||
1737 | clevermous | 140 | |
3139 | fedesco | 141 | Le espressioni in mtdbg possono includere |
142 | - costanti esadecimali |
||
143 | - nomi generici dei registri degli indirizzi (8 32-bits, 8 16-bits e |
||
144 | 8 8-bits) e registri eip; valori di 16- e 8-bits sono riempiti nel |
||
145 | registro di 0 fino a raggiungere i 32 bit. |
||
146 | - quattro operatori aritmetici +,-,*,/ (con le priorità standard) e le |
||
147 | parentesi |
||
148 | - [se sono stati caricati i simboli del programma] nomi, caricati dal |
||
149 | file dbg |
||
150 | Tutti i calcoli sono effettuati modulo 2^32. |
||
151 | Esempi di espressioni: |
||
1737 | clevermous | 152 | eax |
153 | eip+2 |
||
154 | ecx-esi-1F |
||
155 | al+AH*bl |
||
156 | ax + 2* bH*(eip+a73) |
||
157 | 3*esi*di/EAX |
||
3139 | fedesco | 158 | Il comando |
159 | ? |
||
160 | calcola il valore della espressione passata come argomento. |
||
1737 | clevermous | 161 | |
3139 | fedesco | 162 | I valori del registro caricato nel programma può essere modificato con |
163 | il comando "r" in uno dei seguenti modi (sono equivalenti) |
||
164 | r |
||
165 | r |
||
1737 | clevermous | 166 | |
3139 | fedesco | 167 | Supponendo che sia stato caricato un programma con successo per il |
168 | debug, subito dopo il programma verrà sospeso e non più eseguito. |
||
169 | Premendo Ctrl+F7 (oppure dalla linea di comando "s") è possibile far |
||
170 | effettuare una azione al programma, dopodiché questo verrà sospeso |
||
171 | immediatamente, e il debugger mostrerà i nuovi valori nel registro e in |
||
172 | memoria. |
||
173 | la chiamata di sistema "int 40h" è considerata una azione. |
||
174 | Premendo Ctrl+F8 (oppure dalla linea di comando "p") permette di |
||
175 | eseguire il programma, e chiamate a procedure esterne, cicli e altre |
||
176 | strutture di controllo oppure operazioni con prefisso rep/repz/repnz |
||
177 | verranno interpretate come una singola azione. |
||
178 | Solitamente si chiede di eseguire azioni singole su sezioni di |
||
179 | programmi, ad esempio per tenere traccia dei valori in memoria e nel |
||
180 | registro. |
||
181 | Il comando |
||
182 | g |
||
183 | riprende l'esecuzione del programma e attende che il controllo vada a |
||
184 | eip=indirizzo dato, e in quel momento sospende il programma. |
||
185 | Se il comando "g" viene dato senza argomenti, viene semplicemente |
||
186 | ripresa l'esecuzione del programma. |
||
1737 | clevermous | 187 | |
3139 | fedesco | 188 | Per sospendere l'esecuzione del programma è sufficiente usare il comando |
189 | "stop", senza parametri o argomenti. |
||
1737 | clevermous | 190 | |
3139 | fedesco | 191 | In una situazione standard il programma viene eseguito normalmente, |
192 | quando sono soddisfatte alcune condizioni, il programma viene sospeso e |
||
193 | invia un segnale al debugger. Tali condizioni sono chiamate |
||
194 | "breakpoints" o "breaks". |
||
195 | L'utilizzo principale dei breakpoints è quello di interrompere |
||
196 | l'esecuzione del programma in determinati punti. I breakpoint si |
||
197 | impostano con il comando |
||
198 | bp |
||
199 | Si noti che se è presente un solo breakpoint, allora è più conveniente |
||
200 | usare il comando "g" con parametri. |
||
1737 | clevermous | 201 | |
3139 | fedesco | 202 | Vi sono altri tipi di breakpoint che permettono di accedera ad una data |
203 | area di memoria. Il numero massimo di breakpoint di questo tipo sono 4, |
||
204 | causa limitazioni hardware. |
||
205 | bpm |
||
206 | indirizzo dato |
||
207 | bpm w |
||
208 | indirizzo dato |
||
209 | bpmb,bpmw,bpmd |
||
210 | dword all'indirizzo dato. bpm e bpmb sono |
||
211 | sinonimi. Quando viene usato bpmw o bpmd, |
||
212 | gli indirizzi devono essere del tipo |
||
213 | corrispondenti al tipo di dato, quindi |
||
214 | per i word è dispari, per i dword è |
||
215 | divisibile per 4. |
||
216 | bpmb,bpmw,bpmd w |
||
1737 | clevermous | 217 | |
3139 | fedesco | 218 | Per vedere la lista dei breakpoints impostati, usare il comando "bl", |
219 | per ottenere informazioni su un particolare breakpoint, usare il |
||
220 | comando "bl |
||
221 | È possibile rimuovere i breakpoint con il comando "bc |
||
222 | disabilitati momentaneamente con il comando "bd |
||
223 | con "be |
||
1737 | clevermous | 224 | |
3139 | fedesco | 225 | Note. |
226 | 1. Quando si effettua il debug di un proprio programma, è possibile |
||
227 | mettere nel codice istruzione int3. Queste istruzioni creano delle |
||
228 | eccezioni durante la normale esecuzione, che porta alla terminazione |
||
229 | del programma, ma durante l'attività di debug permette di non dover |
||
230 | pensare agli indirizzi di memoria da usare nei comandi g e bp. |
||
231 | 2. La notazione standard per l'output e input è quella esadecimale. |
||
232 | 3. Quando il programma viene eseguito, la finestra del registro e dei |
||
233 | dati mostrano delle informazioni prima dell'avvio. Non si possono |
||
234 | impostare i valori di registro in questo mode. Tuttavia il |
||
235 | comando "d" in questo modo mostra informazioni che erano vere nel |
||
236 | momento in cui si è immesso il comando. |
||
1737 | clevermous | 237 | |
238 | diamond |