Как использовать библиотеки отладки в Ubuntu

Моя текущая проблема связана с libwebkitgtk-3.0-0, но я думаю, что эта проблема достаточно общая.

Мое приложение падает где-то в коде webkit. Я предполагаю, что мы делаем глупости и хотим узнать, что. Проще всего будет установить точку останова или использовать отладочную версию библиотеки.

  1. Как получить точный исходный код, с помощью которого была построена библиотека? Я получаю трассировку стека после того, как он выгружает ядро, но номер строки GDB говорит, что не совпадают с теми, что я вижу в коде. Другими словами, если я установлю libwebkitgtk-3.0-0, я хочу получить точный исходный код этого.

  2. Я установил отладочную версию библиотеки webkit. Имеют ли эти отладочные версии те же функции, что и при компиляции webkit с флагом --enable-debug? Отладочные версии webkit включают ведение логов на основе переменной среды WEBKIT_DEBUG, но я не смог получить такую ​​же логи, даже если использовал отладочную версию библиотеки.

  3. Как использовать отладочную версию, которую мне удалось скомпилировать? Мне удалось скомпилировать webkit на моей машине и попытаться поиграться с путями загрузки и тому подобным. Мое приложение не получает новую разделяемую библиотеку независимо от того, что я делаю, - я могу сказать, основываясь на подписи агента пользователя. В какой-то момент мне удалось подобрать библиотеку, но затем SSL перестает работать. Та же проблема SSL случается с GtkLauncher. Так что я где-то ошибаюсь.

Спасибо за указатели.

3 ответа

Решение

1) Когда мне нужно покопаться в библиотеке, которую я установил через пакет, первое, что я делаю, это устанавливаю ее из исходного кода. Я имею в виду configur / make / make install. Обычно я помещаю исходный код в / usr / local / src и устанавливаю его в / usr / local. Это, на мой взгляд, самый надежный способ запуска точного кода, для которого у вас есть источник.

3)

Как использовать отладочную версию, которую мне удалось скомпилировать?

Похоже, вы сделали то, что я описал выше. Что вам нужно сделать, так это убедиться, что ваше программное обеспечение использует каталоги include и link, в которых находится ваша скомпилированная библиотека с поддержкой отладки. Это означает, что установлены флаги -I/usr/local/include и -L /usr/local/lib и они располагаются перед / usr / include и / usr / lib.

Вы можете быть еще более уверенным, удалив двоичную версию библиотек из установки Ubuntu, убедившись, что эта версия, которую вы создали и установили, является единственной версией, представленной на жестком диске. Таким образом, вы будете точно знать, что вы смогли настроить свое приложение для использования этой библиотеки. В противном случае он просто потерпит неудачу, вместо того, чтобы постоянно интересоваться, использует ли он новую или старую библиотеку.

2) Обычно да. Но это будет зависеть от того, как написана библиотека, и от того, что решил сделать упаковщик Ubuntu.

После того, как вы скомпилируете программу, используя вашу локально собранную библиотеку, посмотрите, если вы получаете ту же самую ошибку в первую очередь. Если нет, то это тоже точка данных. Возможно, проблема была решена с тех пор, как ubuntu в последний раз упаковывал библиотеку. Возможно библиотека не упакована должным образом, и в этом проблема. Вы можете даже получить новые ошибки, потому что упаковщик ubuntu настроил библиотеку определенным образом, чтобы она работала, а вы не сделали то же самое. В любом случае вы получите интересные ссылки.

Удачи

TL;DR: Установить libwebkitgtk-3.0-0-dbg Установить libwebkitgtk-3.0-0-dbg http://hostmar.co/software-small, после чего у вас появятся необходимые символы отладки.

Для символов отладки вам обычно не нужно устанавливать из исходного кода.

Как вы знаете, чтобы получить символы отладки для программного обеспечения, которое вы создаете самостоятельно, вы можете запустить GCC с -g,

