Дебаг это


Привет, юный хакер! Ты уже многое знаешь, но крутой хакер никогда не останавливается на достигнутом. Эта статья посвящена работе с стандартным дебаггером системы ДОС. Ты скажешь: «На кой фиг мне это надо мне, крутому перцу?». 
Представь ситуацию: ты приходишь в компьютерный клуб (интернет-кафе, к другу домой), а там на тачке дисководы сняты, сидюки заклеены, а пакость сделать все же хочется. Естественно, на любом «нормальном» компе нет никаких компиляторов С, ассемблеров… но почти на каждом «нормальном» компе есть ДОС! Да, именно ДОС, и его последователи — Винды всех типов а конкретнее программа
DEBUG.

Как? Набрать короткую (если времени мало, да и сил жалко), но неприятную программку, сохранить ее на диске и потом запустить, получив моральное удовлетворение. Посмотрим, как это делается, но для начала изучим несколько простых, но весьма полезных команд.

Итак, вы запустили программу DEBUG

Первая команда –D (dump) <adress>.

Эта команда позволяет просмотреть некоторую область памяти, адрес которой задан в параметре <adress> в формате сегмент:смещение.

Для начала посмотрим ПЗУ BIOS:

-d F000:E000


Дебаг это

Здесь вы видите фирму-производителя вашей
BIOS. А по адресу:

-d F000:EC6C

Дебаг это

получаем интересную информацию о системе,
такую как дата создания БИОС, чипсет… А по данному адресу
(0000:046C) находится таймер БИОС. Отчетливо видно, что значения все время меняются.
Для программиста удобно просматривать сегменты команд, данных и стека (CS, DS и SS, соответственно).

-d DS:0000

Дебаг это

Выше мы видим содержимое сегмента данных, т. е.
значения определенных переменных.

-d CS:100

Дебаг это

А тут представлено содержимое сегмента команд, т.е. машинные коды команд, готовых к исполнению.
Освоив команды просмотра памяти, впоследствии мы сможем эффективно отлаживать наши программы и просматривать введенный нами код перед исполнением (для нас сейчас это приоритетная задача).

Еще одна важная команда -R (register) <register name>, позволяющая просматривать состояние конкретного регистра и изменять его состояние или же сразу перейти к первой выполняемой команде с просмотром всех регистров.


-r AX

AX 1203
: 0

В данном фрагменте мы просматриваем регистр АХ и очищаем его (пишем в него 0).
Чтобы перейти к первой выполняемой команде (по адресу CS:100):

-r

AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000
SI=0000 DI=0000 
DS=3B9A ES=3B9A SS=3B9A CS=3B9A IP=0100 NV UP EI PL NZ NA PO NC 
3B9A:0100 E82421 CALL 2227

Третья команда –E (enter) Addres <command list>.

Предназначена она для изменения значений в
памяти – с помощью нее можно уже вводить команды в машинных кодах. Замечание: при вводе данных сначала пишется младший байт
(по младшему адресу), затем – старший (по старшему), т. е. 
чтобы записать по адресу DS:0000 число 1234h необходимо ввести:

-E DS:0000 34 12

Например введем следующее:

-E cs:100 B8 34 12
-D CS:100

Дебаг это

А с помощью команды U (unassemble) <starting address>, <ending adress> дизассемблируем введенные команды и получим:
-U CS:100,102
3B9A:0100 B83412 MOV AX,1234

Таким же образом можно дизассемблировать любой участок памяти, что очень полезно.
Но вместо ввода команд на машинном языке, можно воспользоваться встроенным
ассемблером программы DEBUG. Для этого существует команда
-A (assemble) <adress>. С помощью этой команды вы можете написать уже нормальную программку на ассемблере, выполняющую необходимые действия.:


-A 
0B3B:0100 mov ax,1234
0B3B:0103 mov ah, 4c
0B3B:0105 int 21
0B3B:0107

А как же теперь сохранить программу на диске? Сначала задается имя файла:

-N my_file.com

Затем в регистр СХ необходимо поместить размер программы в байтах. Он будет равен разности конечного и начального смещений. Теперь остается только осуществить запись на диск командой W и в результате увидеть записанное количество байтов. В итоге мы получаем программу, готовую к исполнению. Выход осуществляется командой q. Пример:

-A 
0B3B:0100 mov ax,1234
0B3B:0103 mov ah, 4c
0B3B:0105 int 21
0B3B:0107 
-u CS:100, 106
0B3B:0100 B83412 MOV AX,1234 
0B3B:0103 B44C MOV AH,4C 
0B3B:0105 CD21 INT 21 
-r cx
CX 0000
:7
-r
AX=0000 BX=0000 CX=0007 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 
DS=0B3B ES=0B3B SS=0B3B CS=0B3B IP=0100 NV UP EI PL NZ NA PO NC 
0B3B:0100 B83412 MOV AX,1234 
-N my.com
-W
Запись 00007 байт
-q

В заключение можно сказать, что данный способ создания программ открывает новые возможности для любителей компьютерных пакостей, приколов, да и просто программистов-любителей – ведь теперь для создания небольших программ, вместо установки компиляторов, можно воспользоваться стандартными средствами системы, а DEBUG входит в поставку во все Винды вплоть до ХР. Я думаю, что это поможет вам веселее провести время за чужим компом, вызывая истинное удивление хозяина (дисков и дискет-то вы не приносили!!!) новыми эффектами работы его оборудования. Успехов, юные любители хакерного экстрима!


xakep.ru

 

Debug.exe ‑ программа отладчик ,которую используют для проверки и отладки выполняемых файлов.

Использовалась при операционной системе MS-DOS. Под более поздние версии операционных систем

