assistir apenas pausas na gravação, rwatch permite interromper a leitura e despertar permitir interromper a leitura / gravação.
Você pode definir pontos de controle de leitura em locais de memória:
gdb$ rwatch *0xfeedface
Hardware read watchpoint 2: *0xfeedface
mas uma limitação se aplica aos comandos rwatch e awatch; você não pode usar variáveis gdb em expressões:
gdb$ rwatch $ebx+0xec1a04f
Expression cannot be implemented with read/access watchpoint.
Então você tem que expandi-los você mesmo:
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 ()
Edit: Ah, e por falar nisso. Você precisa de suporte de hardware ou software . O software é obviamente muito mais lento. Para descobrir se o seu sistema operacional suporta pontos de controle de hardware, você pode ver a configuração do ambiente can-use-hw-watchpoints .
gdb$ show can-use-hw-watchpoints
Debugger's willingness to use watchpoint hardware is 1.
watch -location mTextFormatted
.print &variable
watch
comandos. Enquanto isso, esta é a primeira pergunta que vem à mente depois de ler o acima. Quantos bytesrwatch *0xfeedface
realmente assistirão?rwatch *(int *)0xfeedface
e ele assistirásizeof(int)
bytes: sourceware.org/gdb/onlinedocs/gdb/Set-Watchpoints. htmlO que você está procurando é chamado de ponto de controle .
Uso
(gdb) watch foo
: observe o valor da variávelfoo
(gdb) watch *(int*)0x12345678
: observe o valor apontado por um endereço , transmitido para o tipo que você deseja(gdb) watch a*b + c/d
: assista a uma expressão arbitrariamente complexa , válida no idioma nativo do programaOs watchpoints são de três tipos:
Você pode escolher o mais apropriado para suas necessidades.
Para mais informações, verifique isso .
fonte
Supondo que a primeira resposta esteja se referindo à sintaxe do tipo C
(char *)(0x135700 +0xec1a04f)
, a resposta a ser feitarwatch *0x135700+0xec1a04f
está incorreta. A sintaxe correta érwatch *(0x135700+0xec1a04f)
.A falta de
()
s lá me causou muita dor ao tentar usar os pontos de controle.fonte
Eu apenas tentei o seguinte:
Parece possível, mas você parece precisar de algum suporte de hardware.
fonte
Use watch para ver quando uma variável é gravada, rwatch quando for lida e desperte quando for lida / gravada de / para, conforme observado acima. No entanto, observe que, para usar este comando, é necessário interromper o programa e a variável deve estar no escopo quando você o interromper:
fonte