Subversion Repositories Kolibri OS

Rev

Rev 8591 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
205 heavyiron 1
Введение.
2
 
8591 Kenshin 3
mtdbg представляет собой интерактивный отладчик для операционной системы KolibriOS. Автор программы - Евгений Гречников (Diamond). Данная документация описывает возможности отладчика и работу с ним. Если у вас есть какие-либо вопросы по работе с программой или нужны какие-то возможности отладчика, которых ещё нет, обращайтесь на форум board.kolibrios.org в соответствующую тему - http://board.kolibrios.org/viewtopic.php?f=45&t=358, или по адресу автора - mailto:diamondz@land.ru.
205 heavyiron 4
 
5
Общее описание.
6
 
8591 Kenshin 7
В каждый момент времени mtdbg может отлаживать только одну программу. Назовём такую программу загруженной для отладки. Если никакая программа не загружена, абсолютное большинство действий по отладке недоступно.
205 heavyiron 8
 
8591 Kenshin 9
mtdbg управляется командной строкой, вводимой с клавиатуры. Командная строка изображается в нижней части окна отладчика. Обрабатываются стандартные клавиши ввода Backspace, Delete, Home, End, стрелки влево/вправо, стрелки вверх/вниз (прокручивание истории команд). Команды нечувствительны к регистру символов. В качестве разделителя используется произвольное ненулевое число пробелов.
205 heavyiron 10
 
8591 Kenshin 11
В любой момент отладчик можно завершить командой "quit" (без аргументов). Впрочем, можно и просто нажать на кнопку закрытия в правом верхнем углу окна.
205 heavyiron 12
 
8591 Kenshin 13
Запуск отладчика без параметров командной строки приводит к тому, что никакая программа не загружена. Также mtdbg можно запускать с командной
14
строкой, в этом случае он попытается загрузить программу с именем, указанным как первый аргумент командной строки, и параметрами, указанными как
205 heavyiron 15
последующие (если они есть).
16
 
8591 Kenshin 17
Если никакая программа не загружена, то можно загрузить программу командой load:
205 heavyiron 18
load <полное имя исполняемого файла> [<аргументы>]
19
Например:
9587 vitalkrilo 20
load /sys/example
21
LOAD   /sys/aclock w200 h200
8591 Kenshin 22
 LoaD  /hd0/1/menuetos/dosbox/dosbox
23
Всё, что стоит после первого пробела после имени исполняемого файла, дословно передаётся программе в качестве командной строки.
24
Команда load сообщает о результате в окне сообщений (немного выше окна командной строки). Если программу удалось загрузить, то об этом появится соответствующее сообщение; если не удалось, то в сообщении будет указана причина ошибки. Наиболее вероятная - "file not found", если неправильно указано имя файла.
542 diamond 25
 
8591 Kenshin 26
Отладчик может загружать файлы с информацией об именах в программе (метки, глобальные переменные) - текстовые файлы, каждая строка которых имеет вид 0x <имя> (строки, не имеющие такой вид, игнорируются). Такой файл может быть создан вручную или сгенерирован автоматически при компиляции исходника fasm'ом.
27
Явная загрузка осуществляется командой load-symbols:
542 diamond 28
load-symbols <полное имя файла символов>
9587 vitalkrilo 29
Кроме того, при выполнении команды load отладчик проверяет наличие файла с таким же именем, как загружаемый бинарник, и расширением .dbg (/sys/example.dbg для первого из примеров выше), и если такой есть, загружает его автоматически (выдавая сообщение "Symbols loaded", если всё в
542 diamond 30
порядке).
31
 
