debugging activará - ¿Puedo establecer un punto de interrupción en 'acceso de memoria' en GDB?




el puntos (5)

Suponiendo que la primera respuesta se refiera a la sintaxis de tipo C (char *)(0x135700 +0xec1a04f) , la respuesta a rwatch *0x135700+0xec1a04f es incorrecta. La sintaxis correcta es rwatch *(0x135700+0xec1a04f) .

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

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.


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.


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 .


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.






debugging gdb breakpoints