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ían otras formas de monitorear una variable en C/C++ para ver si cambia.¿Puedo establecer un punto de interrupción en 'acceso a memoria' en GDB?
Respuesta
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.
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.
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
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.
Sí, puedes. http://www.technochakra.com/debugging-types-of-data-breakpoints-in-gdb/ analiza varios puntos de interrupción de datos para gdb.
El enlace se ha quedado obsoleto. – eush77
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.
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.
Escribí ** otra ** respuesta porque las existentes no me parecían muy sencillas ... –
- 1. Establecer un punto de interrupción en GDB
- 2. gdb punto de interrupción en pthread_create
- 3. Después de establecer un punto de interrupción en Qt, el BGF dice: "Error de acceso a la dirección de memoria"
- 4. gdb, establecer punto de interrupción en todas las funciones en un archivo
- 5. ¿Cómo funciona un depurador como gdb para establecer un punto de interrupción a través de JTAG?
- 6. ¿Cómo saltar a un punto de interrupción dentro de gdb?
- 7. ¿Cómo establecer un punto de interrupción en gdb para todas las invocaciones de una función?
- 8. pausa gdb sin punto de interrupción
- 9. GoogleTest: cómo establecer un punto de interrupción?
- 10. gdb: establezca un punto de interrupción para un manejador SIGBUS
- 11. Establecer el punto de interrupción en el código C o C++ programáticamente para gdb en Linux
- 12. ¿cómo puedo poner un punto de interrupción en "algo está impreso en el terminal" en gdb?
- 13. Establecer un punto de interrupción en una plantilla T4
- 14. ¿Es posible establecer un punto de interrupción en funciones anónimas?
- 15. GDB cómo detener la ejecución sin un punto de interrupción?
- 16. ¿Hay alguna forma de establecer un punto de interrupción en gdb que sea condicional en la pila de llamadas?
- 17. ¿Puedo establecer un punto de interrupción cuando la variable obtiene un valor específico en .NET?
- 18. cómo establecer el punto de interrupción en la función en una biblioteca compartida que no se ha cargado en gdb
- 19. Establecer el punto de observación del hardware GDB/cómo configurar el punto de observación del software
- 20. punto de corte condicional GDB en tipos arbitrarios
- 21. Cómo configuro un punto de interrupción en cada acceso a una clase
- 22. punto de interrupción condicional en Visual Studio
- 23. Establecimiento de punto de interrupción en GDB donde la función devuelve
- 24. ¿Cómo establecer un punto de interrupción en un archivo de un proyecto que tiene muchos archivos con el mismo nombre?
- 25. ¿Cómo establecer un punto de interrupción en Eclipse en una biblioteca de terceros?
- 26. SIGTRAP a pesar de no establecer puntos de interrupción; punto de corte de hardware oculto?
- 27. Configuración de punto de interrupción en NSKVODeallocateBreak
- 28. Cómo puedo establecer puntos de interrupción en un script JS externo en Firebug
- 29. Cómo establecer un punto de interrupción en un proyecto xcode dependiente
- 30. ¿Puedo activar un punto de interrupción en los errores de OpenGL en Xcode 4?
Si desea ver un miembro de un método de C++, esta variante me pareció inmensamente útil: 'watch -location mTextFormatted'. –
¿Qué sucede si no tengo la dirección de una variable? ¿Puedo usar su nombre? –
Puede hacer que GDB imprima la dirección de la variable con el operador de dirección. 'print & variable' – Loduwijk