- Вопрос или проблема
- Ответ или решение
- Шаг 1: Добавление репозитория символов отладки
- Шаг 2: Установка GPG-ключей
- Шаг 3: Обновление списка пакетов
- Шаг 4: Установка символов отладки
- Шаг 5: Работа с исходным кодом
- Шаг 6: Настройка отладчика GDB
- Шаг 7: Использование debuginfod
- Шаг 8: Удаление символов отладки
- Заключение
Вопрос или проблема
Я пытаюсь следить за тем, как работают программы, запуская их с помощью отладчика ‘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
, как упоминалось в:
- Как мне получить и изменить исходный код пакетов, установленных через apt-get?
- Ошибка :: Вы должны указать некоторые ‘source’ URI в вашем sources.list
и затем указать 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, как спрашивалось на:
- https://stackoverflow.com/questions/48476571/get-source-code-for-libc-for-debugging-in-gdb
- https://unix.stackexchange.com/questions/678163/how-can-i-get-glibc-libstdc-sources-and-set-them-up-for-gdb-to-find
В этом случае отладочные символы уже должны быть предустановлены, иначе нам понадобилось бы:
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 или на специализированные форумы.