работает через эмулятор MS-DOS и имеет ограниченные возможности. Вызывается через командную сроку

 

DEBUG

 

или

 

DEBUG [[диск:][маршрут]имя_файла [параметры]].

 

Например: DEBUG C:…My.com

 

Данная программа является консольным приложением и предназначена для создания или изменения кода файлов. С помощью неё можно создавать простые приложение под MS-DOS и отслеживать их работу. Данный отладчик находится на самом низком уровне компиляторов assembler. Но обладает неплохими возможностями, такими как просмотр и изменение памяти, получение состояния регистров.

 

Команды debug.exe

 

Правила набора команд debug.exe:


 

· В debug.exe не различается регистр букв.

· Пробелы в командах используется только для разделения параметров.

· Вводимые числа должны быть в шестнадцатеричной системе счисления, причем без завершающей буквы h.

· Сегмент и смещение записываются с использованием двоеточия, в формате сегмент:смещение, например, CS:3C1 (смещение 3C1h в сегменте кода) или 40:17 (смещение 17h в сегменте, адрес начала которого — 40[0]h).

 

После загрузки отладчика на экране появится приглашение, выглядящее в виде дефиса. Регистры CS, DS, ES, SS в этот момент инициализированы адресом 256-байтного префикса сегмента программы, а рабочая область в памяти будет начинаться с адреса этого префикса + 100h. Команды debug.exe вводятся сразу после приглашения на месте, которое отмечено курсором. Каждая команда состоит из идентификатора и параметров, идентификатор состоит из одной буквы.

 

Таблица 1. Краткая таблица всех команд debug.exe




Команда Описание Формат
A (Assemble) Транслирование команд ассемблера в машинный код; адрес по умолчанию — CS:0100h. A [<адрес_начала_кода>]
C (Compare) Сравнение содержимого двух областей памяти; по умолчанию используется DS. В команде указывается либо длина участков, либо диапазон адресов. C <начальный_адрес_1> L<длина> <начальный_адрес_2> C <начальный_адрес_1> <конечный_адрес_1> <начальный_адрес_2>
D (Display/Dump) Вывод содержимого области памяти в шестнадцатеричном и ASCII-форматах. По умолчанию используется DS; можно указывать длину или диапазон. D [<начальный_адрес> [L<длина>]] D [начальный_адрес конечный_адрес]
E (Enter) Ввод в память данные или инструкции машинного кода; по умолчанию используется DS. E [<адрес> [<инструкции/данные>]]
F (Fill) Заполнение области памяти данными из списка; по умолчанию используется DS. Использовать можно как длину, так и диапазон. F <начальный_адрес_1> L<длина> ‘<данные>’ F <начальный_адрес> <конечный_адрес> ‘<данные>’
G (Go) Выполнение отлаженной программы на машинном языке до указанной точки останова; по умолчанию используется CS. При этом убедитесь, что IP содержит корректный адрес. G [=<начальный_адрес>] <адрес_останова> [<адрес_останова> …]
H (Hexadecimal) Вычисление суммы и разности двух шестнадцатеричных величин. H <величина_1> <величина_2>
I (Input) Считывание и вывод одного байта из порта. I <адрес_порта>
L (Load) Загрузка файла или данных из секторов диска в память; по умолчанию — CS:100h. Файл можно указать с помощью команды N или аргумента при запуске debug.exe. L [<адрес_в_памяти_для_загрузки>] L [<адрес_в_памяти_для_загрузки> [<номер_диска> <начальный_сектор> <количество_секторов>]]
M (Move) Копирование содержимого ячеек памяти; по умолчанию используется DS. Можно указывать как длину, так и диапазон. M <начальный_адрес> L<длина> <адрес_назначения> M <начальный_адрес> <конечный_адрес> <адрес_назначения>
N (Name) Указание имени файла для команд L и W. N <имя_файла>
O (Output) Отсылка байта в порт. O <адрес_порта> <байт>
P (Proceed) Выполнение инструкций CALL, LOOP, INT или повторяемой строковой инструкции с префиксами REPnn, переходя к следующей инструкции. P [=<адрес_начала>] [<количество_инструкций>]
Q (Quit) Завершение работы debug.exe. Q
R (Register) Вывод содержимого регистров и следующей инструкции. R <имя_регистра>
S (Search) Поиск в памяти символов из списка; по умолчанию используется DS. Можно указывать как длину, так и диапазон. S <начальный_адрес> L<длина> ‘<данные>’ S <начальный_адрес> <конечный_адрес> ‘<данные>’
T (Trace) Пошаговое выполнение программы. Как и в команде P, по умолчанию используется пара CS:IP. Замечу, что для выполнения прерываний лучше пользоваться командой P. T [=<адрес_начала>] [<количество_выполняемых_команд>]
U (Unassemble) Дизассемблирование машинного кода; по умолчанию используется пара CS:IP. К сожалению, debug.exe некорректно дизассемблирует специфические команды процессоров 80286+, хотя они все равно выполняются корректно. U [<начальный_адрес>] U [<начальный_адрес конечный_адрес>]
W (Write) Запись файла из debug.exe; необходимо обязательно задать имя файла командой N, если он не был загружен. А программы записываются только в виде файлов .COM! W [<адрес> [<номер_диска> <начальный_сектор> <количество_секторов>]]

 

Просмотр областей памяти

 

Рассмотрим подробно работу команды D, позволяющей просматривать содержимое отдельных областей памяти. Этот пример использует команду D для просмотра области памяти, начиная с 0159:0240:


 

 

Здесь на запрос просмотра участка памяти мы получили восемь строк, в которых указано содержимое выбранной области памяти. Каждая строка состоит из трех частей:

