Pregunta

Estoy ejecutando una aplicación a través de gdb y quiero establecer un punto de interrupción cada vez que se accede o cambia una variable específica.¿Existe un buen método para hacer esto?También me interesarían otras formas de monitorear una variable en C/C++ para ver si cambia y cuándo.

¿Fue útil?

Solución

mirar solo se interrumpe al escribir, rver dejarte interrumpir la lectura, y un reloj le permite interrumpir la lectura/escritura.

Puede configurar puntos de vigilancia de lectura en ubicaciones de memoria:

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

pero se aplica una limitación a los comandos rwatch y awatch;No puede usar variables GDB en expresiones:

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

Entonces tienes que expandirlos tú mismo:

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.Necesitas cualquiera de los hardware o soporte de software.El software es obviamente mucho más lento.Para saber si su sistema operativo admite puntos de vigilancia de hardware, puede ver la puedo-usar-puntos-de-vigilancia-hw configuración del entorno.

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

Otros consejos

Suponiendo que la primera respuesta se refiere a la sintaxis similar a C (char *)(0x135700 +0xec1a04f) entonces la respuesta a hacer rwatch *0x135700+0xec1a04f Es incorrecto.La sintaxis correcta es rwatch *(0x135700+0xec1a04f).

La falta de ()Eso me causó mucho dolor al tratar de usar los puntos de vigilancia yo mismo.

Lo que estás buscando se llama punto de vigilancia.

Uso

(gdb) watch foo:observar el valor de variable foo

(gdb) watch *(int*)0x12345678:observe el valor señalado por un DIRECCIÓN, emitido al tipo que quieras

(gdb) watch a*b + c/d:mirar arbitrariamente expresión compleja, válido en el idioma nativo del programa

Los puntos de vigilancia son de tres tipos:

  • mirar:gdb se romperá cuando un escribir ocurre
  • rver:gdb se romperá cuando haya un leer ocurre
  • un reloj:gdb entrará ambos casos

Podrás elegir el más adecuado a tus necesidades.

Para más información, consulte este afuera.

Intenté 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

Parece posible, pero parece que necesita algún soporte de hardware.

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top