Debugging symbols что это за программа и нужна ли она

Программа Debug

Как уже говорилось (см. ВВЕДЕНИЕ), программа Debug входит в состав Windows. Запустить программу Debug можно из командной строки или непосредственно из папки, в которой она находится.

Чтобы запустить программу из командной строки, выберите команду из меню ПУСК – ВЫПОЛНИТЬ или нажмите комбинацию клавиш WIN + R (если вы не знаете, что такое комбинация клавиш, см. книгу Компьютер для чайников). В открывшемся окне (рис. 1.5) напечатайте слово debug и нажмите клавишу ENTER или щёлкните кнопку ОК.

После этого откроется окно с пустым экраном и чёрточкой в левом верхнем углу, которая приглашает вас ввести какую-либо команду. Например, чтобы выйти из программы Debug, напечатайте букву q и нажмите ENTER.

Написать программу, используя Debug, можно не единственным способом, но мы пока рассмотрим тот, который больше похож на написание программы для Emu8086.

Чтобы написать уже известную нам программу, используя Debug, сделаем следующее (подразумевается, что Debug вы уже запустили, и увидели черный экран с маленькой мигающей черточкой в левом верхнем углу).

Михаил Щербаков «WinDbg и сотоварищи»

Введем букву «а» (напоминаю в последний раз — все команды вводятся на английском языке) и нажмем ENTER.

Затем введем программу, нажимая ENTER в конце каждой строки:

0B72: 0100 MOV AH, 02 0B72: 0102 MOV DL, 41 0B72: 0104 INT 21 0B72: 0106 INT 20 0B72: 0108
Результат будет примерно таким, как показано на рис. 1.6.

ПРИМЕЧАНИЕ 1
Обратите внимание, что все числовые значения пишутся без буковки h в конце. Это потому, что Debug работает только с шестнадцатеричными числами, и ему не надо объяснять, в какой системе исчисления вводятся данные.

ПРИМЕЧАНИЕ 2
После ввода команды -а, появляются символы: 0B72: 0100. В вашем случае первые четыре символа могут быть другими, но нас они пока не интересуют. А как вы думаете, что означает число 0100? Помните директиву ORG 100h (см. раздел Emu8086)? Вот-вот – это адрес, с которого начинается выполнение программы.

То есть в память с этим адресом заносится первая команда программы (для файлов СОМ). Каждая команда занимает 2 байта, поэтому следующий адрес будет 0102 и т.д.

Сами команды мы уже знаем (см. раздел Emu8086), поэтому описывать их здесь не будем.

Программа написана – нужно проверить ее работу. Нажмём ENTER ещё раз, чтобы на экране появилась чёрточка, которая говорит о том, что можно вводить команду для Debug. Затем введем команду g (от английского «GO») и нажмем клавишу ENTER. На экране увидим следующее:

-g A Программа завершилась нормально —

Здесь A – та самая буква, которая выводится на экран в результате работы программы. Затем идёт сообщение о нормальном завершении программы (оно может отличаться в зависимости от версии Debug).

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

Без этого вы не станете программистом! Найти ошибку в коде. Отладка. Как пользоваться отладчиком #23

Введем команду t и нажмем клавишу ENTER. Увидим нечто вроде этого:

AX=0200 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0B72 ES=0B72 SS=0B72 CS=0B72 IP=0102 NV UP EI PL NZ NA PO NC 0B72:0102 B241 MOV DL,41

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

Снова введем команду t и нажмем клавишу ENTER. Увидим следующее:

AX=0200 BX=0000 CX=0000 DX=0041 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0B72 ES=0B72 SS=0B72 CS=0B72 IP=0104 NV UP EI PL NZ NA PO NC 0B72:0104 CD21 INT 21
Команда MOV DL, 41, как ей и полагается, записала в регистр DL число 41.

Снова введем команду t и нажмем клавишу ENTER. Увидим следующее:

