Чтобы начать отладку с использованием GDB-сервера QEMU, нужно выполнить следующие шаги:
Для этого нужно вызвать shell-команды cmake
, указав параметры -D CMAKE_BUILD_TYPE:STRING=Debug
и --target gdbsim
.
Пример:
#!/bin/bash
...
cmake -G "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
Вместо цели gdbsim
можно указать цель gdbsim/fast
, чтобы не выполнять повторную сборку.
QEMU запускается, но не исполняет код решения, ожидая вызова GDB-команды continue
.
Для этого нужно вызвать 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
<путь к файлу
>.