Pergunta

Estou executando um aplicativo por meio do gdb e o que eu quero para definir um ponto de interrupção para qualquer momento específico da variável é acessado ou alterado.É um bom método para fazer isso?Eu também estaria interessado em outras formas de monitorar uma variável em C/C++ para ver se ele muda.

Foi útil?

Solução

assistir só quebra na escrita, rwatch permitem quebrar na leitura, e avigiai permitem quebrar em leitura/escrita.

Você pode definir ler watchpoints em localizações de memória:

gdb$ rwatch *0xfeedface
Hardware read watchpoint 2: *0xfeedface

mas uma limitação aplica-se a rwatch e avigiai comandos;você não pode usar o gdb variáveis em expressões:

gdb$ rwatch $ebx+0xec1a04f
Expression cannot be implemented with read/access watchpoint.

Então você tem que expandir-se:

gdb$ print $ebx 
$13 = 0x135700
gdb$ rwatch *0x135700+0xec1a04f
Hardware read watchpoint 3: *0x135700 + 0xec1a04f
gdb$ c
Hardware read watchpoint 3: *0x135700 + 0xec1a04f

Value = 0xec34daf
0x9527d6e7 in objc_msgSend ()

Editar: Ah, e a propósito.Você precisa tanto de hardware ou software de suporte.O Software é, obviamente, muito mais lento.Para descobrir se o seu sistema operacional suporta o hardware watchpoints você pode ver o pode-usar-hw-watchpoints configuração de ambiente.

gdb$ show can-use-hw-watchpoints
Debugger's willingness to use watchpoint hardware is 1.

Outras dicas

Supondo que a primeira resposta está se referindo ao C-sintaxe como a do (char *)(0x135700 +0xec1a04f) em seguida, a resposta para o fazer rwatch *0x135700+0xec1a04f é incorreto.A sintaxe correta é rwatch *(0x135700+0xec1a04f).

A falta de ()não existe causou-me uma grande dor tentando usar watchpoints mim.

O que você está procurando é chamado de um watchpoint.

Utilização

(gdb) watch foo:assista o valor de variável foo

(gdb) watch *(int*)0x12345678:assista o valor apontado por um endereço, escalado para qualquer tipo que você deseja

(gdb) watch a*b + c/d:assistir a um arbitrariamente expressão complexa, válido no programa nativo do idioma

Watchpoints são de três tipos:

  • assistir:o gdb vai quebrar quando um escrever ocorre
  • rwatch:o gdb vai quebrar um wnen leia ocorre
  • avigiai:o gdb vai quebrar ambos os casos

Você pode escolher o mais adequado para as suas necessidades.

Para mais informações, verifique este de fora.

Eu apenas tentei o seguinte:

 $ cat gdbtest.c
 int abc = 43;

 int main()
 {
   abc = 10;
 }
 $ gcc -g -o gdbtest gdbtest.c
 $ gdb gdbtest
 ...
 (gdb) watch abc
 Hardware watchpoint 1: abc
 (gdb) r
 Starting program: /home/mweerden/gdbtest 
 ...

 Old value = 43
 New value = 10
 main () at gdbtest.c:6
 6       }
 (gdb) quit

Assim, parece possível, mas você parece precisar de algum suporte de hardware.

Usar o relógio para ver quando uma variável é escrito, rwatch quando ele é lido e avigiai quando é de leitura/escrita de/para, como observado acima.No entanto, por favor note que para usar este comando, você deve interromper o programa, e a variável tem de ser no âmbito de quando você quebrou o programa:

Use o relógio de comando.O argumento para o comando de ver é um expressão que é avaliada.Isto implica que o variabel você deseja para definir um watchpoint deve estar no escopo atual.Assim, para definir uma watchpoint um não-variável global, você deve ter definido um ponto de interrupção que vai parar o seu programa quando a variável está no escopo.Você definir o watchpoint após o programa de quebras.

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