Subversion Repositories Kolibri OS

Rev

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  - interrompe ad ogni accesso ad ogni byte ad un
206
                    indirizzo dato
207
bpm w  - interrompe alla scrittura di ogni byte ad un
208
                      indirizzo dato
209
bpmb,bpmw,bpmd  - interrompe all'accesso di ogni byte, o
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  - simile al break in scrittura.
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 ", oppure
222
disabilitati momentaneamente con il comando "bd " e riabilitati
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