Pergunta

Eu gostaria de saber de onde dentro de um enorme Aplicação Uma determinada mensagem é impressa. O aplicativo é tão grande e antigo que usa todas as maneiras concebíveis de imprimir texto no terminal; Por exemplo, printf (), fprintf (stdout, ...) etc.

Escrevo para colocar um ponto de interrupção na chamada do sistema write (), mas depois estou inundado com muitas paradas de ponto de interrupção por causa de várias operações de E/S de arquivo que usam Write () também.

Então, basicamente, quero que o GDB pare sempre que o programa imprime algo para o terminal, mas ao mesmo tempo não quero que o GDB pare quando o programa gravar algo em um arquivo.

Foi útil?

Solução

Use um ponto de interrupção condicional que verifique o primeiro parâmetro. Em sistemas x86 de 64 bits, a condição seria:

(gdb) b escreva se 1 == $ rdi

Em sistemas de 32 bits, é mais complexo porque o parâmetro está na pilha, o que significa que você precisa lançar $ esp para um int * e indexar o parâmetro FD. A pilha nesse ponto tem o endereço de retorno, o comprimento, o buffer e finalmente o FD.

Isso varia muito entre plataformas de hardware.

Outras dicas

Com o GDB 7.0, você pode definir o ponto de interrupção condicional no syscall write ():

(gdb) catch syscall write
Catchpoint 1 (syscall 'write' [4])
(gdb) condition 1 $ebx==1

$ ebx contém o primeiro parâmetro syscall - número FD aqui

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