debugging - visual - ventajas de los puntos de interrupcion




¿Puedo establecer un punto de interrupción en 'acceso de memoria' en GDB? (4)

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


Acabo de intentar 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

Así que parece posible, pero parece que necesitas algún soporte de hardware.


Lo que buscas se llama mirador .

Uso

(gdb) watch foo : mira el valor de la variable foo

(gdb) watch *(int*)0x12345678 : vea el valor señalado por una dirección , convertida en el tipo que desee

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

Los puntos de observación son de tres tipos:

  • reloj : gdb se romperá cuando se produce una escritura
  • rwatch : gdb se romperá cuando ocurra una lectura
  • awatch : gdb se romperá en ambos casos

Usted puede elegir el más apropiado para sus necesidades.

Para más información, mira sourceware.org/gdb/onlinedocs/gdb/Set-Watchpoints.html .


Use 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:

Usa el comando de reloj. El argumento del comando watch es una expresión que se evalúa. Esto implica que el variabel con el que desea establecer un punto de observación debe estar en el 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. Usted establece el punto de observación después de que se rompa el programa.


ver solo las interrupciones en escritura, rwatch le permite interrumpir la lectura, y la vigilancia le permite interrumpir la lectura / escritura.

Puede establecer puntos de control de lectura en ubicaciones de memoria:

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

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

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

Así que tienes que ampliarlos 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 ()

Edit: Ah, y por cierto. Necesita soporte de hardware o software . El software es obviamente mucho más lento. Para saber si su sistema operativo admite puntos de control de hardware, puede ver la configuración del entorno can-use-hw-watchpoints .

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




breakpoints