Начальные шаги отладки
Чтобы начать отладку с использованием GDB-сервера QEMU, нужно выполнить следующие шаги:
- Собрать отладочные версии исполняемых файлов и библиотек, создать образ решения для QEMU и запустить QEMU в режиме ожидания подключения отладчика GDB.
Для этого нужно вызвать shell-команды
cmake
, указав параметры-D CMAKE_BUILD_TYPE:STRING=Debug
и--target gdbsim
.Пример:
"Unix Makefiles" \ -D CMAKE_BUILD_TYPE:STRING=Debug \ -D CMAKE_TOOLCHAIN_FILE=$SDK_PREFIX/toolchain/share/toolchain-$TARGET.cmake \ -B build \ && cmake --build build --target gdbsim... cmake -GВместо цели
gdbsim
можно указать цельgdbsim/fast
, чтобы не выполнять повторную сборку.QEMU запускается, но не исполняет код решения, ожидая вызова GDB-команды
continue
. - Запустить отладчик GDB и подключиться к GDB-серверу QEMU.
Для этого нужно вызвать shell-команду
make gdb
в директорииbuild
. - [Опционально] Задать дополнительные пути для поиска динамических библиотек с отладочными символами.
На шаге 1 в файл
build/einit/.gdbinit
автоматически добавляется путь, по которому отладчик GDB выполняет поиск динамических библиотек с отладочными символами из состава KasperskyOS Community Edition (в качестве параметра GDB-командыset sysroot
). Чтобы задать дополнительные пути для поиска динамических библиотек, нужно вызвать следующую GDB-команду:set solib-search-path <путь к директории>... - [Опционально] Загрузить отладочные символы исполняемых файлов.
Если для исполняемых файлов со статической компоновкой заданы адреса загрузки секции
.text
(CMake
-командойset_target_properties()
), то GDB-команда загрузки отладочных символов для каждого из этих файлов автоматически добавляется в файлbuild/einit/.gdbinit
на шаге 1.Если для одного исполняемого файла с динамической компоновкой задан адрес загрузки секции
.text
, то GDB-команда загрузки отладочных символов для этого файла автоматически добавляется в файлbuild/einit/.gdbinit
на шаге 1. Если для нескольких исполняемых файлов с динамической компоновкой заданы адреса загрузки секции.text
, то GDB-команда загрузки отладочных символов автоматически не добавляется в файлbuild/einit/.gdbinit
на шаге 1 ни для одного из этих исполняемых файлов.Чтобы загрузить отладочные символы вручную, нужно использовать следующие GDB-команды:
add-symbol-file
<путь к файлу
> – для исполняемых файлов со статической или динамической компоновкой;file
<путь к файлу
> – для исполняемых файлов с динамической компоновкой.
GDB-команду
file
нужно использовать, чтобы отладчик GDB загрузил отладочные символы исполняемого файла и динамических библиотек, от которых зависит этот исполняемый файл. Чтобы отладчик GDB загрузил отладочные символы только исполняемого файла с динамической компоновкой, нужно использовать GDB-командуadd-symbol-file
.GDB-команда
file
может быть применена только для одного исполняемого файла. То есть отладчик GDB не может загрузить отладочные символы динамических библиотек для нескольких исполняемых файлов одновременно.После вызова GDB-команды
file
может появиться следующее сообщение:warning: Unable to find dynamic linker breakpoint function. GDB will be unable to debug shared library initializers and track explicitly loaded dynamic code.Это сообщение нужно проигнорировать.
Если отладочные символы сохраняются не в исполняемых файлах, а в отдельных файлах, то в исполняемые файлы добавляются ссылки на файлы с отладочными символами. При вызове GDB-команды
add-symbol-file
илиfile
можно указать как исполняемый файл, так и файл с отладочными символами.
При выполнении повторной сборки (шаг 1) необязательно завершать сессию отладки, то есть выходить из отладчика. (Это позволяет избежать повторного выполнения таких действий, как загрузка отладочных символов и задание дополнительных путей для поиска динамических библиотек.) Чтобы не завершать сессию отладки, нужно перед повторной сборкой выполнить GDB-команду detach
, а после запуска QEMU выполнить GDB-команду target remote localhost:1234
.
GDB-команды (например, для загрузки отладочных символов или задания дополнительных путей для поиска динамических библиотек) можно записать в файл, а затем вызывать их, используя GDB-команду source
<путь к файлу
>.