AX=0200 BX=0000 CX=0000 DX=0041 SP=FFE8 BP=0000 SI=0000 DI=0000 DS=0B72 ES=0B72 SS=0B72 CS=0347 IP=0225 NV UP EI PL NZ NA PO NC 0347:0225 80FC4B CMP AH,4B

Команды CMP AH,4B нет в нашей программе. Наша программа завершила свою работу. Мы можем долго еще вводить команду t – нам будут выдаваться состояния регистров. Почему это происходит, нам пока не интересно.

Лучше введем команду g и нажмем клавишу ENTER, таким образом окончательно выполним нашу программу, и увидим то, что мы уже видели.

  1. Какого размера будет наш файл? Выполнение программы начинается с адреса 0100h, а последняя строка в программе содержит адрес 0108h. Это значит, что размер файла будет 8 байт (108h – 100h = 8).
  2. Как мы назовем наш файл? А хоть как. Однако, рекомендуется давать файлам английские имена, в которых содержится не более 8 символов (DOSу так приятнее работать). Назовем, например, debug_1.com
  1. Снова напишем нашу программу (тренируйтесь, тренируйтесь. ).
  2. Запишем в регистр СХ размер файла. Для этого введем команду r cx и нажмем ENTER. Затем введем размер файла (8 байт) и нажмем ENTER.
  3. Введем команду n, затем один пробел и имя файла. Нажмем ENTER.
  4. И, наконец, введем команду w и нажмем ENTER.
Читайте также:
Уровень и направленность образовательной программы что это

-r cx СХ 0000 :8 -n debug_1.com -w Запись: 00008 байт —

Если вы работаете в режиме эмуляции DOS из под WINDOWS, то файл debug_1.com сохранится на рабочий стол, либо в папку текущего пользователя. Это зависит от версии и/или настроек WINDOWS. Теперь его можно запустить как обычную программу. Если в указанных папках вы не нашли этот файл, то найдите его через поиск файлов.

Ну а если вы не знаете, как это сделать, см. книгу Компьютер для чайников.

Чувствую, что мы уже устали. Выход из Debug осуществляется командой q.

Набравшись сил и терпения, изучим еще одну опцию Debug – дизассемблер. С его помощью можно дизассемблировать какой-нибудь СОМ-файл (то есть выполнить действие, обратное ассемблированию – преобразовать исполняемый файл в исходный код на языке ассемблера). Допустим, у вас есть программка, написанная не вами – ее исходный код вы не знаете, а посмотреть очень хочется. Для этого и существует дизассемблер.

Итак, программа Debug у нас закрыта. Набираем в командной строке:

debug debug_1.com
(где debug_1.com – это имя файла, который мы хотим дизассемблировать) и нажимаем ENTER.

ПРИМЕЧАНИЕ
Если программа не запустилась, значит нужно указать полный путь к ней, например

C:WINDOWSCOMMANDdebug debug_1.com

Если же программа запустилась, но выдала ошибку (например: Ошибка 1282 или «Файл не найден»), то нужно указать полный путь к файлу, например:

C:WINDOWSCOMMANDdebug C:MYPROGdebug_1.com

Если и это не помогло, то, возможно, вы всё-таки где-то допустили ошибку в пути или путь не соответствует требованиям DOS. В таком случае лучше поместить программу в корень диска С, откуда она гарантированно загрузится по пути «C:debug_1.com».

Если Debug запустилась без сообщений об ошибках, то вводим команду u и нажимаем ENTER. Вот что мы увидим (примерно, см. также рис 1.8):

-u 0BC6:0100 B402 MOV AH, 02 0BC6:0102 B241 MOV DL, 41 0BC6:0104 CD21 INT 21 0BC6:0106 CD20 INT 20 0BC6:0108 56 PUSH SI 0BC6:0109 2E CS: 0BC6:010A 8A04 MOV AL, [SI] 0BC6:010C 0AC0 OR AL, AL 0BC6:010E 741A JZ 012A 0BC6:0110 3C3A CMP AL, 3A 0BC6:0112 750D JNZ 0121 0BC6:0114 2E CS: 0BC6:0115 807C0100 CMP BYTE PTR [SI+01], 00 0BC6:0119 7506 JNZ 0121 0BC6:011B 2E CS: 0BC6:011C C60400 MOV BYTE PTR [SI], 00 0BC6:011F EB09 JMP 012A —