· Адрес первого слева показанного байта в формате сегмент:смещение.

· Шестнадцатеричное представление параграфа (16 байт), начинающегося с указанного в начале строки байта.

· Символы этого же параграфа в ASCII-формате.

 

Адрес, указанный в строке, относится исключительно к первому байту в параграфе, а адреса последующих байтов следует вычислять самостоятельно. Шестнадцатеричное представление содержит по два знака в каждом байте, а сами байты разделены пробелами для облегчения чтения. Кроме того, следует отметить, что восьмой и девятый байты разделены дефисом, разделяя тем самым параграф на две части и облегчая вычисление адресов байтов в параграфе.

 

Полезные приемы с командой D

 

Проверка параллельных и последовательных портов

 

Первые 16 байт области данных BIOS содержат адреса параллельных и последовательных портов. Поэтому с помощью следующей команды можно проверить эти порты:

 

-d 40:00

 

Первые выведенные восемь байтов указывают на адреса последовательных портов COM1-COM4. Следующие 8 байтов указывают на адреса параллельных портов LPT1-LPT4. Например, если на вашем компьютере есть один параллельный порт, то первые два байта будут, скорее всего, такими: 7803. Адрес порта записывается в обращенной последовательности, т.е. 0378.


 

Проверка оборудования

 

Первые два байта, располагающиеся в BIOS по адресу 410h, содержат информацию об установленном в системе оборудовании. Находим эти байты командой:

 

-d 40:10

 

Предположим, что первые два байта окажутся 23 44. Расшифруем эти байты для получения информации об установленных устройствах. Для этого обратим эти байты (44 23), затем переведем их в двоичную систему счисления. Получаем:

 

Значение бита
Позиция бита

 

Что означают эти биты? Продолжаем расшифровывать:

 

Биты Устройство
15, 14 Число параллельных портов (01 = 1 порт, …)
11, 10, 9 Число последовательных портов (…, 010 = 2 порта, …)
7, 6 Число дисководов (00 = 1 дисковод, 01 = 2, 10 = 3, 11 = 4)
5, 4 Начальный видеорежим (01 = 40х25 цветной, 10 = 80х25 цветной, 11 = 80х25 монохромный)
Присутствие математического сопроцессора (0 = нет, 1 = есть)
Наличие привода для дискет (0 = нет, 1 = есть)

 

Проверка состояния регистра клавиатуры

 

В области данных BIOS по адресу 417h находится первый байт, который хранит состояние регистра клавиатуры. Выключаем Num Lock и Caps Lock, затем набираем команду:

 

-d 40:17

 

Первый байт будет равен 00. Включив Num Lock и Caps Lock, снова выполняем команду. Теперь первый байт должен равняться 60. Опытным путем установлено, что при включенном Num Lock первый байт равен 20, а при Caps Lock — 40.

 

Проверка состояния видеосистемы

 

По адресу 449h в BIOS находится первая область видеоданных. Для проверки набираем:

 

-d 40:49

 

Первый байт показывает текущий видеорежим (к примеру, 03 — цветной), а второй — число столбцов (например, 50 — режим с 80 столбцами). Число строк можно найти по адресу 484h (40:84).

 

Проверка копирайта BIOS и серийного номера

 

Сведения об авторских правах на BIOS встроены в ROM BIOS по адресу FE00:0. Строку с копирайтом можно легко найти в ASCII-последовательности, а серийный номер ‑ в виде шестнадцатеричного числа. Хотя, строка с указанием авторских прав может быть длинной и не умещаться в выведенную область памяти. В таком случае следует просто ввести еще раз D.

 

Проверка даты произвоства BIOS

 

Эта дата также записана в ROM BIOS начиная с адреса FFFF:5. После выполнения соответствующей команды в ASCII-последовательности будет находиться эта дата, записанная в формате мм/дд/гг.

 

Непосредственный ввод программы в память с помощью debug.exe

 

debug.exe позволяет вводить программу непосредственно в память машины, а затем следить и управлять е выполнением. Мы будем вводить программу в машинных кодах, используя команду E. При этом будьте бдительны ‑ ввод ошибочных данных по ошибочному адресу чреват непредсказуемыми последствиями! Хотя к серьезным проблемам в системе это вряд ли приведет, но потерять все данные, введенные в debug.exe, можно запросто. Программа, которую необходимо ввести, использует данные, заложенные непосредственно в теле инструкций. Далее показан листинг программы на Ассемблере, в комментариях указаны аналоги команд языка в машинных кодах, а также объяснение каждой команды. Заметьте, что в числах нет символа h, поскольку, как было сказано выше, debug.exe понимает только числа в шестнадцатеричной системе.

 

MOV AX, 0123 ; код B82301: заносим значение 0123h в AX

ADD AX, 0025 ; код 052500: прибавляем 0225h к значению AX

MOV BX, AX ; код 8BD8: заносим значение AX в BX

ADD BX, AX ; код 03D8: прибавляем значение AX к BX

MOV CX, BX ; код 8BCB: заносим значение BX в CX

SUB CX, AX ; код 2BC8: отнимаем значение AX из CX

SUB AX, AX ; код 2BC0: очищаем AX

JMP 100 ; код EBEE: переходим к началу программы

 

Как можно заметить, каждая машинная инструкция имеет длину от 1 до 3 байтов. Первый байт указывает операцию, последующие ‑ ее операнды. Исполнение программы начинается соответственно с первой инструкции и последовательно проходит через все инструкции одну за другой. Теперь можно ввести программу в память. Разделим машинный код на три части по шесть байт и введем каждую, используя команду E и начиная с адреса CS:100.

 

