Rev 2742 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1737 | clevermous | 1 | Введение. |
2 | |||
3 | mtdbg представляет собой отладчик для операционной системы Kolibri. Данная |
||
2742 | dunkaist | 4 | документация описывает возможности отладчика и работу с ним. С вопросами можно |
5 | обращаться на наш форум -- board.kolibrios.org. |
||
1737 | clevermous | 6 | |
7 | Общее описание. |
||
8 | |||
9 | В каждый момент времени mtdbg может отлаживать только одну программу. Назовём |
||
10 | такую программу загруженной для отладки. Если никакая программа не загружена, |
||
11 | абсолютное большинство действий по отладке недоступно. |
||
12 | |||
13 | mtdbg управляется командной строкой, вводимой с клавиатуры. Командная строка |
||
14 | изображается в нижней части окна отладчика. Обрабатываются стандартные клавиши |
||
15 | ввода Backspace,Delete,Home,End,стрелки влево/вправо. |
||
16 | Команды нечувствительны к регистру символов. В качестве разделителя |
||
17 | используется произвольное ненулевое число пробелов. |
||
18 | |||
19 | В любой момент отладчик можно завершить командой "quit" (без аргументов). |
||
20 | Впрочем, можно и просто нажать на кнопку закрытия в левом верхнем углу окна. |
||
21 | |||
22 | Запуск отладчика без параметров командной строки приводит к тому, что |
||
23 | никакая программа не загружена. Также mtdbg можно запускать с командной |
||
24 | строкой, в этом случае он попытается загрузить программу с именем, указанным |
||
25 | как первый аргумент командной строки, и параметрами, указанными как |
||
26 | последующие (если они есть). |
||
27 | |||
28 | Если никакая программа не загружена, то можно загрузить программу командой |
||
29 | load <полное имя исполняемого файла> [<аргументы>] |
||
30 | Например: |
||
9583 | vitalkrilo | 31 | load /sys/example |
32 | LOAD /sys/aclock w200 h200 |
||
1737 | clevermous | 33 | LoaD /hd0/1/menuetos/dosbox/dosbox |
34 | Всё, что стоит после первого пробела после имени исполняемого файла, дословно |
||
35 | передаётся программе в качестве командной строки. |
||
36 | Команда load сообщает о результате в окне сообщений (немного выше окна |
||
37 | командной строки). Если программу удалось загрузить, то об этом появится |
||
38 | соответствующее сообщение; если не удалось, то в сообщении будет указана |
||
39 | причина ошибки. Наиболее вероятная - "file not found", если неправильно указано |
||
40 | имя файла. |
||
41 | |||
42 | Отладчик может загружать файлы с информацией об именах в программе (метки, |
||
43 | глобальные переменные) - текстовые файлы, каждая строка которых имеет вид |
||
44 | 0x |
||
45 | (строки, не имеющие такой вид, игнорируются). Такой файл может быть создан |
||
46 | вручную или сгенерирован автоматически при компиляции исходника fasm'ом. |
||
47 | Явная загрузка осуществляется командой |
||
48 | load-symbols <полное имя файла символов> |
||
49 | Кроме того, при выполнении команды load отладчик проверяет наличие файла |
||
50 | с таким же именем, как загружаемый бинарник, и расширением .dbg |
||
9583 | vitalkrilo | 51 | (/sys/example.dbg для первом из примеров выше), и если такой есть, |
1737 | clevermous | 52 | загружает его автоматически (выдавая сообщение "Symbols loaded", если всё в |
53 | порядке). |
||
54 | |||
55 | Может случиться так, что загруженная программа упакована. Общий принцип |
||
56 | упаковки программ следующий: сначала исходный файл пакуется (каким-нибудь |
||
57 | алгоритмом сжатия), потом приписывается небольшой по размеру код, который |
||
58 | получает управление при запуске программы, распаковывает в памяти исходный код, |
||
59 | после чего передаёт ему управление. Если программа упакована, то её "настоящий" |
||
60 | код не виден и для отладки нужно предварительно пройти код распаковщика. |
||
61 | mtdbg определяет большинство существующих упаковщиков (mxp,mxp_lzo,mxp_nrv, |
||
62 | mtappack) и в этом случае предлагает автоматически пройти до "настоящего" кода. |
||
63 | Рекомендуется согласиться (нажать 'y' или |
||
64 | При отказе и в случае, когда программа упакована чем-то неизвестным, можно |
||
65 | использовать команду "unpack" (без аргументов). Вызывайте её только в случае, |
||
66 | когда вы уверены, что программа упакована и что управление ещё не дошло до |
||
67 | основного кода! [Начиная с версии Kolibri 0.6.5.0, весь этот абзац уже |
||
68 | неактуален, поскольку приложения можно упаковывать как любые двоичные файлы |
||
69 | kpack'ом и при этом код распаковщика находится в ядре и распаковка прозрачна |
||
70 | для отладки.] |
||
71 | |||
72 | Загруженную программу можно прибить командой "terminate" (без аргументов). |
||
73 | Команда "detach" (без аргументов) отключается от программы, после чего |
||
74 | программа продолжает выполняться нормально, как если бы отладчика не было. |
||
75 | После обеих этих команд программа перестаёт быть отлаживаемой. |
||
76 | |||
77 | Можно заново загрузить программу для отладки командой "reload" (без |
||
78 | аргументов). Если уже есть загруженная программа, то она прибивается и |
||
79 | запускается (с самого начала) новый экземпляр (с той же командной строкой), |
||
80 | в этом случае команда аналогична командам |
||
81 | terminate |
||
82 | load |
||
83 | В противном случае заново загружается программа, которую отлаживали последней |
||
84 | (в текущем сеансе работы с mtdbg) (с той же командной строкой), т.е. почти то |
||
85 | же самое, что и |
||
86 | load |
||
87 | но команда reload в обоих случаях короче и удобнее; кроме того, load считает, |
||
88 | что загружается новая программа, и переводит окно данных (см. ниже) на |
||
89 | нулевой адрес, а reload сохраняет текущий адрес. |
||
90 | |||
91 | Всегда доступна команда "help", которую можно сокращать до "h". |
||
92 | Все команды разбиты на группы. |
||
93 | help без аргументов показывает список групп команд. |
||
94 | help с указанием группы выводит список команд этой группы с краткими |
||
95 | комментариями. |
||
96 | help с указанием команды выводит информацию о заданной команде. |
||
97 | Например: |
||
98 | help |
||
99 | help control |
||
100 | h LoaD |
||
101 | |||
102 | Окно отладчика состоит из следующих элементов, перечисляемых сверху вниз: |
||
103 | - строка состояния. При наличии загруженной программы показывает ее имя и |
||
104 | состояние ("Running"/"Paused"), при отсутствии сообщает "No program loaded". |
||
105 | - окно регистров - показывает значения регистров общего назначения, регистра |
||
106 | eip и регистра флагов. Последний записан двумя способами: полное hex-значение |
||
107 | и состояния отдельных флагов: CF,PF,AF,ZF,SF,DF,OF: если флаг сброшен, то |
||
108 | изображается маленькая буква, если установлен, то заглавная. |
||
109 | Регистры, изменившиеся с предыдущего момента, подсвечиваются зеленым. |
||
110 | - окно данных (окно дампа) - показывает содержимое памяти загруженной программы |
||
111 | - окно кода (окно дизассемблера) - показывает код программы в виде |
||
112 | дизассемблированных инструкций |
||
113 | - окно сообщений |
||
114 | - окно командной строки |
||
115 | |||
116 | В окне дампа можно просматривать данные, начиная с любого адреса, для этого |
||
117 | есть команда |
||
118 | d <выражение> |
||
119 | Команда d без аргументов пролистывает окно дампа вниз. |
||
120 | То же самое относится к окну кода и команде |
||
121 | u <выражение> |
||
122 | или просто u. |
||
123 | Например: |
||
124 | d esi - показывает данные, находящиеся по адресу esi (например, полезна перед |
||
125 | выполнением инструкции rep movsb) |
||
126 | d esp - показывает стек |
||
127 | u eip - дизассемблирует инструкции, начиная с текущей |
||
128 | |||
129 | Выражения в mtdbg могут включать |
||
130 | - шестнадцатеричные константы |
||
131 | - имена всех регистров общего назначения (8 32-битных, 8 16-битных и |
||
132 | 8 8-битных) и регистра eip; значения 16- и 8-битных регистров расширяются |
||
133 | нулями до 32 бит |
||
134 | - четыре арифметические операции +,-,*,/ (со стандартными приоритетами) и |
||
135 | скобки |
||
136 | - [если есть информация о символах] имена, загруженные из dbg-файла |
||
137 | Все вычисления производятся по модулю 2^32. |
||
138 | Примеры выражений: |
||
139 | eax |
||
140 | eip+2 |
||
141 | ecx-esi-1F |
||
142 | al+AH*bl |
||
143 | ax + 2* bH*(eip+a73) |
||
144 | 3*esi*di/EAX |
||
145 | Команда |
||
146 | ? <выражение> |
||
147 | вычисляет значение указанного выражения. |
||
148 | |||
149 | Значения регистров загруженной программы можно изменять командой r, имеющей |
||
150 | две абсолютно эквивалентные формы: |
||
151 | r <регистр> <выражение> |
||
152 | r <регистр>=<выражение> |
||
153 | (в обоих случаях можно расставлять пробелы по вкусу). В качестве регистра можно |
||
154 | указывать любой из вышеупомянутых - 24 регистра общего назначения и eip. |
||
155 | |||
156 | |||
157 | Допустим, команда load успешно загрузила программу для отладки. |
||
158 | Сразу после загрузки программа приостановлена и не выполняется. |
||
159 | Нажатие Ctrl+F7 (аналог командной строки - команда "s") делает один шаг в |
||
160 | загруженной программе, после чего управление возвращается отладчику, который |
||
161 | показывает новое содержимое регистров и памяти. Системный вызов int 40h |
||
162 | (а также инструкции sysenter и syscall) при этом считается одним шагом. |
||
163 | Нажатие Ctrl+F8 (аналог командной строки - команда "p") также делает шаг в |
||
164 | загруженной программе, но при этом вызовы процедур, строковые операции с |
||
165 | префиксом rep/repz/repnz и циклы loop выполняются как один шаг. |
||
166 | Команды пошагового выполнения используются, как правило, на отдельных участках |
||
167 | программы, когда нужно, например, регулярно отслеживать значения регистров |
||
168 | и/или каких-то переменных в памяти. |
||
169 | Команда |
||
170 | g <выражение> |
||
171 | возобновляет выполнение программы и ждёт, пока управление дойдёт до |
||
172 | eip=соответствующему адресу, а в этот момент приостанавливает программу. |
||
173 | Команда "g" без аргументов просто возобновляет выполнение программы. |
||
174 | |||
175 | Приостановить выполнение программы можно командой "stop" (без аргументов). |
||
176 | |||
177 | Обычно требуется, чтобы программа нормально выполнялась, но при наступлении |
||
178 | определённых условий программа приостанавалась и управление получал отладчик. |
||
179 | Соответствующие условия называются точками останова, breakpoint(s), в |
||
180 | просторечии - бряками. Простейший тип точек останова - на конкретный адрес, |
||
181 | т.е. прерывать выполнение при eip=<заданное значение>. Такие точки останова |
||
182 | устанавливаются командой |
||
183 | bp <выражение> |
||
184 | Замечание. Если есть только одна такая точка останова, удобнее вместо неё |
||
185 | использовать команду "g" с аргументом. |
||
186 | |||
187 | Другой тип точек останова - по обращению к заданному участку памяти. |
||
188 | Таких точек останова может быть не больше четырёх (поскольку используются |
||
189 | аппаратные возможности процессоров x86, где допускаются только 4 таких точки). |
||
190 | bpm <выражение> - брякается на любой доступ к байту по указанному адресу |
||
191 | bpm w <выражение> - брякается на запись байта по указанному адресу |
||
192 | bpmb,bpmw,bpmd <выражение> - брякаются на доступ к соответственно байту, слову |
||
193 | и двойному слову по указанному адресу. bpm и bpmb - синонимы. При использовании |
||
194 | bpmw,bpmd адрес должен быть выровнен соответственно на границу слова (т.е. быть |
||
195 | чётным) или на границу двойного слова (т.е. делиться на 4). |
||
196 | bpmb,bpmw,bpmd w <выражение> - аналогично для бряка на запись. |
||
197 | |||
198 | Список установленных точек останова можно просмотреть командой "bl", информацию |
||
199 | о конкретной точке останова можно получить с помощью "bl <номер>". Ненужные |
||
200 | точки останова удаляются командой "bc <номер>", временно ненужные можно |
||
201 | запретить командой "bd <номер>", когда они станут снова нужны, используйте |
||
202 | команду "be <номер>". |
||
203 | |||
204 | Замечания. |
||
205 | |||
206 | 1. При отладке собственных программ можно вставлять в код инструкции |
||
207 | int3 (обратите внимание на отсутствие пробела!). Такая инструкция вызывает |
||
208 | исключение при нормальном запуске, что приведёт к завершению процесса, |
||
209 | но при работе под отладчиком просто активизируется отладчик (с сообщением |
||
210 | "int3 command at xxx"). Это позволяет не думать о том, какие адреса |
||
211 | использовать в командах g и/или bp. Можно также генерировать файл с |
||
212 | информацией о символах и загружать его, тогда не только нет нужды |
||
213 | самостоятельно вычислять адреса для "g" и "bp", но и "u","d","?" будут |
||
214 | понимать указание имени метки/переменной. |
||
215 | 2. Весь вывод и весь ввод ориентирован на 16-ричную систему счисления. |
||
216 | 3. Когда программа выполняется, окна регистров и данных показывают информацию, |
||
217 | относящуюся к моменту до возобновления; установка значений регистров в |
||
218 | этом режиме невозможна. Впрочем, команда "d" в этом режиме показывает |
||
219 | информацию, верную в момент выдачи команды. |
||
220 | |||
2742 | dunkaist | 221 | diamondномер>номер>номер>номер>выражение>выражение>выражение>выражение>выражение>заданное>выражение>выражение>регистр>выражение>регистр>выражение>выражение>выражение>полное>имя>аргументы>полное> |