Посмотрите на первые четыре строки. Узнаете? Это наша программа.

Остальные строки нас не интересуют (это инструкции, оставшиеся от программ или данных, отработавших до запуска Debug). Ну а если мы рассматриваем незнакомый файл, как узнать, где кончается программа и начинается «мусор»? Ориентировочно это можно сделать по размеру файла (для очень маленьких программ). Размер можно посмотреть в свойствах файла.

Только следует учитывать, что в свойствах файла размер дан в десятичной форме, а Debug нам выдает шестнадцатеричные адреса. Поэтому придется перевести десятичное число в шестнадцатеричное.

Есть еще вариант (который тоже не всегда приемлем) – найти в полученном списке строку, содержащую команду выхода из программы (INT 20).

Если программа большая, то список ее команд не поместится на экран. Тогда снова вводим команду u и нажимаем ENTER. И так до конца программы.

Возможно, вы не увидите на экране свою программу. Это может быть либо из-за того, что программа почему-то не загрузилась, либо по причине несоответствия адресов. Будьте внимательны: обращайте внимание на адреса памяти, которые указаны в левой колонке. Наша программа начинается с адреса 0100. Если адрес другой, то это, соответственно, не наша программа.

Источник: www.av-assembler.ru

dumpchk.exe что это за программа?

Приветствую, друзья! Сегодня берусь за дело dumpchk.exe — должен узнать что за процесс/программа. Постараюсь найти максимум информации, напишу вам все простыми словами. Поехали!

Официальная информация

Нашел сайт Майкрософт, где пишется что dumpchk.exe — сервисная консольная утилита проверки корректности создания файла дампа пмяти. Также сказано — программа не требует доступа к символам, что это значит — к сожалению непонятно. Случайно узнал — файлы символов оказывается находятся здесь:

Скорее всего dumpchk.exe — команда консоли. Однако у меня стоит десятка — запустил командную строку, хотел вызвать справку по команде — ошибка, мол не является внутренней или внешней командой:

Я поспешил — на сайте Майкрософт сказано — dumpchk.exe находится на компакт-диске Win XP, на сегодняшний день это устаревшая система. Вроде бы даже если установить XP — dumpchk.exe будет отсутствовать, чтобы появился, необходимо установить средства поддержки из папки SupportTools установочного диска XP. По умолчанию программа установится в эту папку:

C:Program FilesSupport Tools

На заметку — компонент также входит в состав Debugging Tools for Windows (как понимаю это инструменты для отладки). Также вроде бы dumpchk.exe присутствует в Windows Automated Installation Kit (WAIK).

Важно: при помощи команды можно вытащить код ошибки. Возможно имеется ввиду ситуация когда внезапно появляется так называемый синий экран (BSOD), и потом можно узнать при помощи команды что за ошибка была — получить ее код.

При успешной установки команда станет доступной из консоли. Для вызова консоли (cmd):

  1. Зажмите Win + R
  2. Введите cmd.exe
  3. Нажмите ОК.

После всех шагов появится черное окно — это командная строка/консоль (Command line).

Какие параметры существуют?

Параметры указываются после указания самой команды, через пробел. На сайте Майкрософт не совсем понятно написано как работать с параметрами. Поэтому пришлось еще поискать информации — нашел. Итак, смотрите:

Читайте также:
Программа юпитер что это

Вы открываете консоль. Как — написал выше.

Далее нужно прописать dumpchk.exe. Если установили Debugging Tools for Windows (DTW) — указывайте в таком виде:

C:Program FilesDebugging Tools for Windows (x86)dumpchk.exe

Нужно прописывать полный путь. Если установили средства поддержки — возможно команда будет в папке:

