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