Дебаг это

 

Теперь, когда программа введена в память, попробуем управлять ее выполнением. Для начала проверим текущее состояние регистров и флагов, для этого вводим команду R. Отладчик выведет содержимое регистров в шестнадцатеричной форме; на разных машинах содержимое регистров может различаться.

 

Дебаг это

 

Итак, как можно видеть, debug.exe инициализировал сегменты DS, ES, SS, CS одним и тем же адресом. Регистр IP содержит 0100, указывая на то, что инструкции выполняются со смещения 100h относительно CS (а мы, вводя инструкции в память, как раз указали этот адрес).

Здесь же указаны и значения флагов переполнения, направления, прерывания, знака, нуля, дополнительного переноса, четности и переноса:

 

Значение Описание
NV Отсутствие переполнения
UP Направление вверх или вправо
EI Разрешение прерываний
PL Положительный знак
NZ Ненулевое значение
NA Отсутствие дополнительного переноса
PO Нечетное слово
NC Отсутствие переноса

 

После регистров и состояния флагов debug.exe выводит информацию о первой инструкции, которая будет выполняться:

· Адрес инструкции, в нашем случае это 0B12:0100, где 0B12 ‑ адрес сегмента кода.

· Машинный код, соответствующей этой инструкции (B82301).

· Собственно инструкция, записанная на ассемблере (MOV AX,0123).

 

Теперь, после анализа содержимого регистров и флагов, давайте перейдем к выполнению программы. Выполнять программу мы будем пошагово, используя команду T. Использовав в первый раз команду T, мы выполняем инструкцию MOV. Здесь машинный код операнда инструкции ‑ 2301. Операция помещает 23 в AL (младшая половина AX), а 01 ‑ в AH (старшая). После этого debug.exe снова выводит информацию о регистрах:

 

 

Теперь AX содержит 0123h, IP0103h (следовательно, длина выполненной инструкции: 0103h0100h = 3 байта), а в качестве следующей инструкции указана операция ADD. Так, раз за разом выполняя команду T, мы дойдем до последней инструкции JMP 100. Она установит регистр IP в 100h, и debug.exe вернется к началу программы. Возвращаясь к началу программы, следует заметить, что в DS, ES, SS и CS содержится один и тот же адрес. Дело в том, что debug.exe рассматривает введенные программы исключительно как программы .COM. А в программах .COM, в отличие от .EXE, стек, код и данные хранятся в одном сегменте.

 

Ассемблирование и дизассемблирование

 

В прошлом примере мы вводили программу в машинных кодах, однако, debug.exe вполне способен понимать инструкции, записанные на ассемблере. Для работы с такими программами в debug.exe используются команды A и U.

Команда A запрашивает инструкции на ассемблере и преобразовывает их в машинный код. Для начала инициализируем начальный адрес для ввода инструкций (100h):

 

-a 100

 

Отладчик выведет адрес сегмента кода и смещения (например, 13F2:0100). Теперь мы должны ввести следующие инструкции на ассемблере в память, после каждой строки нажимая Enter:

 

MOV CL, 42

MOV DL, 2A

ADD CL, DL

JMP 100

 

После ввода последней инструкции нажимаем Enter дважды, чтобы указать отладчику, что мы закончили вводить текст программы. Теперь программу можно запускать, используя команды R для просмотра регистров и T для трассировки. Замечу, что в своих программах при наличии инструкций INT их следует обрабатывать не командой T, а командой P, которая обрабатывает все прерывание сразу.

 

Перейдем к процедуре дизассемблирования, а в качестве примера возьмем только что введенную программу. Используем адреса первой и последней инструкций для указания диапазона, который мы собираемся дизассемблировать, т.е. 100h и 107h.

 

-u 100, 107

 

После выполнения этой команды debug.exe выведет инструкции, находящиеся в указанном диапазоне, на ассемблере, в машинных кодах, а также адрес каждой инструкции:

 

Дебаг это

 

Сохранение программы на диске

 

Сначала задается имя файла:

 

-N my_file.com

 

Затем в регистр СХ необходимо поместить размер программы в байтах. Он будет равен разности конечного и начального смещений. Теперь остается только осуществить запись на диск командой W и в результате увидеть записанное количество байтов. В итоге мы получаем программу, готовую к исполнению.

Выход осуществляется командой q. Пример:

 

-A

0B3B:0100 mov ax,1234

0B3B:0103 mov ah, 4c

0B3B:0105 int 21

0B3B:0107

-u CS:100, 106

0B3B:0100 B83412 MOV AX,1234

0B3B:0103 B44C MOV AH,4C

0B3B:0105 CD21 INT 21

-r cx

CX 0000

:7

-r

AX=0000 BX=0000 CX=0007 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=0B3B ES=0B3B SS=0B3B CS=0B3B IP=0100 NV UP EI PL NZ NA PO NC

0B3B:0100 B83412 MOV AX,1234

-N my.com

-W

Запись 00007 байт

-q

 

Для выполнения этой лабораторной работы понадобится несколько команд ассемблера:

 

— MOV AH,<шестнадцатиричное число> — запись в регистр AH числа 02 для указания системной функции — вывод символа на экран;

 

— MOV DL,<шестнадцатиричное число> — запись в регистр DL кода символа;

 

— INT 21 — основное прерывание DOS (процедура), реализующее много различных функций; номер функции записывается предварительно в регистр AH; для распечатки символа на экране — в регистре AH функция 02, при этом в DL записывают предварительно код символа.

 

— INT 20 — прерывание DOS, осуществляющее выход из программы (из .COM-программы).

 

Пример:

 

Вывести символ "*" на экран.

 

