Como definir pontos de interrupção em futuras bibliotecas compartilhadas com um sinalizador de comando


92

Estou tentando automatizar uma sessão gdb usando o --commandsinalizador. Estou tentando definir um ponto de interrupção em uma função em uma biblioteca compartilhada (o equivalente Unix de uma DLL). Meu cmds.gdb é parecido com este:

set args /home/shlomi/conf/bugs/kde/font-break.txt
b IA__FcFontMatch
r

No entanto, estou recebendo o seguinte:

shlomi: ~ / progs / bugs-external / kde / font-breaking $ gdb --command = cmds.gdb ...
GNU gdb 6.8-2mdv2009.0 (Mandriva Linux versão 2009.0)
Copyright (C) 2008 Free Software Foundation, Inc.
Licença GPLv3 +: GNU GPL versão 3 ou posterior 
Este é um software livre: você é livre para alterá-lo e redistribuí-lo.
NÃO HÁ GARANTIA, na extensão permitida por lei. Digite "show copying"
e "mostrar garantia" para obter detalhes.
Este GDB foi configurado como "i586-mandriva-linux-gnu" ...
(nenhum símbolo de depuração encontrado)
Função "IA__FcFontMatch" não definida.
Tornar o ponto de interrupção pendente no futuro carregamento da biblioteca compartilhada? (y ou [n]) [respondeu N; entrada não do terminal]

Portanto, ele não define o ponto de interrupção, afinal. Como posso tornar padrão a resposta "y" para definir pontos de interrupção no carregamento futuro da biblioteca compartilhada pendente?

Lembro que fui capaz de fazer algo, mas não consigo lembrar o quê.


Respostas:


149

Respondendo a mim mesmo, gostaria de dar a resposta que alguém me deu no IRC:

(gdb) apropos pendente
ações - Especifique as ações a serem tomadas em um ponto de rastreamento
definir ponto de interrupção - configurações específicas de ponto de interrupção
definir ponto de interrupção pendente - Definir o comportamento do depurador em relação aos pontos de interrupção pendentes
mostrar ponto de interrupção - configurações específicas de ponto de interrupção
mostrar ponto de interrupção pendente - Mostra o comportamento do depurador em relação aos pontos de interrupção pendentes

E então definir ponto de interrupção pendente faz o truque; é usado cmds.gdbcomo, por exemplo

set breakpoint pending on
break <source file name>:<line number>

que me salvou de tentar depurar no Windows 7 usando MinGW, a configuração padrão era diferente do Linux - muito obrigado
bph

Por algum motivo, recebo este erro Program received signal SIGILL, Illegal instruction. Estou obtendo pontos de interrupção de um arquivo, já set breakpoint pending onque alguns de meus pontos de interrupção estão em uma biblioteca que o programa carrega. Se eu adicionar pontos de interrupção manualmente, não haverá erro. Alguém mais está enfrentando um problema semelhante?
brokenfoot

@brokenfoot: Acho que você deve fazer sua pergunta em uma nova pergunta de nível superior, em vez de em um comentário ou resposta aqui. Assim, mais pessoas notarão. Além disso, você deve fornecer mais informações sobre seu sistema.
Shlomi Fish,

11

OT: No terminal, seria assim para depurar o Caja em uma linha:

gdb -ex "set breakpoint pending on" -ex "break gdk_x_error" -ex run --args caja --sync

2
Onde você encontrou a chave 'ex'? Não consigo encontrar nenhuma referência a esse parâmetro na documentação (mas funciona :))
Gearoid Murphy

-exnão funcionou para mim. Tive que colocar os comandos em um arquivo tmp e chamar com:gdb -x /tmp/gdb.commands myexecutible
Jason Moore

5

Sem símbolos.

objdump -t /lib/libacl.so
SYMBOL TABLE:
no symbols
objdump -T /lib/libacl.so
...
00002bd0 g    DF .text  000000d0  ACL_1.0     acl_delete_entry
...


(gdb) break 0x0002bd0 

(gdb) x/20i acl_delete_entry
0x2bd0 <acl_delete_entry>:      stwu    r1,-32(r1)
0x2bd4 <acl_delete_entry+4>:    mflr    r0
0x2bd8 <acl_delete_entry+8>:    stw     r29,20(r1)
0x2bdc <acl_delete_entry+12>:   stw     r30,24(r1)
0x2be0 <acl_delete_entry+16>:   mr      r29,r4
0x2be4 <acl_delete_entry+20>:   li      r4,28972
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.