Перейти к содержанию

Отладка пользовательских приложений (gdb)

Исходники по этой теме

Отладчик проекта GNU или просто GNU Debugger. Позволяет "наблюдать" за тем, что происходит "внутри" запущенного приложения или что приложение делало во время сбоя.

Возможна удаленная отладка по сети. Возможна отладка через STLink, используется arm-none-eabi-gdb.

На примере задания 1. В в .vscode/launch.json добавить в "configurations":

{
  "name": "x86_64_assembler_interrupts",
  "type": "cppdbg",
  "request": "launch",
  "program": "${workspaceFolder}/x86_64_assembler_interrupts/build/asm_example",
  "args": [],
  "environment": [{ "name": "config", "value": "Debug" }],
  "cwd": "${workspaceFolder}"
}

Или из консоли вызвать gdb ./build/asm_example. Далее в консоли break main и run, а потом ручками вводить по очереди stepi и info registers для просмотра состояний.

Сам GDB состоит из 3 основных частей:

  • Symbol side - символьная информацией о программе, включает в себя имена и типы функций и переменных, номера строк, использование машинного регистра и так далее.
  • Target side - манипулирование целевой системой. "target side" GDB в основном связана с выполнением вызовов ptrace и интерпретацией результатов. Для кросс отладки встроенной системы "target side" создает и принимает пакет пакеты по сети.
  • User interface - CLI, MI, TUI.

Для компиляции программы с отладочной информацией использовать флаг -g в gcc.

Каждая локальная переменная, каждая функция, каждый именованный тип и каждое перечисление – все это отдельные символы.

Отладочная информация может быть следующих форматов:

  • DWARF (современные UNIX-подобные ОС, большинство встраиваемых систем)
  • Stabs (некоторые UNIX, заменены на DWARF)
  • COFF, XCOFF, ECOFF (System V Unix, MS Windows)

Сантиайзер

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

Чтобы использовать AddressSanitizer (детектирвоание ошиборк работы с памятью: использование после освобождения {heap, stack, global}, переполение буферов в C/C++ программах), нужно скомпилировать и связать программу, используя флаг -fsanitize=address

Пример Makefile:

hello:hello.o
    gcc hello.o -o hello -fsanitize=address -static-libasan
hello.o:hello.c
    gcc -c hello.c -fsanitize=address -g

Ну или просто руками ввести эти же команды и запустить полученное приложение.

Выполнение задания

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

Программа читает бинарник в ОЗУ, далее ищутся сигнатуры (по типу __asan_init, __tsan_init и т. д.) и выводятся.

Для сборки и проверки примеров:

make all
make check