visual ventajas uso tiene studio que puntos punto puede los interrupción interrupcion ejecucion documento desencadenado condicional codigo cargar aplicativo actualmente activará debugging gdb breakpoints

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



que ventajas tiene el uso de puntos de interrupcion en la ejecucion de un aplicativo (5)

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 .


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.


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.