mov AH,02 ; системная функция 02 — вывод символа на экран

mov DL,2A ; ASCII-код звездочки

int 21h ; прерывание для вывода "*"

int 20h ; выход из программы

 

Практическое задание

 

Цель

Знакомство с отладчиком debug.exe. Получение практических навыков работы с данной программой.

 

Оборудование:

Персональный компьютер под управлением операционной системы Windows.

 

Программное обеспечение:

Программа Debug.

 

Вопросы к допуску

 

1. Для чего предназначена программа Debug?

2. Как запустить эту программу?

3. Каким образом вводятся команды в Debug?

4. Что такое идентификатор?

5. Как производится ввод программы в Debug?

 

Задание

 

· Изучить теоретический материал.

· Проделать описанные по ходу текста команды.

· Найдите сумму и разность 2-х чисел: 1-е число — номер в группе (переведенное в шестнадцатиричную форму), 2-е — число, противоположное номеру первой буквы фамилии в алфавите (отрицательное число в дополнительном коде). Сумму и разность переведите в десятичную форму.

· Просмотрите содержимое регистров микропроцессора, а также флагов и выпишите их в протокол. Какую функцию выполняет каждый из регистров? .

· Запишите в регистр AX первое число (из задания 3), а в регистр BX — второе (из задания 3). Введите в оперативную память в сегмент кода (смещение 100) машинную команду сложения регистров AX и BX. Просмотрите на экране ее ассемблерную форму. Выполните эту команду, результат переведите в десятичную форму.

· Введите в оперативную память в сегмент кода (смещение 100) набор команд ассемблера для распечатки символа на экране — первой буквы вашей фамилии. Проверьте программу в DEBUG. Затем запишите ее на диск в виде .COM-файла. Чему равен размер программы? Запустите ее на выполнение из DOS.

· Все действия опишите в отчете.

 

Содержание отчета:

 

1. Название работы.

2. Цель работы.

3. Приборы и оборудование.

4. Краткие теоретические сведения.

5. Описание проделанных действий.

6. Текст созданной программы.

7. Выводы.

 

Контрольные вопросы

 

1. Какая команда производит ввод в память данные или инструкции машинного кода?

2. Как сравнить содержимое двух областей памяти?

3. Каким образом заполнить область памяти данными из списка?

4. Какая команда производит выполнение отлаженной программы на машинном языке?

5. Какая команда записывает файл из Debug?

6. Как производится ассемблирование и дизассемблирование?

 

megaobuchalka.ru

Введение

Разработка программных продуктов проходит тщательное тестирование, обновление, устранение неполадок и обслуживание. В процессе отладки готовые программные решения регулярно компилируются и выполняются для выявления и устранения проблем. Крупные программы, содержащие миллионы строк исходного кода, делятся на небольшие компоненты. Для эффективности каждый компонент сначала отлаживается отдельно, а затем — в совокупности в рамках программного продукта.

Debug — что это и как работает? Тактика может включать интерактивную отладку, анализ потока управления, модульное и интеграционное тестирование, анализ файлов журналов, мониторинг на уровне приложений или системы, дампы памяти и профилирование.

debug что это

Debug — что это? Описание процесса

Debug — это штатный процесс поиска и удаления сбоев, ошибок или аномалий компьютерной программы, которые программисты обрабатывают с помощью инструментов отладки. Отладка проверяет, обнаруживает и исправляет ошибки, чтобы обеспечить правильную работу приложения в соответствии с установленными спецификациями.

В разработке программного обеспечения отладка включает в себя поиск и исправление ошибок кода в компьютерной программе. Debug является важным этапом процесса тестирования программного обеспечения и неотъемлемой частью всего жизненного цикла разработки ПО. Процесс отладки начинается, как только код записывается, и продолжается на последующих этапах, поскольку код объединяется с другими модулями программирования для формирования программного продукта. В большой программе, имеющей тысячи строк кода, процесс отладки можно упростить, используя такие стратегии, как модульные тесты, обзоры кода и парное программирование.

Debug в контексте MS-DOS

В MS-DOS Debug — что это? Это команда, которая позволяет программистам исследовать и изменять источники содержимого памяти, которые происходят в операционной системе. Методика предоставления инструкций по компьютерным задачам через интерфейс командной строки изначально использовалась в средах MS-DOS для перевода кода ассемблера в рабочий код и машинного языка в исполняемые (debug.exe) файлы.debug dump files можно ли удалить

Debug позволяет разработчикам просматривать содержимое памяти, вносить изменения, а затем выполнять COM, .exe и другие типы файлов.

История

Microsoft впервые представила команду debug в MS-DOS 1.0 в качестве метода тестирования программ. Была добавлена ​​дополнительная функциональность — инструмент ориентировался на различные операционные задачи, такие как отображение содержимого части памяти, ввод данных по указанному адресу, запуск исполняемых файлов памяти, шестнадцатеричная арифметика и манипуляция регистрационной памятью.

Важный этап обнаружения ошибок

После выявления программного сбоя необходимо найти ошибку в коде (Debug error). На этом этапе полезно просмотреть ведение журнала кода и использовать автономный инструмент отладчика или компонент отладки интегрированной среды разработки (IDE). Изначально обнаруживаются и фиксируются ошибки в наиболее популярных функциях. В некоторых случаях модуль, представляющий проблему, очевиден, а сама строка кода — нет. В этом случае модульные тесты, такие как JUnit и xUnit, которые позволяют программисту запускать определенную функцию с конкретными входами, могут быть полезны при отладке.

Процесс отладки

