usar como c++ windows debugging valgrind

c++ - usar - ¿Hay Valgrind Memcheck como herramienta para que Windows depure el uso después de errores libres?



dr memory (5)

Durante mi trabajo, regularmente me encuentro con un error de programación bastante común: usar algún objeto que ya ha sido liberado. Esto invoca UB en C ++. En Linux , este tipo de problemas suelen resolverse utilizando la herramienta Valgrind Memcheck. Del manual de Memcheck :

Memcheck intenta establecer con qué se puede relacionar la dirección ilegal, ya que a menudo es útil. Entonces, si apunta a un bloque de memoria que ya ha sido liberado, se le informará de esto, y también de dónde se liberó el bloque.

Memcheck me proporciona call stack, donde el objeto fue desasignado y puedo continuar y depurar el problema. ¿Hay alguna herramienta similar para Windows con la misma funcionalidad, preferiblemente gratis?


Aquí hay un valiente intento de Valgring, y les deseo lo mejor:

http://sourceforge.net/p/valgrind4win/wiki/Home/

Sin embargo, me temo que para implementar un "Valgrind for Windows" adecuado, se requiere acceso al código fuente de Windows.

IOW: Cuando los cerdos vuelan.


De acuerdo con la documentación del Dr. Memory, existe la opción -delay_frees_stack con exactamente la misma funcionalidad de Valgrind. De la referencia de la opción :

-delay_frees_stack default: false Record callstacks on free to use when reporting use-after-free or other errors that overlap with freed objects. There is a slight performance hit incurred by this feature for malloc-intensive applications.

También aquí hay un ejemplo de error reportado por el Dr. Memory :

Here is another example, using the -delay_frees_stack option to obtain the callstack of the freed memory: Error #8: UNADDRESSABLE ACCESS: reading 0x001338a8-0x001338ac 4 byte(s) # 0 unaddr_test1 [e:/derek/drmemory/git/src/tests/suppress.c:110] # 1 test [e:/derek/drmemory/git/src/tests/suppress.c:269] # 2 main [e:/derek/drmemory/git/src/tests/suppress.c:297] Note: @0:00:02.141 in thread 3024 Note: next higher malloc: 0x001338e8-0x00133938 Note: prev lower malloc: 0x001337e8-0x00133820 Note: 0x001338a8-0x001338ac overlaps memory 0x001338a8-0x001338c4 that was freed here: Note: # 0 test [e:/derek/drmemory/git/src/tests/suppress.c:269] Note: # 1 main [e:/derek/drmemory/git/src/tests/suppress.c:297] Note: instruction: mov (%eax) -> %eax


Lo que funcionó mejor para mí fue el uso de Visual leak Detector , todo lo que tenía que hacer era incluir:

#include <vld.h>

al comienzo de los ejecutables que quería probar. Luego, ejecutar un ejecutable de depuración desde Windows, proporcionaría información detallada sobre toda la memoria filtrada. Desde la salida, puede llegar directamente a la línea donde se asignó la memoria, para que pueda ocuparse


El método que funcionó para mí fue escribir el administrador de memoria personalizado que proporciona a los operadores globales "nuevo" y "eliminar", y bloquear cada bloque de memoria liberado / usuado con VirtualProtect. De esta forma, cualquier intento de usar memoria liberada activará inmediatamente una violación de acceso que puede detectar y depurar. Sin embargo, para poder hacer esto, debe "agarrar" toda la memoria disponible (o 3/4 de ella) usando algo como VirtualAlloc y cada bloque de memoria que regrese (desde este bloque inicialmente asignado) debe estar PAGE_SIZE alineado (consulte la documentación de GetSystemInfo ), de lo contrario no podrá bloquearlo de manera confiable. Lo que significa que incluso una aplicación trivial puede requerir una gran cantidad de memoria para usar este método.

En cuanto a "valgrind alternative for windows", no he oído hablar de eso. Alguien en algún lugar publicó que podría ser posible compilar / usar valgrind con cygwin, pero no sé si esto es cierto o no.