Pergunta

Alguém pode me dizer como fazer runtime depuração em bibliotecas compartilhadas?

Eu preciso de tempo de execução de depuração uma função na minha biblioteca compartilhada, mas seu chamado por outro programa. Como posso fazer algo como dbx com bibliotecas compartilhadas?

Eu estou usando DBX no AIX. é gdb melhor do que DBX para o que eu estou tentando fazer?.

Foi útil?

Solução

Você só precisa gdb chamada com o executável (não importa se é seu ou um 3o partido). Aqui está um exemplo onde eu depurar o ls comando e definir um ponto de interrupção no (compartilhado) biblioteca c . Este exemplo usa gdb 6.8 (pendente) breakpoints que suporta diferidos que torna isso fácil:

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)

Como você pode ver gdb gerencia automaticamente os tópicos utilizados pelo executável. Você não precisa fazer nada especial para tópicos lá. O ponto de interrupção irá trabalhar em qualquer tópico.

Como alternativa, se você deseja anexar o depurador a um aplicativo em execução (eu uso tail -f / tmp / ttt aqui como um exemplo):

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)

Outras dicas

Normalmente, o procedimento para depurar uma biblioteca compartilhada é o mesmo que para depurar um executável - a principal diferença é que você pode ser incapaz de definir um ponto de interrupção até que a biblioteca compartilhada é carregada na memória. Você anexar o depurador para o executável principal.

Se você está depurando um aplicativo que não é de sua propriedade, mas está usando o seu módulo em uma arquitetura de plug-in, você ainda usa o mesmo método. Certifique-se (como sempre) que você tenha informações de depuração disponíveis para a sua biblioteca compartilhada. No windows, você gerar um arquivo PDB. Com gcc, eu acho que você especificar uma bandeira compilador especial (-g?) Para garantir que as informações de depuração é fornecido. Você anexar o depurador para o aplicativo de terceiros.

Outro exemplo ainda mais a resposta de Lothar:

Estou executando testes em um test.so biblioteca dinâmica (compilado a partir test.c) em Linux usando python e unittest biblioteca de teste de unidade de python chamado tests/test_pwmbasic.py. (Esquema de nomeação é um pouco monótona, eu percebo que agora)

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

Eu quero depurar o que está em test.so de estímulo em test_pwmbasic.py. Então é assim que eu tenho que trabalhar ...

$ 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

e agora eu quero me casar com gdb

Nota: test.c também inclui ../pwm.c, então eu também pode breakpoint dentro dessa biblioteca com

(gdb) b pwm.c:123

Lembro-me testando bibliotecas compartilhadas através da criação de um aplicativo de simulação que usou. Se você está disposto a fazer um monte de trabalho, você pode criar um segundo, zombar biblioteca compartilhada que apenas recolhe informações sobre como a biblioteca está sendo usado por terceiro partido app, e depois ter sua repetição aplicativo falsa essa informação.

Claro, nunca duvide do poder de chamadas printf e fprintf bem colocados.

Tem sido um longo tempo desde que eu tinha que usar dbx no AIX, e eu enfrentei este problema também. Instalando gdb não era uma opção para mim.

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

Você poderia tentar compilar e ligar a biblioteca estaticamente para depurá-lo.
Se o seu erro só aparece quando é compilado como compartilhada, que isso pode dar-lhe algumas pistas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top