Ver un rango de memoria en gdb?

Estoy depurando un programa en gdb y quiero que el programa se detenga cuando se acceda a la región de memoria 0x08049000 a 0x0804a000. Cuando trato de establecer puntos de interrupción de memoria manualmente, gdb no parece admitir más de dos ubicaciones a la vez.

(gdb) awatch *0x08049000
Hardware access (read/write) watchpoint 1: *0x08049000
(gdb) awatch *0x08049001
Hardware access (read/write) watchpoint 2: *0x08049001
(gdb) awatch *0x08049002
Hardware access (read/write) watchpoint 3: *0x08049002
(gdb) run
Starting program: /home/iblue/git/some-code/some-executable
Warning:
Could not insert hardware watchpoint 3.
Could not insert hardware breakpoints:
You may have requested too many hardware breakpoints/watchpoints.

Ya hay una pregunta donde se ha hecho esto y la respuesta fue que es posible hacer esto con valgrind. Desafortunadamente, la respuesta no contiene ningún ejemplo o referencia al manual de valgrind, por lo que no fue muy esclarecedor: ¿Cómo se puede utilizar gdb para observar cualquier cambio en una región completa de la memoria?

Entonces: ¿Cómo puedo ver toda la región de memoria?

preguntado el 12 de junio de 12 a las 21:06

Dato interesante: PowerPC tiene puntos de interrupción a distancia (¿pero no puntos de observación?): stackoverflow.com/questions/13410941/… -

2 Respuestas

Si usa GDB 7.4 junto con Valgrind 3.7.0, entonces tiene puntos de vigilancia de hardware "emulados" ilimitados.

Inicie su programa bajo Valgrind, dando los argumentos --vgdb=full --vgdb-error=0 luego use GDB para conectarse a él (target remote | vgdb). Entonces puedes por ejemplo watch or awatch or rwatch un rango de memoria haciendo rwatch (char[100]) *0x5180040

Vea el manual de usuario de Valgrind sobre la integración de gdb para más detalles

Respondido el 17 de junio de 12 a las 18:06

Después de pasar la mayor parte del día jugueteando con mprotect y abusando de los controladores SIGSEV para interrumpir el acceso a la memoria, probé esto. Funciona perfectamente. Salvaste mi día. ¡Gracias! - iazul

Sí, +1 también. He estado buscando una función como esta durante meses. - Crashworks

Entonces, ¿cómo se determina la dirección del montón para el proceso iniciado por valgrind? Normalmente hago esto a través de / proc / [pid] / maps pero cuando inicio python a través de este comando valgrind, el archivo de mapas no tiene una entrada identificada por [montón] como estoy acostumbrado a encontrar. - Andrés Falanga

Me doy cuenta de que esta respuesta se escribió hace mucho tiempo, pero esta respuesta me confunde, porque gdb puede hacerlo solo, sin la ayuda de valgrind. Al menos ahora puede. Recurrirá a un solo paso y verificará repetidamente. Obviamente, eso es muy costoso (como lo es valgrind), por lo que lo reduciría a cuando la corrupción está a punto de ocurrir pronto, luego crearía el punto de observación, para que no funcione lentamente durante toda la ejecución de depuración. - doug65536

La característica que detecta cuando una dirección de memoria ha cambiado se llama un punto de interrupción de hardware, y en realidad es una función de la CPU: un registro dentro del controlador de memoria que detecta cuándo se accede a una dirección específica y activa una interrupción del depurador. Desafortunadamente la arquitectura x86 solo tiene cuatro de esos registros y es por eso que está limitado en la cantidad de puntos de interrupción de vigilancia de memoria que puede establecer.

Es por eso que necesitas usar algo como valgrind; si desea ver una región completa, debe hacerlo utilizando un software que simule los patrones de acceso a la memoria. Sin embargo, no sé si valgrind realmente admite la visualización de rangos de memoria completos. Puede que tengas que parchearlo tú mismo. Modifique VALGRIND_MAKE_MEM_NOACCESS() para generar un punto de interrupción, pero luego permita que el programa continúe, tal vez.

Respondido el 12 de junio de 12 a las 21:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.