Для программного обеспечения, установленного через менеджер пакетов вашей операционной системы (который включает libwebkitgtk-3.0-0 здесь), по крайней мере, для официальных пакетов, обычно есть также пакеты с символами отладки.

На самом деле вам не нужно иметь отладочную сборку программы или библиотеки, чтобы получить символьную трассировку стека в gdb, gdb также поддерживает файлы, предоставляющие дополнительные символы отладки в /usr/lib/debug,

Вы используете Ubuntu, в соответствии с тегами на ваш вопрос. В Ubuntu пакеты отладочных символов доступны в двух вариантах: -dbg а также -dbgsym, Программа или библиотека, расположенная по адресу /path получает символы отладки в /usr/lib/debug/path,

-dbg пакеты

Эти пакеты часто называются по-разному от соответствующих пакетов, предоставляющих фактические исполняемые файлы или файлы библиотеки. Их часто называют аналогично -dev пакеты (которые предоставляют заголовочные файлы) и -doc пакеты. -dbg Пакет иногда имеет меньше нумерации версий библиотеки в имени, чем фактические пакеты библиотеки, иногда покрывая двоичные файлы, предоставляемые во многих других пакетах.

Например, libgtkmm-3.0-1 соответствует -dbg пакет libgtkmm-3.0-dbg,

С другой стороны, иногда -dbg пакет называется так же, как пакет, символы которого он предоставляет (за исключением -dbg суффикс). Например, libwebkitgtk-3.0-0 соответствует -dbg пакет libwebkitgtk-3.0-0-dbg , Это тот, который вы хотите.

Вы можете установить его в Центре программного обеспечения или запустив:

sudo apt-get update && sudo apt-get install libwebkitgtk-3.0-0-dbg

Теперь, когда вы отлаживаете программу, которая ссылается на библиотеку, предоставленную libwebkitgtk-3.0-0, gdb автоматически загрузит символы из файла, предоставленного libwebkitgtk-3.0-0-dbg,

-dbgsym пакеты

Иногда двоичные исполняемые файлы, предоставляемые официальным пакетом, не имеют символов, предоставленных в любом -dbg пакет. Когда это происходит, обычно вы можете установить -dbgsym пакет.

В отличие от -dbg пакеты, -dbgsym пакеты:

  • почти всегда просто (и предсказуемо) названы X-dbgsym где X пакет, предоставляющий саму программу или библиотеку
  • предоставляются специальными программными источниками (репозиториями), а не теми же программными источниками, которые предоставляют соответствующие пакеты программ / библиотек и -dbg пакеты.

поскольку -dbgsym пакеты находятся в отдельных репозиториях, вы должны включить эти репозитории. Их линии DEB:

deb http://ddebs.ubuntu.com YOUR_RELEASE main restricted universe multiverse
deb http://ddebs.ubuntu.com YOUR_RELEASE-updates main restricted universe multiverse
deb http://ddebs.ubuntu.com YOUR_RELEASE-security main restricted universe multiverse
deb http://ddebs.ubuntu.com YOUR_RELEASE-proposed main restricted universe multiverse