Кстати, возможно Debugging Tools for Windows и есть средства поддержки.

Далее нужны файлы символов, мы выяснили, они находятся здесь:

Аварийный файл находится как правило здесь (название файла приведено для примера):

В итоге чтобы запустить команду поиска символов для анализа дампа (возможно неправильно написал, заранее прошу прощение) необходимо написать:

«C:Program FilesDebugging Tools for Windows (x86)dumpchk.exe» -y C:WINDOWSSymbols C:WINDOWSMinidumpMini010609-01.dmp

Буква -y в строке — параметр, необходим как раз для поиска символов. Кроме него есть другие:

  1. -? — показывает справку по команде.
  2. -p — печатает только заголовок, не совсем понятно что имеется ввиду.
  3. -v — режим подробного вывода.
  4. -c — проверка файла дампа.
  5. -x — дополнительная проверка.
  6. -e — анализ дампа.
  7. -q — быстрая проверка (не применима в XP).

Также с dumpchk.exe может быть ошибка (Application Error):

В принципе ошибка скорее некритичная, однако если будет сбой BSOD, то могут быть проблемы при анализ дампа.

Как открыть настройки файла дампа?

На заметку. В Виндовс 10 чтобы открыть настройки файла дампа (файлы идут с расширением dmp, стандартное название — MEMORY.DMP):

  1. Необходимо открыть Свойства системы — в панели управления значок Система:
  2. Нажать Дополнительные параметры:
  3. На вкладке Дополнительно внизу будет раздел Загрузка и восстановление, нажать Параметры:
  4. Появится окно Загрузка и восстановление, где и будут сами настройки:

Важно: без необходимости настройки не менять!

Заключение

dumpchk.exe — компонент по работе с файлом дампа памяти, устанавливается как понимаю вручную. Файл создается при возникновении сбоя системы — может помочь выявить проблему.

Данная команда, как понимаю, работает в XP. Возможно в семерке, десятке присутствует альтернатива.

Выяснил еще — dumpchk.exe содержится и в дистрибутиве Win2k Server.

Настоятельно рекомендую посетить официальный сайт Майкрософт, где сказано об этой команде.

Источник: virtmachine.ru

Отладочные символы

Большинство программ и библиотек по умолчанию компилируются с символами отладки. ( с опцией gcc -g).

При отладке программы или библиотеки, скомпилированной с отладочной информацией, отладчик предоставляет не только адреса в памяти, но и имена алгоритмов и переменных.

Однако включение символов отладки значительно увеличивает размер программы или библиотеки. Для того, чтобы получить представление о размере отладочных символов, взглянем на пример:

оболочка bash, скомпилированная с отладочными символами: 1200 KB

оболочка bash, скомпилированная без отладочных символов: 480 KB

файлы glibc и gcc (/lib и /usr/lib) с отладочными символами: 87 MB

файлы glibc и gcc скомпилированная без отладочных символов: 16 MB

Размеры могут различаться в зависимости от использованного компилятора Си и библиотеки. При сопоставлении размера программы, скомпилированной с отладочными символами и без них, разница составляет примерно 2 — 5 раз.

Так как большинство пользователей никогда не используют отладчик, удаление этих символов позволит значительно сэкономить дисковое пространство.

