Как во время выполнения отлаживать разделяемые библиотеки? - PullRequest
36 голосов
/ 29 апреля 2009

Может кто-нибудь сказать мне, как выполнить отладку во время выполнения на общих библиотеках?

Мне нужно во время выполнения отладить функцию в моей общей библиотеке, но она вызывается другой программой. Как я могу сделать что-то вроде dbx с общими библиотеками?

Я использую dbx в AIX. GDB лучше, чем DBX для того, что я пытаюсь сделать?

Ответы [ 6 ]

30 голосов
/ 28 мая 2009

Вам просто нужно вызвать gdb с исполняемым файлом (не важно, ваш это или сторонний). Вот пример, где я отлаживаю команду ls и устанавливаю точку останова в (общей) c библиотеке . В этом примере используется gdb 6.8, который поддерживает отложенные (ожидающие) точки останова, что облегчает это:

gdb /bin/ls
GNU gdb 6.8-debian
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu"...
(no debugging symbols found)
(gdb) b write
Function "write" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 1 (write) pending.
(gdb) r
Starting program: /bin/ls
(no debugging symbols found)
(no debugging symbols found)
(no debugging symbols found)
(no debugging symbols found)
(no debugging symbols found)
(no debugging symbols found)
(no debugging symbols found)
[Thread debugging using libthread_db enabled]
(no debugging symbols found)
(no debugging symbols found)
[New Thread 0x7f98d2d23780 (LWP 7029)]
[Switching to Thread 0x7f98d2d23780 (LWP 7029)]

Breakpoint 1, 0x00007f98d2264bb0 in write () from /lib/libc.so.6
(gdb)

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

В качестве альтернативы, если вы хотите присоединить отладчик к уже запущенному приложению (я использую tail -f / tmp / ttt здесь в качестве примера):

ps ux | grep tail
lothar    8496  0.0  0.0   9352   804 pts/3    S+   12:38   0:00 tail -f /tmp/ttt
lothar    8510  0.0  0.0   5164   840 pts/4    S+   12:39   0:00 grep tail

gdb
GNU gdb 6.8-debian
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu"...
(no debugging symbols found)
(gdb) attach 8496
Attaching to program: /usr/bin/tail, process 8496
Reading symbols from /lib/librt.so.1...(no debugging symbols found)...done.
Loaded symbols for /lib/librt.so.1
Reading symbols from /lib/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib/libc.so.6
Reading symbols from /lib/libpthread.so.0...(no debugging symbols found)...done.
[Thread debugging using libthread_db enabled]
[New Thread 0x7f24853f56e0 (LWP 8496)]
Loaded symbols for /lib/libpthread.so.0
Reading symbols from /lib/ld-linux-x86-64.so.2...
(no debugging symbols found)...done.
Loaded symbols for /lib64/ld-linux-x86-64.so.2
(no debugging symbols found)
0x00007f2484d2bb50 in nanosleep () from /lib/libc.so.6
(gdb) b write
Breakpoint 1 at 0x7f2484d57bb0
(gdb) c
Continuing.
[Switching to Thread 0x7f24853f56e0 (LWP 8496)]

Breakpoint 1, 0x00007f2484d57bb0 in write () from /lib/libc.so.6
(gdb)
9 голосов
/ 29 апреля 2009

Обычно процедура отладки разделяемой библиотеки во многом аналогична отладке исполняемого файла - главное отличие в том, что вы не сможете установить точку останова, пока разделяемая библиотека не будет загружена в память. Вы присоединяете отладчик к основному исполняемому файлу.

Если вы отлаживаете приложение, которое не принадлежит вам, но использует ваш модуль в архитектуре плагина, вы все равно используете тот же метод. Убедитесь, что (как всегда) у вас есть отладочная информация для вашей общей библиотеки. В Windows вы должны создать файл .pdb. С gcc, я думаю, вы указываете специальный флаг компилятора (-g?), Чтобы обеспечить предоставление информации об отладке. Вы присоединяете отладчик к стороннему приложению.

3 голосов
/ 29 июня 2016

Еще один пример, следующий за ответом Лотара:

Я запускаю тесты для динамической библиотеки test.so (скомпилированной из test.c) в Linux с использованием python и библиотекой юнит-тестирования python unittest с именем tests/test_pwmbasic.py. (схема именования немного монотонна, теперь я это понимаю)

~/my/test/path/
    tests/
        __init__.py
        test_pwmbasic.py
    test.c
    test.so

Я хочу отладить, что в test.so от стимула в test_pwmbasic.py. Так вот как у меня все получилось ...

$ cd ~/my/test/path
$ gdb $(which python)
   ... gdb blah ...
(gdb) b test.c:179
(gdb) run
>>> from tests.test_pwmbasic import *
>>> import unittest
>>> unittest.main()
   ... unittest blah ...
Breakpoint 1, pwmTest_setDutyCycles (dutyCycles=0x7ffff7ece910) at ./test.c:179
(gdb) print pwm_errorCode
$1 = PWM_ERROR_NONE

и теперь я хочу жениться на GDB

примечание: test.c также включает ../pwm.c, поэтому я могу также установить точку останова в этой библиотеке с помощью

(gdb) b pwm.c:123
1 голос
/ 18 февраля 2015

Прошло много времени с тех пор, как я использовал dbx в AIX, и я тоже столкнулся с этой проблемой. Установка gdb была для меня невозможной.

dbx  /path/to/your/program
(dbx) run [args to your program]
(dbx) set $ignoreonbptrap           # I kept hitting a trace/bpt trap
(dbx) set $deferevents              # allows setting bp in not loaded shared library
(dbx) set $repeat                   # useful, repeat commands with <enter> tjust like gdb
(dbx) stop in MySharedLibraryFunc   # defers breakpoint
(dbx) cont
1 голос
/ 26 мая 2009

Я помню, как тестировал разделяемые библиотеки, создав имитирующее приложение, которое им пользовалось. Если вы готовы проделать большую работу, вы можете создать вторую, макетную разделяемую библиотеку, которая просто собирает информацию о том, как библиотека используется сторонним приложением, а затем воспроизводит эту информацию в вашем макете.

Конечно, никогда не сомневайтесь в силе удачно расположенных вызовов printf и fprintf.

0 голосов
/ 28 мая 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...