Subversion Repositories Kolibri OS

Rev

Rev 2742 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1737 clevermous 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
0x <имя>
47
(строки, не имеющие такой вид, игнорируются). Такой файл может быть создан
48
вручную или сгенерирован автоматически при компиляции исходника fasm'ом.
49
Явная загрузка осуществляется командой
50
load-symbols <полное имя файла символов>
51
Кроме того, при выполнении команды load отладчик проверяет наличие файла
52
с таким же именем, как загружаемый бинарник, и расширением .dbg
53
(/rd/1/example.dbg для первом из примеров выше), и если такой есть,
54
загружает его автоматически (выдавая сообщение "Symbols loaded", если всё в
55
порядке).
56
 
57
Может случиться так, что загруженная программа упакована. Общий принцип
58
упаковки программ следующий: сначала исходный файл пакуется (каким-нибудь
59
алгоритмом сжатия), потом приписывается небольшой по размеру код, который
60
получает управление при запуске программы, распаковывает в памяти исходный код,
61
после чего передаёт ему управление. Если программа упакована, то её "настоящий"
62
код не виден и для отладки нужно предварительно пройти код распаковщика.
63
mtdbg определяет большинство существующих упаковщиков (mxp,mxp_lzo,mxp_nrv,
64
mtappack) и в этом случае предлагает автоматически пройти до "настоящего" кода.
65
Рекомендуется согласиться (нажать 'y' или ), но можно и отказаться.
66
При отказе и в случае, когда программа упакована чем-то неизвестным, можно
67
использовать команду "unpack" (без аргументов). Вызывайте её только в случае,
68
когда вы уверены, что программа упакована и что управление ещё не дошло до
69
основного кода! [Начиная с версии Kolibri 0.6.5.0, весь этот абзац уже
70
неактуален, поскольку приложения можно упаковывать как любые двоичные файлы
71
kpack'ом и при этом код распаковщика находится в ядре и распаковка прозрачна
72
для отладки.]
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
- четыре арифметические операции +,-,*,/ (со стандартными приоритетами) и
137
  скобки
138
- [если есть информация о символах] имена, загруженные из dbg-файла
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
загруженной программе, после чего управление возвращается отладчику, который
163
показывает новое содержимое регистров и памяти. Системный вызов int 40h
164
(а также инструкции sysenter и syscall) при этом считается одним шагом.
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"). Это позволяет не думать о том, какие адреса
213
   использовать в командах g и/или bp. Можно также генерировать файл с
214
   информацией о символах и загружать его, тогда не только нет нужды
215
   самостоятельно вычислять адреса для "g" и "bp", но и "u","d","?" будут
216
   понимать указание имени метки/переменной.
217
2. Весь вывод и весь ввод ориентирован на 16-ричную систему счисления.
218
3. Когда программа выполняется, окна регистров и данных показывают информацию,
219
   относящуюся к моменту до возобновления; установка значений регистров в
220
   этом режиме невозможна. Впрочем, команда "d" в этом режиме показывает
221
   информацию, верную в момент выдачи команды.
222
 
223
						diamond
224
						mailto:diamondz@land.ru