2008-09-12 12 views

Respuesta

240

reloj sólo se rompe en la escritura, rwatch vamos a romper en lectura y awatch dejar que se rompe en lectura/escritura.

Puede establecer puntos de observación leer en las posiciones de memoria:

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

pero una limitación se aplica a la rwatch y los comandos de awatch; no se puede utilizar variables GDB en expresiones:

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

lo que tiene que ampliar su propia cuenta:

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, y por cierto. Necesita hardware o soporte de software. El software obviamente es mucho más lento. Para saber si su sistema operativo admite puntos de control de hardware, puede ver la configuración de entorno can-use-hw-watchpoints.

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

Si desea ver un miembro de un método de C++, esta variante me pareció inmensamente útil: 'watch -location mTextFormatted'. –

+0

¿Qué sucede si no tengo la dirección de una variable? ¿Puedo usar su nombre? –

+5

Puede hacer que GDB imprima la dirección de la variable con el operador de dirección. 'print & variable' – Loduwijk

9

he intentado lo siguiente:

$ 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 

Por lo que parece posible, pero usted parece necesitar algo de ayuda del hardware.

+0

Si su plataforma no es compatible con los puntos de observación del hardware, el gdb debe volver a un punto de observación del software. – Tod

22

Suponiendo que la primera respuesta se refiere a la sintaxis de C-como (char *)(0x135700 +0xec1a04f) entonces la respuesta que ver rwatch *0x135700+0xec1a04f es incorrecto. La sintaxis correcta es rwatch *(0x135700+0xec1a04f).

La falta de () s me causó mucho dolor al tratar de usar los puntos de observación.

1

Utilice watch para ver cuándo se escribe una variable, rwatch cuando se lee y awatch cuando se lee/escribe desde/a, como se indicó anteriormente. Sin embargo, tenga en cuenta que para usar este comando, debe romper el programa, y ​​la variable debe estar dentro del alcance cuando haya roto el programa:

Use el comando watch. El argumento del comando watch es una expresión que se evalúa. Esto implica que la variabel en la que desea para establecer un punto de observación debe estar dentro del alcance actual. Por lo tanto, para establecer un punto de observación en una variable no global, debe haber establecido un punto de interrupción que detendrá su programa cuando la variable esté dentro del alcance. Establece el punto de vigilancia después de que se rompe el programa.

14

Lo que estás buscando se llama punto de observación.

Uso

(gdb) watch foo: ver el valor de variable defoo

(gdb) watch *(int*)0x12345678: ver el valor señalado por una dirección, fundido a cualquier tipo que desee

(gdb) watch a*b + c/d: Reloj una expresión compleja arbitrariamente , va tapa en su idioma nativo del programa de

puntos de observación son de tres tipos:

  • reloj: BGF se romperá cuando un escritura se produce
  • rwatch: BGF romper wnen un leer ocurre
  • awatch: gdb se romperá en ambos casos

Puede elegir la más adecuada para sus necesidades.

Para obtener más información, consulte this.

+3

Escribí ** otra ** respuesta porque las existentes no me parecían muy sencillas ... –

Cuestiones relacionadas