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