Для удаления символов отладки из бинарного файла (файл a.out или бинарный файл ELF), выполните strip —strip-debug filename . Допускается использование символа * для обработки нескольких файлов (например, strip —strip-debug $LFS/static/bin/* ).

Для удобства, в главе 9 описана программа, удаляющая отладочные символы со всех программ и библиотек системы. Для получения дополнительных сведений по оптимизации, см. руководство: http://hints.linuxfromscratch.org/hints/optimization.txt .

Назад Домой Вперед
Вступление Наверх Вход в среду chroot

Источник: www.opennet.ru

GDB: ближе к телу

Сегодня ты сделаешь еще один шаг в деле
изучения Linux систем. Я расскажу об основных
приемах при работе с gdb. Овладев ими ты сможешь понять, как работает любая программа, писать свои эксплоиты.

Вы, наверное, все слышали про такую вещь как отладчик, gdb – это и есть отладчик. GDB – GNU
Debugger. Это некое подобие SoftICE для Windows (для тех кто не знает – самый популярный и, на мой взгляд, вообще лучший отладчик), только под
Linux системы. Дело в том, что в сети не так уж много документов, которые демонстрируют работу этой вещи и в свое время я его осваивал сам. Итак,
в документе будут описаны базовые команды gdb. Все это будет показано на примере. А в качестве примера я решил взять ненужную прогу yes. Для тех, кто не знает – это программа просто выводит символ ‘y’ до бесконечности, для начала я решил научить ее выводить не этот символ, а строку ‘XAKEP’, хоть веселее будет.

Ну а теперь все по порядку. Сам отладчик запускается так:

Но можно вводить различные параметры, у нас это будет путь к исследуемой программе:

Можно исследовать core файлы, для этого нужно ввести следует ввести следующее:

# gdb /usr/bin/yes core

Еще может понадобится команда для просмотра содержимого регистров:

(gdb) info registers

либо так (сокращенный вариант)

Теперь рассмотрим как делать перехваты. Существуют
точки останова, точки перехвата и точки наблюдения. Более конкретно я бы хотел остановиться на точках останова. Их можно устанавливать на:

(gdb) break function — Остановить перед входом в функцию
(gdb) break *adress — Остановить перед выполнением инструкции по адресу.

Читайте также:
Ventoy live cd что это за программа

После установок можно просмотреть все точки для этого воспользуйтесь командой:

А потом можно удалить эти точки:

(gdb) clear breakpoint — где break это название точки останова
(например, функция или адрес)

Очень необходимой вещью является возможность автоматического отображения различных значений при выполнении программы. Для этого существует команда display:

(gdb) display/format value , где format – это формат отображения, а value – само выражение которое нужно отобразить.

Для работы с отображением отведены следующие команды:

(gdb) info display — выдает инфу об отображениях
(gdb) delete num — где num – удалить элементы с индексом
num

Это был небольшой справочник по командам, чтобы понять основную идею.
Далее на примере хотелось бы продемонстрировать это и еще немного. И помните – здесь я дал лишь очень маленькую часть всех возможностей gdb, на самом деле у него их в сотни раз больше, поэтому читайте и учите.
Как я и обещал, берем ненужную прогу yes. Путь на вашей машине может не совпадать с моим, все зависит от операционки которой вы пользуетесь, если что воспользуйтесь поиском (команда
find).

После запуска он говорит приветственное сообщение.

GNU gdb 19991004
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type «show copying» to see the conditions.
There is absolutely no warranty for GDB. Type «show warranty» for details.
This GDB was configured as «i386-redhat-linux».
(no debugging symbols found).

И появляется приглашение gdb. Дальше мы настраиваем вывод
так, чтобы при работе программы у нас каждый раз высвечивался
адрес команды, ее смещение и сама ассемблерная инструкция:
(gdb) display/i $pc

Так как yes выводит бесконечное число символов, то лучше бы их нам не видеть в отладчике, а вывод
программы можно направить на другую консоль. Откройте новый терминал, наберите who is i и вы получите имя консоли. Должно вылезти
что-то вроде этого:

localhost.localdomain!root pts/1 Apr 26 13:24

Вот теперь просто привязываем к ней.

(gdb) tty /dev/pts/1

А теперь ставим точку останова на функцию puts(), а чтобы было понятней вот вам man-справка об функции(команда man
puts)

#include
int puts(const char *s);
puts() writes the string s and a trailing newline to std­
out.

Как видно, функция посылаем строку s на поток вывода. Вот она то нам и нужна. На ней то мы пока и остановимся.

(gdb) break puts
Breakpoint 1 at 0x8048698

И запускаем саму программу, чтобы дождаться пока gdb не остановит ее выполнение на вызове функции.

(gdb) r
Starting program: /usr/bin/yes
Breakpoint 1 at 0x4006d585: file ioputs.c, line 32.

Breakpoint 1, 0x4006d585 in _IO_puts (str=0x8048e59 «y») at ioputs.c:32
32 ioputs.c: No such file or directory.
1: x/i $eip 0x4006d585 : mov 0x8(%ebp),%esi

О, вот и произошло чудо, сработал breakpoint. Что мы видим – а видим мы ни что иное, как параметр функции, точнее адрес, по которому он лежит. Что теперь нужно
сделать? Правильно, подправить данные по этому адресу. При этом мы затрем еще пару символов своими.

(gdb) set 0x8048e59=’X’
(gdb) set 0x8048e5a=’A’
(gdb) set 0x8048e5b=’K’
(gdb) set 0x8048e5c=’E’
(gdb) set 0x8048e5d=’P’

Ну а теперь посмотрим на наше творение. Что там лежит в памяти:

Теперь удалим наш брякпоинт:

(gdb) info break
Num Type Disp Enb Address What
1 breakpoint keep y 0x4006d585 in _IO_puts at ioputs.c:32
breakpoint already hit 1 time
(gdb) clear puts
Deleted breakpoint 1

И продолжим выполнение чтобы насладится результатом:

Вот и все. Выходим.

(gdb) q
The program is running. Exit anyway? (y or n) y

На этом практика заканчивается, остальное изучайте сами и помните что главное в этой жизни – это УЧЕНЬЕ.
Вот еще некоторые примеры работы:

Присоединение к работающему процессу:

(gdb) x/d or x ‘address’ show decimal
(gdb) x/100s ‘address’ show next 100 decimals
(gdb) x 0x0804846c show decimal at 0x0804846c
(gdb) x/s ‘address’ show strings at address
(gdb) x/105 0x0804846c show 105 strings at 0x0804846c
(gdb) x/x ‘address’ show hexadecimal address
(gdb) x/10x 0x0804846c show 10 addresses at 0x0804846c
(gdb) x/b 0x0804846c show byte at 0x0804846c
(gdb) x/10b 0x0804846c-10 show byte at 0x0804846c-10
(gdb) x/10b 0x0804846c+20 show byte at 0x0804846c+20
(gdb) x/20i 0x0804846c show 20 assembler instructions at address

Список всех секций в исполняемом файле:

(gdb) maintenance info sections // or
(gdb) mai i s

Executable file:
`/home/hack/homepage/challenge/buf/basic’, file type
elf32-i386.
0x080480f4->0x08048107 at 0x000000f4: .interp ALLOC
LOAD READONLY DATA HAS_CONTENTS
0x08048108->0x08048128 at 0x00000108: .note.ABI-tag
ALLOC LOAD READONLY DATA HAS_CONTENTS
0x08048128->0x08048158 at 0x00000128: .hash ALLOC
LOAD READONLY DATA HAS_CONTENTS
0x08048158->0x080481c8 at 0x00000158: .dynsym ALLOC
LOAD READONLY DATA HAS_CONTENTS
0x080481c8->0x08048242 at 0x000001c8: .dynstr ALLOC
LOAD READONLY DATA HAS_CONTENTS
0x08048242->0x08048250 at 0x00000242: .gnu.version
ALLOC LOAD READONLY DATA
HAS_CONTENTS

(gdb) disassemble main
Dump of assembler code for function main:
0x8048400 : push %ebp
0x8048401 : mov %esp,%ebp
0x8048403 : sub $0x408,%esp
0x8048409 : add $0xfffffff8,%esp
0x804840c : mov 0xc(%ebp),%eax
0x804840f : add $0x4,%eax
0x8048412 : mov (%eax),%edx
0x8048414 : push %edx
0x8048415 : lea 0xfffffc00(%ebp),%eax
.

(gdb) break *0x8048414 // example
Breakpoint 1 at 0x8048414
(gdb) break main // example
Breakpoint 2 at 0x8048409
(gdb)

Источник: xakep.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru