2012-03-28 15 views
21

Durante mi trabajo, regularmente me encuentro con un error de programación bastante común: usar un objeto que ya ha sido liberado. Esto invoca UB en C++. En linux, este tipo de problemas generalmente se resuelven utilizando la herramienta Valgrind Memcheck. De Memcheck manual:¿Hay Valgrind Memcheck como herramienta para que Windows depure el uso después de errores libres?

Memcheck trata de establecer cuál es la dirección ilegal podría relacionarse, ya que es a menudo útil. Entonces, si apunta a un bloque de memoria que ya ha sido liberado, se le informará de esto, y también donde se liberó el bloque.

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

+0

He tenido buena suerte con Purify en el pasado, pero definitivamente no es gratis. –

+2

http://stackoverflow.com/questions/413477/is-there-a-good-valgrind-substitute-for- windows – stanwise

+0

Si está interesado en una respuesta solo para C, tengo una. –

Respuesta

4

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

-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 en este caso es un ejemplo de error reported by 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 
17

Como Lailin Chen señaló en su respuesta a la pregunta this probar uno de estos:

Dr. memoria: https://github.com/dynamorio/drmemory

UMDH: http://support.microsoft.com/kb/268343

AppVerifier: http://msdn.microsoft.com/en-us/library/dd371695%28v=vs.85%29.aspx

+0

He intentado con AppVerifier, no indica dónde fue desasignado el objeto. – ks1322

+1

Application Verifier debería detectar esto con la protección de memoria completa. Cuando liberas el objeto, protege las páginas desasignadas, lo que provoca que cualquier operación futura genere una excepción. –

+0

AppVerifier es una porquería, cuando se ejecuta un programa con él desencadena un punto de interrupción en el código Intel TBB ... programa malo, pero idk quizás esté bien si deshabilita esa comprobación – NoSenseEtAl

5

The method that worked for me era escriba el administrador de memoria personalizado que proporciona a los operadores globales "nuevo" y "eliminar", y bloquea 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) utilizando algo como VirtualAlloc y cada bloque de memoria que devuelva (desde este bloque inicialmente asignado) debe estar alineado PAGE_SIZE (consulte GetSystemInfo documentación), 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 él. 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.

4

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

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

Me temo, sin embargo, que con el fin de implementar un "Valgrind para Windows" adecuada, el acceso al código fuente de Windows es requerido.

IOW: Cuando los cerdos vuelan.

+0

¿Por qué se requeriría el acceso al código fuente de Windows? – Jeff

3

lo que funcionó mejor para mí estaba usando 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 acceder directamente a la línea donde se asignó la memoria, para que pueda ocuparse de

Cuestiones relacionadas