Стандартная практика состоит в том, чтобы настроить и запустить программу до точки остановки, при которой прекращается выполнение программы. Компонент отладки IDE обычно предоставляет программисту возможность просматривать память и переменные, запускать программу до следующей финальной точки, выполнять только следующую строку кода и в некоторых случаях изменять значение переменных или содержимое строки кода, которая должна быть выполнена.

debug команды

Общие инструменты отладки

Анализаторы исходного кода, которые включают в себя безопасность, общие ошибки кода и анализаторы сложности, также могут быть полезны при отладке. Анализатор сложности способен найти модули, которые настолько сложны, что их трудно понять и проверить. Некоторые инструменты могут фактически анализировать пробный прогон, чтобы увидеть, какие строки кода не выполнялись. Это может существенно помочь в отладке. Другие инструменты для отладки включают расширенное протоколирование и симуляторы, которые позволяют профессиональному программисту моделировать поведение программы на оборудовании пользователя.debug exe

Поиск и удаление ошибок программного обеспечения

Некоторые инструменты, особенно инструменты с открытым исходным кодом и языки сценариев, не запускаются в среде IDE и требуют ручного подхода к отладке. Такие методы включают в себя сброс значений в журнал, расширенные «печатные» заявления, добавленные во время выполнения кода или жестко закодированные debug-команды (например, wait), которые имитируют точку остановки, ожидая ввода клавиатуры в определенное время.

debug error

Debug Dump Files — можно ли удалить?

Многие пользователи после возникновения сбоя обнаруживают в месте хранения программы системные файлы. Документы носят наименование Debug Dump Files. Можно ли удалить их? Это отладочные файлы, которые создаются после нарушения работы ПО, чтобы помочь определить причину возникновения ошибки. Если вы не пытаетесь устранить проблему, то можете удалить их.

fb.ru

Сегодня мы рассмотрим стандартный отладчик debug.exe, входящий в любую версию DOS/Windows. Должен заметить, что этот отладчик не такой мощный, как гиганты SoftICE или Turbo Debugger. Однако, в то же время debug.exe очень прост и доступен, и поэтому идеально подходит для начинающих программистов на языке Ассемблер.
Итак, запускаем debug.exe (для этого заходим в Пуск->Выполнить и выполняем команду debug) и начинаем изучать этот замечательный отладчик :)

Для начала разберемся с правилами набора команд debug.exe:

  • В debug.exe не различается регистр букв.
  • Пробелы в командах используется только для разделения параметров.
  • Вводимые числа должны быть в шестнадцатеричной системе счисления, причем без завершающей буквы h.
  • Сегмент и смещение записываются с использованием двоеточия, в формате сегмент:смещение, например, CS:3C1 (смещение 3C1h в сегменте кода) или 40:17 (смещение 17h в сегменте, адрес начала которого — 40[0]h).

Разобравшись с правилами, давайте перейдем к изучению команд debug.exe. Замечу, что работа с командами debug.exe в чем-то похожа на работу с командной строкой DOS. Поcле загрузки отладчика на экране появится приглашение, выглядещее в виде дефиса:

Регистры CS, DS, ES, SS в этот момент инициализированы адресом 256-байтного префикса сегмента програмы, а рабочая области в памяти будет начинаться с адреса этого префикса + 100h.
Команды debug.exe вводятся сразу после приглашения на месте, которое отмечено курсором. Каждая команда состоит из идентификатора и параметров, идентификатор состоит из одной буквы.

Краткая таблица всех команд debug.exe

Команда Описание Формат
A (Assemble) Транслирование команд ассемблера в машинный код;
адрес по умолчанию — CS:0100h.
A [<адрес_начала_кода>]
C (Compare) Сравнение содержимого двух областей памяти; по умолчанию используется DS.
В команде указывается либо длина участков, либо диапазон адресов.
C <начальный_адрес_1> L<длина> <начальный_адрес_2>
C <начальный_адрес_1> <конечный_адрес_1> <начальный_адрес_2>
D (Display/Dump) Вывод содержимого области памяти в шестнадцатеричном и ASCII-форматах.
По умолчанию используется DS; можно указывать длину или диапазон.
D [<начальный_адрес> [L<длина>]]
D [начальный_адрес конечный_адрес]
E (Enter) Ввод в память данные или инструкции машинного кода;
по умолчанию используется DS.
E [<адрес> [<инструкции/данные>]]
F (Fill) Заполнение области памяти данными из списка; по умолчанию используется DS.
Использовать можно как длину, так и диапазон.
F <начальный_адрес_1> L<длина> '<данные>'
F <начальный_адрес> <конечный_адрес> '<данные>'
G (Go) Выполнение отлаженной программы на машинном языке до указанной точки останова;
по умолчанию используется CS. При этом убедитесь, что IP содержит корректный адрес.
G [=<начальный_адрес>] <адрес_останова> [<адрес_останова> …]
H (Hexadecimal) Вычисление суммы и разности двух шестнадцатеричных величин. H <величина_1> <величина_2>
I (Input) Считывание и вывод одного байта из порта. I <адрес_порта>
L (Load) Загрузка файла или данных из секторов диска в память; по умолчанию — CS:100h.
Файл можно указать с помощью команды N или аргумента при запуске debug.exe.
L [<адрес_в_памяти_для_загрузки>]
L [<адрес_в_памяти_для_загрузки> [<номер_диска> <начальный_сектор> <количество_секторов>]]
M (Move) Копирование содержимого ячеек памяти; по умолчанию используется DS.
Можно указывать как длину, так и диапазон.
M <начальный_адрес> L<длина> <адрес_назначения>
M <начальный_адрес> <конечный_адрес> <адрес_назначения>
N (Name) Указание имени файла для команд L и W. N <имя_файла>
O (Output) Отсылка байта в порт. O <адрес_порта> <байт>
P (Proceed) Выполнение инструкций CALL, LOOP, INT или повторяемой строковой инструкции
с префиксами REPnn, переходя к следующей инструкции.
P [=<адрес_начала>] [<количество_инструкций>]
Q (Quit) Завершение работы debug.exe. Q
R (Register) Вывод содержимого регистров и следующей инструкции. R <имя_регистра>
S (Search) Поиск в памяти символов из списка; по умолчанию используется DS.
Можно указывать как длину, так и диапазон.
S <начальный_адрес> L<длина> '<данные>'
S <начальный_адрес> <конечный_адрес> '<данные>'
T (Trace) Пошаговое выполнение программы. Как и в команде P, по умолчанию используется
пара CS:IP. Замечу, что для выполнения прерываний лучше пользоваться командой P.
T [=<адрес_начала>] [<количество_выполняемых_команд>]
U (Unassemble) Дизассемблирование машинного кода; по умолчанию используется пара CS:IP. К сожалению,
debug.exe некорректно дизассемблирует специфические команды процессоров 80286+,
хотя они все равно выполняются корректно.
U [<начальный_адрес>]
U [<начальный_адрес конечный_адрес>]
W (Write) Запись файла из debug.exe; необходимо обязательно задать имя файла командой N, если
он не был загружен. А программы записываются только в виде файлов .COM!
W [<адрес> [<номер_диска> <начальный_сектор> <количество_секторов>]]