Чтобы включить их, вы можете запустить эти команды (адаптированные из https://wiki.ubuntu.com/DebuggingProgramCrash в разделе "Участники вики документации по Ubuntu", раздел 2):

echo "deb http://ddebs.ubuntu.com $(lsb_release -cs) main restricted universe multiverse
deb http://ddebs.ubuntu.com $(lsb_release -cs)-updates main restricted universe multiverse
deb http://ddebs.ubuntu.com $(lsb_release -cs)-security main restricted universe multiverse
deb http://ddebs.ubuntu.com $(lsb_release -cs)-proposed main restricted universe multiverse
" | sudo tee -a /etc/apt/sources.list.d/ddebs.list
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 428D7C01
sudo apt-get update

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

Эти команды делают три вещи:

  1. Создать файл /etc/apt/sources.list.d/ddebs.list (который содержит линии DEB).
  2. Импортируйте ключ подписи для этих репозиториев.
  3. Обновите информацию о вашей системе о том, какие пакеты и версии доступны для установки откуда.

Так что если вы когда-нибудь захотите использовать -dbgsym символы вместо -dbg предоставленные символы, -dbgsym пакет для libwebkitgtk-3.0-0 есть (в соответствии с простым соглашением об именах, приведенным выше) libwebkitgtk-3.0-0-dbgsym,

Вы можете иметь оба -dbg а также -dbgsym пакеты, установленные в одной и той же системе, но не в том случае, если они предоставляют символы для одного и того же файла. Так libwebkitgtk-3.0-0-dbg а также libwebkitgtk-3.0-0-dbgsym конфликтовать друг с другом; они не могут быть установлены одновременно (одновременно).

Использование символов

На большинстве Unix-подобных ОС отладчик будет автоматически искать установленные символы. Ubuntu ничем не отличается - в Ubuntu, gdb автоматически ищет их в /usr/lib/debug, Так что вам не нужно делать ничего особенного.

Тем не менее, если вам когда-либо нужно было сказать gdb чтобы загрузить определенный файл символов отладки, вы должны использовать -s file флаг. Подробности смотрите в руководстве GNU и gdb(1).

@ Ответ Елии говорит о том, как получить символы удобным способом.

Остается вопрос: "Как я могу получить точный исходный код?",

Я обычно делаю apt-get source <pkgname> что хорошо, за исключением того, что я должен вручную сказать GDB dir <path-to-wherever-I-put-the-source> и горе, если это пакет, такой как eglibc, где нужно выяснить, что ссылки на пути получены из nss подкаталог, а не рут.

На RHEL каждый просто делает, например, yum install --enable-repo rhel-debuginfo libX11-debuginfo (просто yum install libX11-debuginfo на CentOS 7), и вы сразу получаете полные символы и исходники в gdb без лишних хлопот. Я все еще ищу это удобство в Ubuntu.

Для отладки в динамических библиотеках вы можете добавить dgb gears с пакетами символов и исходных дистрибутивов, как было предложено. Затем необходимо проверить, соответствуют ли каталоги компиляции таблицы символов отладки путям установленного источника, если это не так, вы должны отобразить пути в gdb. Следуйте командам, чтобы включить отладку glibc

$ objdump -g /usr/lib/debug/lib/x86_64-linux-gnu/libc-2.27.so | sed -n '/<.*>\s\+DW_AT_comp_dir/ {s/\s\+<.*>\s\+//; p;}' | sort | uniq
DW_AT_comp_dir : (indirect string, offset: 0x1127a): /build/glibc-OTsEL5/glibc-2.27/malloc
...
DW_AT_comp_dir : (indirect string, offset: 0xd139): /build/glibc-OTsEL5/glibc-2.27/stdio-common
DW_AT_comp_dir : (indirect string, offset: 0xef40): /build/glibc-OTsEL5/glibc-2.27/libio
$ ls -ld glibc-2.27/{stdio-common,libio}
drwxrwxr-x 3 fusillator fusillator 12288 feb 1 2018 glibc-2.27/libio
drwxrwxr-x 3 fusillator fusillator 4096 feb 1 2018 glibc-2.27/stdio-common
$ gdb ./hello
Reading symbols from ./hello...done.
(gdb) set substitute-path /build/glibc-OTsEL5/glibc-2.27 glibc-2.27
(gdb) b main
Breakpoint 1 at 0x63e: file hello.c, line 10.
(gdb) run
Starting program: hello
Breakpoint 1, main () at hello.c:10
10 printf("hello world\n");
(gdb) s
_IO_puts (str=0x5555555546e4 "hello world") at ioputs.c:33
33 {
(gdb) backtrace
#0 _IO_puts (str=0x5555555546e4 "hello world") at ioputs.c:33
#1 0x000055555555464a in main () at hello.c:10
Другие вопросы по тегам