8591 Kenshin 32
Может случиться так, что загруженная программа упакована. Общий принцип упаковки программ следующий: сначала исходный файл пакуется (каким-нибудь алгоритмом сжатия), потом приписывается небольшой по размеру код, который получает управление при запуске программы, распаковывает в памяти исходный код, после чего передаёт ему управление. Если программа упакована, то её "настоящий" код не виден и для отладки нужно предварительно пройти код распаковщика. mtdbg определяет большинство существующих упаковщиков (mxp, mxp_lzo, mxp_nrv, mtappack) и в этом случае предлагает автоматически пройти до "настоящего" кода. Рекомендуется согласиться (нажать 'y' или ), но можно и отказаться. При отказе и в случае, когда программа упакована чем-то неизвестным, можно использовать команду "unpack" (без аргументов). Вызывайте её только в случае,
33
когда вы уверены, что программа упакована и что управление ещё не дошло до основного кода! [Начиная с версии Kolibri 0.6.5.0, весь этот абзац уже неактуален, поскольку приложения можно упаковывать как и любые двоичные файлы kpack'ом и при этом код распаковщика находится в ядре и распаковка прозрачна для отладки.]
205 heavyiron 34
 
8591 Kenshin 35
Загруженную программу можно прибить командой "terminate" (без аргументов). Команда "detach" (без аргументов) отключается от программы, после чего программа продолжает выполняться нормально, как если бы отладчика не было. После обеих этих команд программа перестаёт быть отлаживаемой.
205 heavyiron 36
 
8591 Kenshin 37
Можно заново загрузить программу для отладки командой "reload" (без аргументов). Если уже есть загруженная программа, то она прибивается и
38
запускается (с самого начала) новый экземпляр (с той же командной строкой), в этом случае команда аналогична командам:
205 heavyiron 39
terminate
40
load  
8591 Kenshin 41
В противном случае заново загружается программа, которую отлаживали последней (в текущем сеансе работы с mtdbg) (с той же командной строкой), т.е. почти то же самое, что и load  , но команда reload в обоих случаях короче и удобнее; кроме того, load считает, что загружается новая программа, и переводит окно данных (см. ниже) на нулевой адрес, а reload сохраняет текущий адрес.
205 heavyiron 42
 
43
Всегда доступна команда "help", которую можно сокращать до "h".
44
Все команды разбиты на группы.
45
help без аргументов показывает список групп команд.
46
help с указанием группы выводит список команд этой группы с краткими
47
комментариями.
48
help с указанием команды выводит информацию о заданной команде.
49
Например:
50
help
51
help control
52
h LoaD
53
 
54
Окно отладчика состоит из следующих элементов, перечисляемых сверху вниз:
8591 Kenshin 55
- строка состояния. При наличии загруженной программы показывает ее имя и состояние ("Running"/"Paused"), при отсутствии сообщает "No program loaded".
56
- окно регистров - показывает значения регистров общего назначения, регистра eip, регистра флагов и регистров FPU/MMX. Регистр флагов отображается двумя способами: полное hex-значение и состояния отдельных флагов: CF,PF,AF,ZF,SF,DF,OF: если флаг сброшен, то изображается маленькая буква, если установлен, то заглавная. Регистры, изменившиеся с предыдущего момента, подсвечиваются оранжевым.
205 heavyiron 57
- окно данных (окно дампа) - показывает содержимое памяти загруженной программы
8591 Kenshin 58
- окно кода (окно дизассемблера) - показывает код программы в виде дизассемблированных инструкций
205 heavyiron 59
- окно сообщений
60
- окно командной строки
61
 
8591 Kenshin 62
В окне дампа можно просматривать данные, начиная с любого адреса, для этого есть команда:
205 heavyiron 63
d <выражение>
8591 Kenshin 64
Команда d без аргументов пролистывает окно дампа вниз. То же самое относится к окну кода и команде u <выражение> или просто u.
205 heavyiron 65
Например:
8591 Kenshin 66
d esi - показывает данные, находящиеся по адресу esi (например, полезна перед выполнением инструкции rep movsb)
205 heavyiron 67
d esp - показывает стек
68
u eip - дизассемблирует инструкции, начиная с текущей
69
 
70
Выражения в mtdbg могут включать
71
- шестнадцатеричные константы
8591 Kenshin 72
- имена всех регистров общего назначения (8 32-битных, 8 16-битных и 8 8-битных) и регистра eip; значения 16- и 8-битных регистров расширяются
205 heavyiron 73
  нулями до 32 бит
8591 Kenshin 74
- четыре арифметические операции +,-,*,/ (со стандартными приоритетами) и скобки
542 diamond 75
- [если есть информация о символах] имена, загруженные из dbg-файла
205 heavyiron 76
Все вычисления производятся по модулю 2^32.
77
Примеры выражений:
78
eax
79
eip+2
80
ecx-esi-1F
81
al+AH*bl
82
ax + 2* bH*(eip+a73)
83
3*esi*di/EAX
84
Команда
8591 Kenshin 85
? <выражение> вычисляет значение указанного выражения.
205 heavyiron 86
 
8591 Kenshin 87
Значения регистров загруженной программы можно изменять командой r, имеющей две абсолютно эквивалентные формы:
205 heavyiron 88
r <регистр> <выражение>
89
r <регистр>=<выражение>
8591 Kenshin 90
(в обоих случаях можно расставлять пробелы по вкусу). В качестве регистра можно указывать любой из вышеупомянутых - 24 регистра общего назначения и eip.
205 heavyiron 91
 
92
 
8591 Kenshin 93
Допустим, команда load успешно загрузила программу для отладки. Сразу после загрузки программа приостановлена и не выполняется.
94
Нажатие F7 (аналог командной строки - команда "s") делает один шаг в загруженной программе, после чего управление возвращается отладчику, который показывает новое содержимое регистров и памяти. Системный вызов int 40h (а также инструкции sysenter и syscall) при этом считается одним шагом.
95
Нажатие F8 (аналог командной строки - команда "p") также делает шаг в загруженной программе, но при этом вызовы процедур, строковые операции с
205 heavyiron 96
префиксом rep/repz/repnz и циклы loop выполняются как один шаг.
8591 Kenshin 97
Команды пошагового выполнения используются, как правило, на отдельных участках программы, когда нужно, например, регулярно отслеживать значения регистров и/или каких-то переменных в памяти.
98
Команда g <выражение> возобновляет выполнение программы и ждёт, пока управление дойдёт до eip=соответствующему адресу, и в этот момент приостанавливает программу. Команда "g" без аргументов просто возобновляет выполнение программы.
205 heavyiron 99
 
100
Приостановить выполнение программы можно командой "stop" (без аргументов).
101
 
8591 Kenshin 102
Обычно требуется, чтобы программа нормально выполнялась, но при наступлении определённых условий программа приостанавалась и управление получал отладчик. Соответствующие условия называются точками останова, breakpoint(s), в просторечии - бряками. Простейший тип точек останова - на конкретный адрес, т.е. прерывать выполнение при eip=<заданное значение>. Такие точки останова устанавливаются командой:
205 heavyiron 103
bp <выражение>
8591 Kenshin 104
Замечание. Если есть только одна такая точка останова, удобнее вместо неё использовать команду "g" с аргументом.
205 heavyiron 105
 
8591 Kenshin 106
Другой тип точек останова - по обращению к заданному участку памяти. Таких точек останова может быть не больше четырёх (поскольку используются
205 heavyiron 107
аппаратные возможности процессоров x86, где допускаются только 4 таких точки).
108
bpm <выражение> - брякается на любой доступ к байту по указанному адресу
109
bpm w <выражение> - брякается на запись байта по указанному адресу
8591 Kenshin 110
bpmb/bpmw/bpmd <выражение> - брякаются на доступ к соответственно байту, слову и двойному слову по указанному адресу. bpm и bpmb - синонимы. При использовании bpmw/bpmd адрес должен быть выровнен соответственно на границу слова (т.е. быть чётным) или на границу двойного слова (т.е. делиться на 4).
205 heavyiron 111
bpmb,bpmw,bpmd w <выражение> - аналогично для бряка на запись.
112
 
8591 Kenshin 113
Список установленных точек останова можно просмотреть командой "bl", информацию о конкретной точке останова можно получить с помощью "bl <номер>". Ненужные точки останова удаляются командой "bc <номер>", временно ненужные можно запретить командой "bd <номер>", когда они станут снова нужны, используйте команду "be <номер>".
205 heavyiron 114
 
115
Замечания.
116
 
8591 Kenshin 117
1. При отладке собственных программ можно вставлять в код инструкции int3 (обратите внимание на отсутствие пробела!). Такая инструкция вызывает исключение при нормальном запуске, что приведёт к завершению процесса, но при работе под отладчиком просто активизируется отладчик (с сообщением "int3 command at xxx"). Это позволяет не думать о том, какие адреса использовать в командах g и/или bp. Можно также генерировать файл с информацией о символах и загружать его, тогда не только нет нужды самостоятельно вычислять адреса для "g" и "bp", но и "u","d","?" будут понимать указание имени метки/переменной.
205 heavyiron 118
2. Весь вывод и весь ввод ориентирован на 16-ричную систему счисления.
8591 Kenshin 119
3. Когда программа выполняется, окна регистров и данных показывают информацию, относящуюся к моменту до возобновления; установка значений регистров в этом режиме невозможна. Впрочем, команда "d" в этом режиме показывает информацию, верную в момент выдачи команды.
205 heavyiron 120