Примечание. Символами [] отмечены необязательные параметры.

В этой части нашей статьи мы рассмотрим подробно работу команды D, позволяющей просматривать содержимое отдельных областей памяти.
Этот пример использует команду D для просмотра области памяти, начиная с 0159:0240:

Здесь на запрос просмотра участка памяти мы получили восемь строк, в которых указано содержимое выбранной области памяти. Каждая строка состоит из трех частей:

  • Адрес первого слева показанного байта в формате сегмент:смещение.
  • Шестнадцатеричное представление параграфа (16 байт), начинающегося с указанного в начале строки байта.
  • Символы этого же параграфа в ASCII-формате.

Адрес, указанный в строке, относится исключительно к первому байту в параграфе, а адреса последующих байтов следует вычислять самостоятельно. Шестнадцатеричное представление содержит по два знака в каждом байте, а сами байты разделены пробелами для облегчения чтения. Кроме того, следует отметить, что восьмой и девятый байты разделены дефисом, разделяя тем самым параграф на две части и облегяая вычисление адресов байтов в параграфе.

Проверка параллельных и последовательных портов
Первые 16 байт области данных BIOS содержат адреса параллельных и последовательных портов. Поэтому с помощью следующей команды можно проверить эти порты:

Первые выведенные восемь байтов указывают на адреса последовательных портов COM1-COM4. Следующие 8 байтов указывают на адреса параллельных портов LPT1-LPT4.
Например, если на вашем компьютере есть один параллельный порт, то первые два байта будут, скорее всего, такими: 7803. Адрес порта записывается в обращенной последовательности, т.е. 0378.

Проверка оборудования
Первые два байта, располагающиеся в BIOS по адресу 410h, содержат информацию об установленном в системе оборудовании. Находим эти байты командой:

Предположим, что первые два байта окажутся 23 44. Расшифруем эти байты для получения информации об установленных устройствах. Для этого обратим эти байты (44 23), затем переведем их в двоичную систему счисления. Получаем:

Значение бита 0 0 0 0 1 0 0 0 1 1
Позиция бита 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

Что означают эти биты? Продолжаем расшифровывать:

Биты Устройство
15, 14 Число параллельных портов (01 = 1 порт, …)
11, 10, 9 Число последовательных портов (…, 010 = 2 порта, …)
7, 6 Число дисководов (00 = 1 дисковод, 01 = 2, 10 = 3, 11 = 4)
5, 4 Начальный видеорежим (01 = 40х25 цветной, 10 = 80х25 цветной, 11 = 80х25 монохромный)
1 Присутствие математического сопроцессора (0 = нет, 1 = есть)
0 Наличие привода для дискет (0 = нет, 1 = есть)

Проверка состояния регистра клавиатуры
В области данных BIOS по адресу 417h находится первый байт, который хранит состояние регистра клавиатуры. Выключаем Num Lock и Caps Lock, затем набираем команду:

Первый байт будет равен 00. Включив Num Lock и Caps Lock, снова выполняем команду. Теперь первый байт должен равняться 60. Опытным путем установлено, что при включенном Num Lock первый байт равен 20, а при Caps Lock — 40. :)

Проверка состояния видеосистемы
По адресу 449h в BIOS находится первая область видеоданных. Для проверки набираем:

Первый байт показывает текущий видеорежим (к примеру, 03 — цветной), а второй — число столбцов (например, 50 — режим с 80 столбцами). Число строк можно найти по адресв 484h (40:84).

Проверка копирайта BIOS и серийного номера
Сведения об авторских правах на BIOS встроены в ROM BIOS по адресу FE00:0. Строку с копирайтом можно легко найти в ASCII-последовательности, а серийный номер — в виде шестнадцатеричного числа. Хотя, строка с указанием авторских прав может быть длинной и не умещаться в выведенную область памяти. В таком случае следует просто ввести еще раз D.

Проверка даты произвоства BIOS
Эта дата также записана в ROM BIOS начиная с адреса FFFF:5. После выполнения соответствующей команды в ASCII-последовательности будет находиться эта дата, записанная в формате мм/дд/гг.

Пример:

