Как отлаживать общие библиотеки во время выполнения?

StackOverflow https://stackoverflow.com/questions/801423

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

Вам просто нужно вызвать gdb с исполняемым файлом (неважно, ваш он или сторонний).Вот пример, где я отлаживаю лс команду и установите точку останова в (общем) библиотека 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 автоматически управляет всеми потоками, используемыми исполняемым файлом.Для потоков там не нужно делать ничего особенного.Точка останова будет работать в любом потоке.

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

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)

Другие советы

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

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

Еще один пример в дополнение к ответу Лотара:

Я провожу тесты в динамической библиотеке 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

и теперь я хочу выйти замуж за ГДБ

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

(gdb) b pwm.c:123

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

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

Давно мне не приходилось использовать 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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top