Subversion Repositories Kolibri OS

Rev

Rev 2742 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. Introduzione.
  2.  
  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.
  7.  
  8. Descrizione generica.
  9.  
  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.
  12.  
  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.
  18.  
  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.
  22.  
  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.
  27.  
  28. È possibile caricare un qualsiasi programma in un secondo
  29. momento con il comando
  30. load <percorso all'eseguibile> [<parametri>]
  31. ad esempio:
  32. load /rd/1/example
  33. LOAD   /rd/1/aclock w200 h200
  34.   LoaD  /hd0/1/menuetos/dosbox/dosbox
  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.
  44.  
  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
  48. 0x<hex_value_of_addr> <name>
  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 <percorso al file>
  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.
  60.  
  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]
  79.  
  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.
  86.  
  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
  92. terminate
  93. load <vecchio programma> <vecchi parametri>
  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)
  97.  
  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:
  105. help
  106. help control
  107. h LoaD
  108.  
  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"
  125. - messages window
  126. - command line window
  127.  
  128. Nella "Dump window" è possibile osservare i dati a partire da ogni
  129. indirizzo, usare il comando
  130. d <espressione>
  131. Il comando "d", senza parametri mostra la "dump window".
  132. In modo analogo funziona il seguente comando per la "code window"
  133. u <espressione>
  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
  140.  
  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:
  152. eax
  153. eip+2
  154. ecx-esi-1F
  155. al+AH*bl
  156. ax + 2* bH*(eip+a73)
  157. 3*esi*di/EAX
  158. Il comando
  159. ? <espressione>
  160. calcola il valore della espressione passata come argomento.
  161.  
  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 <registro> <espressione>
  165. r <registro>=<espressione>
  166.  
  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 <espressione>
  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.
  187.  
  188. Per sospendere l'esecuzione del programma è sufficiente usare il comando
  189. "stop", senza parametri o argomenti.
  190.  
  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 <espressione>
  199. Si noti che se è presente un solo breakpoint, allora è più conveniente
  200. usare il comando "g" con parametri.
  201.  
  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 <espressione> - interrompe ad ogni accesso ad ogni byte ad un
  206.                     indirizzo dato
  207. bpm w <espressione> - interrompe alla scrittura di ogni byte ad un
  208.                       indirizzo dato
  209. bpmb,bpmw,bpmd <espressione> - 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 <espressione> - simile al break in scrittura.
  217.  
  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 <numero>".
  221. È possibile rimuovere i breakpoint con il comando "bc <numero>", oppure
  222. disabilitati momentaneamente con il comando "bd <numero>" e riabilitati
  223. con "be <numero>"
  224.  
  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.
  237.  
  238.                                                 diamond
  239.