programa - estadisticas en c++
Rastreo del acceso de escritura a la clase/intervalo de memoria en gdb (2)
Puedes poner un punto de observación:
watch x
Esto se romperá cuando x
se modifique. x
puede ser cualquier tipo de variable. Si usted tiene:
class A;
A x;
Entonces gdb se romperá siempre que x se modifique.
En realidad, puede poner un punto de observación en cualquier expresión, y gdb se romperá cuando la expresión cambie. Tenga cuidado con esto, sin embargo, porque si la expresión no es algo que el hardware subyacente admite, gdb tendrá que evaluar esto después de cada instrucción, lo que conduce a un rendimiento horrible. Por ejemplo, si A
arriba es una clase con muchos miembros, entonces gdb puede ver toda la instancia x
, pero la forma en que funcionará es:
- ejecutar una instrucción
- saltar al punto de corte de depuración
- verificar si
x
ha cambiado - regresar al programa
Naturalmente, esto es muy lento. Si x
es un int
entonces gdb puede usar un punto de interrupción de hardware.
Si tiene una dirección de memoria específica, puede verla también:
watch *0x1234
Esto se romperá cuando el contenido de [0x1234] cambie.
También puede establecer un punto de interrupción de lectura utilizando rwatch
o awatch
para establecer un punto de interrupción de lectura / escritura.
Estoy intentando depurar un pequeño sistema operativo que escribí en un curso universitario en C ++. En tiempo de ejecución, en algún lugar, uno de mis objetos se corrompe. Parece que esto sucede debido a la escritura accidental en la dirección de memoria incorrecta. Como no puedo encontrar el lugar donde esto sucede simplemente mirando el código, necesito otra manera.
Como este es un sistema operativo, no puedo adjuntar herramientas como valgrind a él, pero puedo ejecutarlo en emuladores (bochs / qemu) con gdb adjunto.
¿Hay alguna forma en gdb para rastrear el acceso de escritura a una instancia de clase o, más en general, un rango de memoria específico? Me gustaría romper tan pronto como se produzca el acceso de escritura, por lo que puedo verificar si esto es válido o no.
Si conoce al menos aproximadamente dónde sucede, también puede usar "mostrar" en lugar de mirar y avanzar manualmente línea por línea hasta que vea cuándo ocurre el cambio. Ver una dirección usando "mirar" es demasiado lento.