Posso definir um ponto de interrupção na "memória de acesso' no GDB?
-
09-06-2019 - |
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.
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.