Как использовать библиотеки отладки в Ubuntu
Моя текущая проблема связана с libwebkitgtk-3.0-0, но я думаю, что эта проблема достаточно общая.
Мое приложение падает где-то в коде webkit. Я предполагаю, что мы делаем глупости и хотим узнать, что. Проще всего будет установить точку останова или использовать отладочную версию библиотеки.
Как получить точный исходный код, с помощью которого была построена библиотека? Я получаю трассировку стека после того, как он выгружает ядро, но номер строки GDB говорит, что не совпадают с теми, что я вижу в коде. Другими словами, если я установлю libwebkitgtk-3.0-0, я хочу получить точный исходный код этого.
Я установил отладочную версию библиотеки webkit. Имеют ли эти отладочные версии те же функции, что и при компиляции webkit с флагом --enable-debug? Отладочные версии webkit включают ведение логов на основе переменной среды WEBKIT_DEBUG, но я не смог получить такую же логи, даже если использовал отладочную версию библиотеки.
Как использовать отладочную версию, которую мне удалось скомпилировать? Мне удалось скомпилировать 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
Оставьте выделенные курсивом строки, если вы находитесь на стадии разработки (альфа или бета). Убедитесь, что добавили их, если вы продолжите использовать релиз после стабильной версии.
Эти команды делают три вещи:
- Создать файл
/etc/apt/sources.list.d/ddebs.list
(который содержит линии DEB). - Импортируйте ключ подписи для этих репозиториев.
- Обновите информацию о вашей системе о том, какие пакеты и версии доступны для установки откуда.
Так что если вы когда-нибудь захотите использовать -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