debug.exe позволяет вводить программу непосредственно в память машины, а затем следить и управлять ее выполнением. Мы будем вводить программу в машинных кодах, используя команду E. При этом будьте бдительны — ввод ошибочных данных по ошибочному адресу чреват непредсказумыми последствиями! Хотя к серьезным проблемам в системе это вряд ли приведет, но потерять все данные, введенные в debug.exe, можно потерять запросто.
Программа, которую мы сейчас будем вводить, использует данные, заложенные непосредственно в теле инструкций. Далее показан листинг программы на Ассемблере, в комментариях указаны аналоги команд языка в машинных кодах, а также объяснение каждй команды. Замечу, что в числах нет символа h, поскольку, как было сказано выше, debug.exe понимает только числа в шестнадцатеричной системе.

Как можно заметить, каждая машинная инструкция имеет длину от 1 до 3 байтов. Первый байт указывает операцию, последующие — ее операнды. Исполнение программы начинается соответственно с первой инструкции и последовательно проходит через все инструкции одну за другой.
Теперь можно ввести программу в память. Разделим машинный код на три части по шесть байт и введем каждую, используя команду E и начиная с адреса CS:100.

Теперь, когда программа введена в память, попробуем управлять ее выполнением. Для начала проверим текущее состояние регистров и флагов, для этого вводим команду R. Отладчик выведет содержимое регистров в шестнадцатеричной форме; на разных машинах содержимое регистров может различаться.

Итак, как можно видеть, debug.exe инициализировал сегменты DS, ES, SS, CS одним и тем же адресом. Регистр IP содержит 0100, указывая на то, что инструкции выполняются со смещения 100h относительно CS (а мы, вводя инструкции в память, как раз указали этот адрес).
Здесь же указаны и значения флагов переполнения, направления, прерывания, знака, нуля, дополнительного переноса, четности и переноса:

Значение Описание
NV Отсутствие переполнения
UP Направление вверх или вправо
EI Разрешение прерываний
PL Положительный знак
NZ Ненулевое значение
NA Отсутствие дополнительного переноса
PO Нечетное слово
NC Отсутствие переноса

После регистров и состояния флагов debug.exe выводит информацию о первой инструкции, которая будет выполняться:

  • Адрес инструкции, в нашем случае это 15D7:0100, где 15D7 — адрес сегмента кода.
  • Машинный код, соответствующей этой инструкции (B82301).
  • Собственно инструкция, записанная на ассемблере (MOV AX,0123).

Теперь, после анализа содержимого регистров и флагов, давайте перейдем к выполнению программу. Выполнять программу мы будем пошагово, используя команду T. Использовав в первый раз команду T, мы выполняем инструкцию MOV. Здесь машинный код операнда инструкции — 2301. Операция помещает 23 в AL (младшая половина AX), а 01 — в AH (старшая).
После этого debug.exe снова выводит информацию о регистрах:

Теперь AX содержит 0123h, IP0103h (следовательно, длина выполненной инструкции: 0103h0100h = 3 байта), а в качестве следующей инструкции указана операция ADD.
Так, раз за разом выполняя команду T, мы дойдем до последней инструкции JMP 100. Она установит регистр IP в 100h, и debug.exe вернется к началу программы. Возвращаясь к началу программы, следует заметить, что в DS, ES, SS и CS содержится один и тот же адрес. Дело в том, что debug.exe рассматривает введенные программы исключительно как программы .COM. А в программах .COM, в отличие от .EXE, стек, код и данные хранятся в одном сегменте.

В прошлом примере мы вводили программу в машинных кодах, однако, debug.exe вполне способен понимать инструкции, записанные на ассемблере. Для работы с такими программами в debug.exe используются команды A и U.
Команда A запрашивает инструкции на ассемблере и преобразовывает их в машинный код. Для начала инициализируем начальный адрес для ввода инструкций (100h):

Отладчик выведет адрес сегмента кода и смещения (например, 13F2:0100). Теперь мы должны ввести следующие инструкции на ассемблере в память, после каждой строки нажимая Enter:

После ввода последней инструкции нажимаем Enter дважды, чтобы указать отладчику, что мы закончили вводить текст программы. Теперь программу можно запускать, используя команды R для просмотра регистров и T для трассировки. Замечу, что в своих программах при наличии инструкций INT их следует обрабатывать не командой T, а командой P, которая обрабатывает все прерывание сразу.

Перейдем к процедуре дизассемблирования, а в качестве примера возьмем только что введенную программу. Используем адреса первой и последней инструкций для указания диапазона, который мы собираемся дизассемблировать, т.е. 100h и 107h.

После выполнения этой команды debug.exe выведет инструкции, находящиеся в указанном диапазоне, на ассемблере, в машинных кодах, а также адрес каждой инструкции:

А теперь, после небольшого обзора возможностей стандартного отладчика debug.exe давайте подведем итоги. Итак:

  • debug.exe можно применять для наблюдений и отладки программ на ассемблере и машинных кодах.
  • debug.exe позволяет трассировать программу, устанавливать точки останова, просматривать области памяти, вводить программы непосредственно в память компьютера.
  • debug.exe представляет загружаемые программы как программы .COM.
  • debug.exe воспринимает только числа в шестнадцатеричной системе.
  • debug.exe не различает регистр букв.

Дополнительные материалы:
Абель П. АССЕМБЛЕР: Язык и программирование для IBM PC. — К.: Век+, 2003.
http://www.allasm.ru/low_prog_01.php — низкоуровневое программирование для дZенствующих — DZebug: руководство юZверя
http://thestarman.pcministry.com/asm/debug/debug.htm — A Guide to DEBUG, by Daniel B. Sedory

forum.sources.ru


You May Also Like

About the Author: admind

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.