KasperskyOS Community Edition 1.3

Начальные шаги отладки

Чтобы начать отладку с использованием GDB-сервера QEMU, нужно выполнить следующие шаги:

  1. Собрать отладочные версии исполняемых файлов и библиотек, создать образ решения для QEMU и запустить QEMU в режиме ожидания подключения отладчика GDB.

    Для этого нужно вызвать 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.

  2. Запустить отладчик GDB и подключиться к GDB-серверу QEMU.

    Для этого нужно вызвать shell-команду make gdb в директории build.

  3. [Опционально] Задать дополнительные пути для поиска динамических библиотек с отладочными символами.

    На шаге 1 в файл build/einit/.gdbinit автоматически добавляется путь, по которому отладчик GDB выполняет поиск динамических библиотек с отладочными символами из состава KasperskyOS Community Edition (в качестве параметра GDB-команды set sysroot). Чтобы задать дополнительные пути для поиска динамических библиотек, нужно вызвать следующую GDB-команду:

    set solib-search-path <путь к директории>...
  4. [Опционально] Загрузить отладочные символы исполняемых файлов.

    Если для исполняемых файлов со статической компоновкой заданы адреса загрузки секции .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 <путь к файлу>.