Как установить отладочные символы для установленных пакетов?

Вопрос или проблема

Я пытаюсь следить за тем, как работают программы, запуская их с помощью отладчика ‘Qt Creator’. Для лучшей ориентации я хотел бы видеть также системные (ядровые) утилиты полностью в окне стека вызовов, как я привык делать в MS Visual Studio 6.0, а не только видеть их ассемблерный код. Для утилит отладчик ‘Qt Creator’ отображает лишь то, что их отладочные символы недоступны. (Иногда система генерирует отчеты об ошибках для своих разработчиков; диалог отчета об ошибках запрашивал установку таких символов только для определенной программы.) Как я могу получить отладочные символы ядра? (Без перевода всей версии Ubuntu. Я использую ‘Update Manager’ для регулярной установки обновлений. Моя

/sys/kernel/debug/x86

директория содержит лишь один пустой файл. Я не нашел его в ‘Центре программного обеспечения Ubuntu’, также не вижу, есть ли какие-либо пакеты на http://packages.ubuntu.com/precise/x11/, которые я ищу.) Спасибо!

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

printf "deb http://ddebs.ubuntu.com %s main restricted universe multiverse\n" $(lsb_release -cs){,-updates,-security,-proposed} | \
 sudo tee -a /etc/apt/sources.list.d/ddebs.list

чтобы добавить ссылки на репозиторий в /etc/apt/sources.list.d/ddebs.list (Это облегчает удаление репозитория). В качестве альтернативы, вы также можете скопировать каждую из ссылок deb в Источники программного обеспечения и добавить их оттуда (Обратите внимание, что вам, вероятно, нужно будет заменить $(lsb_release -cs) на релиз Ubuntu, который вы используете).

Затем, для Ubuntu 18.04 или более поздних версий, вам нужно выполнить команду установки ключей:

sudo apt install ubuntu-dbgsym-keyring

Затем, для любой версии Ubuntu, выполните:

sudo apt update

Чтобы скачать отладочные символы для package, вы можете просто установить package-dbgsym или, в некоторых случаях, package-dbg. Обратите внимание, что пакеты из PPA не имеют доступных отладочных символов из репозиториев, и это ответственность сопровождающего предоставить пакет, который содержит отладочные символы, обычно в пакете с именем package-dbg.

Отладочные символы устанавливаются в /usr/lib/debug, хотя gdb автоматически считывает отладочные символы, если они доступны, и вам не нужно вручную указывать местоположение для поиска. В зависимости от версии совместимости Debhelper пакета, отладочные символы могут находиться либо в папке с именем идентификатора сборки внутри .build-id (>= 9), либо могут находиться относительно того места, где исполняемый файл будет установлен (< 9). Например, если вы ищете местоположение отладочных символов для /usr/bin/zip, и версия меньше 9, они будут в /usr/lib/debug/usr/bin/zip.

Чтобы удалить все отладочные символы и репозиторий, выполните sudo apt-get remove \.*-dbgsym, чтобы удалить все пакеты -dbgsym, и sudo rm /etc/apt/sources.list.d/ddebs.list, чтобы удалить репозиторий отладочных символов.

Дополняя ответ Эвана: В Ubuntu 18.04 и позднее вы используете команду

sudo apt install ubuntu-dbgsym-keyring

чтобы установить ключи GPG. (Согласно https://wiki.ubuntu.com/Debug%20Symbol%20Packages)

Дополняя ответ saircot859. Вам также нужно установить ключ GPG для репозиториев, как описано здесь: https://wiki.ubuntu.com/Debug%20Symbol%20Packages

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 428D7C01 C8CAB6595FDFF622

Также получите правильный исходный код с помощью apt source

В дополнение к символам, вам также нужно получить исходный код с помощью apt source, как упоминалось в:

и затем указать GDB на них с помощью substitute-path, как упоминалось в: https://stackoverflow.com/questions/23868252/gdb-source-path

Некоторые полностью рабочие команды на Ubuntu 22.04, например, для отладки ls из coreutils следующие.

Сначала мы получаем отладочные символы:

printf "deb http://ddebs.ubuntu.com %s main restricted universe multiverse\n" $(lsb_release -cs){,-updates,-security,-proposed} | \
 sudo tee -a /etc/apt/sources.list.d/ddebs.list
sudo apt install ubuntu-dbgsym-keyring
sudo apt update
sudo apt install coreutils-dbgsym

Затем мы получаем исходный код, как указано в: Ошибка :: Вы должны указать некоторые ‘source’ URI в вашем sources.list

sudo cp /etc/apt/sources.list /etc/apt/sources.list~
sudo sed -Ei 's/^# deb-src /deb-src /' /etc/apt/sources.list
sudo apt update
apt source coreutils

что приводит к созданию директории coreutils-8.32.

Наконец, мы запускаем ls, указывая GDB на загруженный исходный код. В Ubuntu 22.04:

gdb -ex 'set substitute-path . coreutils-8.32' ls

В Ubuntu 23.10 мне вместо этого понадобилось:

gdb -ex "set substitute-path /usr/src/coreutils-9.1-1ubuntu2 coreutils-9.1" ls

И теперь я вижу исходный код правильно, как в:

(gdb) start
Временная точка останова 1 на 0x4d20: файл src/ls.c, строка 1622.
Запуск программы: /usr/bin/ls 
[Отладка потоков с использованием libthread_db включена]
Использование библиотека хоста libthread_db "/lib/x86_64-linux-gnu/libthread_db.so.1".

Временная точка останова 1, main (argc=1, argv=0x7fffffffce08) в src/ls.c:1622
предупреждение: Исходный файл более новый, чем исполняемый файл.
1622    {
(gdb) l
1617      signal_setup (false);
1618    }
1619
1620    int
1621    main (int argc, char **argv)
1622    {
1623      int i;
1624      struct pending *thispend;
1625      int n_files;
1626

Выбор set substitute-path . обусловлен тем, что без substitute-path это вызвало бы ошибку:

1622    src/ls.c: Нет такого файла или директории.

поэтому мы помогаем GDB найти исходный код, заставляя его преобразовать . в coreutils-8.32/, где находится src/. А в Ubuntu 23.10 ошибка была вместо этого:

Не удается отобразить "/usr/src/coreutils-9.1-1ubuntu2/src/ls.c" ([Errno 2] Нет такого файла или директории: '/usr/src/coreutils-9.1-1ubuntu2/src/ls.c')

так что теперь мы хотим, чтобы /usr/src/coreutils-9.1-1ubuntu2 было заменено на coreutils-9.1.

Путь /usr/src из Ubuntu 23.10 на самом деле довольно хорош, разумный подход будет сбросить все исходники туда, чтобы мы могли избежать substitute-path все время. Однако, даже если я сначала выполню cd/usr/src, это все равно не сработает из-за суффикса -1ubuntu2, увы. Но мы могли бы вручную:

sudo cp -rv coreutils-9.1/ /usr/src/coreutils-9.1-1ubuntu2

что позволяет нам просто:

gdb ls

К сожалению, не все пакеты следуют этой конвенции /usr/src, например, в Ubuntu 23.10 libx11-6-dbgsym имел префикс /build/libx11-9By7Fr/libx11-1.8.6/build/src/../../src/XlibInt.c. Однажды мы до этого доберемся.

Отладка GDB в glibc

Тот же самый процесс работает для разделяемых библиотек. Например, чтобы отладить glibc с помощью GDB, как спрашивалось на:

В этом случае отладочные символы уже должны быть предустановлены, иначе нам понадобилось бы:

sudo apt install libc6-dbg

а затем получить исходный код с:

apt source libc6

что приводит к созданию директории: glibc-2.35.

Затем мы создаем программу “Hello World” для тестирования:

main.c

#include <stdio.h>

int main(void) {
    puts("hello");
}

Если мы попробуем скомпилировать, GDB и зайти в glibc

gcc -ggdb3 -O0 -std=c99 -Wall -Wextra -pedantic -o main.out main.c
gdb main.out

как:

(gdb) start
Временная точка останова 1 на 0x1151: файл main.c, строка 4.
Запуск программы: /home/ciro/tmp/main.out 
[Отладка потоков с использованием libthread_db включена]
Использование библиотека хоста libthread_db "/lib/x86_64-linux-gnu/libthread_db.so.1".

Временная точка останова 1, main () в main.c:4
4           puts("hello");
(gdb) s
__GI__IO_puts (str=0x555555556004 "hello") в ./libio/ioputs.c:33
33      ./libio/ioputs.c: Нет такого файла или директории.
(gdb)

мы видим, что библиотека также ищет файлы в ./, так что еще раз мы:

set substitute-path . glibc-2.35

и теперь мы можем видеть исходный код:

(gdb) l
28      #include <string.h>
29      #include <limits.h>
30
31      int
32      _IO_puts (const char *str)
33      {
34        int result = EOF;
35        size_t len = strlen (str);
36        _IO_acquire_lock (stdout);
37

Некоторые другие версии Ubuntu имели исходный код в абсолютном расположении, например:

/tmp/build138741687/

в таком случае вы вместо этого захотите:

set substitute-path /tmp/build138741687/ glibc-2.35

Старый вопрос, но в настоящее время просто для DBG не требуется устанавливать ничего. См. https://ubuntu.com/server/docs/about-debuginfod

Короче говоря, установите это перед запуском gdb:

export DEBUGINFOD_URLS="https://debuginfod.ubuntu.com"

Ответ или решение

Как установить символы отладки для установленных пакетов в Ubuntu

Если вы являетесь разработчиком или специалистом в области IT и хотите более глубоко анализировать выполнение программ на Ubuntu с использованием отладчика, такого как Qt Creator, необходимо установить символы отладки для системных утилит. Это позволит вам видеть стек вызовов в виде исходного кода, а не только в ассемблерном языке. В этом руководстве представлена пошаговая инструкция по установке символов отладки.

Шаг 1: Добавление репозитория символов отладки

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

printf "deb http://ddebs.ubuntu.com %s main restricted universe multiverse\n" $(lsb_release -cs){,-updates,-security,-proposed} | sudo tee -a /etc/apt/sources.list.d/ddebs.list

Эта команда добавит ссылки на репозиторий в файл /etc/apt/sources.list.d/ddebs.list, что упростит его дальнейшее удаление. Вы также можете добавить эти ссылки вручную через меню "Источники программного обеспечения".

Шаг 2: Установка GPG-ключей

Для Ubuntu 18.04 и более поздних версий необходимо установить GPG-ключи, выполнив команду:

sudo apt install ubuntu-dbgsym-keyring

Это обеспечит безопасность и целостность пакетов, которые вы собираетесь установить.

Шаг 3: Обновление списка пакетов

После добавления репозитория и установки ключей, выполните команду обновления списка пакетов:

sudo apt update

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

Шаг 4: Установка символов отладки

Чтобы установить символы отладки для конкретного пакета, выполните следующую команду, заменив package на имя нужного пакета, например coreutils:

sudo apt install coreutils-dbgsym

Отметьте, что для некоторых пакетов может использоваться суффикс -dbg. Если пакет находится в PPA-репозитории, символы отладки должны быть предоставлены отдельно (обычно в пакете с окончанием -dbg).

Шаг 5: Работа с исходным кодом

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

sudo apt source coreutils

Это создаст папку с исходным кодом, которая вам потребуется для анализа.

Шаг 6: Настройка отладчика GDB

Теперь вы можете использовать GDB для отладки утилиты, например, для ls.

Запустите GDB следующим образом, указав путь к загруженному исходному коду, чтобы отладчик мог находить соответствующие файлы:

gdb -ex 'set substitute-path . coreutils-8.32' ls

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

(gdb) start

Шаг 7: Использование debuginfod

В современных версиях Ubuntu не обязательно устанавливать символы отладки вручную. Вы можете использовать debuginfod, который автоматически предоставляет символы отладки. Просто установите переменную окружения перед запуском GDB:

export DEBUGINFOD_URLS="https://debuginfod.ubuntu.com"

Шаг 8: Удаление символов отладки

Если вы решили, что не нуждаетесь в символах отладки, удалить их можно с помощью команды:

sudo apt-get remove \.*-dbgsym

Также не забудьте удалить репозиторий, выполнив:

sudo rm /etc/apt/sources.list.d/ddebs.list

Заключение

Теперь вы знаете, как установить символы отладки для пакетов в Ubuntu и как настроить GDB для работы с ними. Это позволит вам лучше анализировать и отлаживать программы, а также увидеть их внутренние механизмы работы. Если у вас возникнут какие-либо вопросы или потребуется помощь, не стесняйтесь обращаться к сообществу Ubuntu или на специализированные форумы.

Оцените материал
Добавить комментарий

Капча загружается...