2008-11-24 16 views
8

¿Hay alguna manera de detectar fugas de identificador de archivo al finalizar el programa?Detecta fugas de identificador de archivo con Win32 C++

En particular, me gustaría asegurarme de que todos mis identificadores que se crean están siendo liberados en código.

Por ejemplo, puedo tener un CreateFile() en algún lugar, y al finalizar el programa quiero detectar y asegurar que todos estén cerrados.

Respuesta

5

he utilizado! Comando htrace de windbg.

!htrace -enable 
!htrace -snapshot 
!htrace -diff 

le permiten comparar la situación mango de dos punto de ejecución y ayudarle a la localizar el punto en que se ha asignado el mango filtrado.

Me funcionó bien.

+0

¿dará esto la pila de llamadas de identificadores asignados entre las instantáneas? – paulm

1

BoundsChecker u otros programas similares harán eso. También pensé que ejecutar bajo el depurador en VC6 y superior reportaría la lista de filtraciones. Quizás esto se deba a que siempre tuve herramientas de complemento para hacer este tipo de cosas.

4

También puede usar MS Application Verifier.

+0

Una breve lectura de la documentación no revela nada sobre la detección de fugas en el mango. ¿Qué me estoy perdiendo? –

+0

el truco es que el código tiene que estar en un dll, cuando descarga la detección de fugas recogerá los identificadores filtrados y los alocamientos del montón filtrados – paulm

1

Utilice punteros inteligentes para manejadores de archivos y recursos similares.

7

Si puede (es decir, si no se trata de una gran base de código de legado que está solucionando errores) debería considerar utilizar la expresión RAII para ajustar sus identificadores de archivo. Al "tomar" el identificador de archivo en el constructor y soltarlo en el destructor, puede estar seguro de que cuando su RAII se salga del alcance, también se limpiará su identificador de archivo.

Es el mismo principio que los punteros inteligentes, y es un concepto muy útil tener en su caja de herramientas para evitar problemas como este en C++.

1

Otro consejo sería el SysInternals FileMon (Link).

Le muestra la actividad del sistema de archivos, por lo que debe ayudarle a encontrar identificadores abiertos.

4

Si usted no puede permitirse BoundsChecker o similares ...

Un truco que he utilizado es reemplazar CreateFile etc. con mis propios envoltorios. Además de devolver el valor del identificador, hacen un registro de __FILE__ y __LINE__ para ir con cada identificador. También deberá ajustar CloseHandle para asegurarse de que los controladores correctamente cerrados no generen falsos positivos.

Es tan simple como:

// StdAfx.h 
#include <windows.h> 
#undef CreateFile 
#if defined(UNICODE) 
#define CreateFile DbgCreateFileW 
#else 
#define CreateFile DbgCreateFileA 
#endif 

// etc. 

A continuación se define DbgCreateFileW y DbgCreateFileA en algún lugar de su código.

Esto supone que tienes control sobre las piezas de código relevantes. Si no, puede hacer algo similar usando (por ejemplo) Microsoft Detours (necesitará una licencia para incluirlo en un producto lanzado, pero creo que es gratis para usar para depurar/probar/etc.)

A largo plazo, sin embargo, debería considerar convertir su código para usar un tipo de manejador "inteligente" que llame automáticamente al CloseHandle cuando se sale del alcance.

0

Como dijo MadKeithV, puede usar RAII con gran efecto.

También una manera simple (y gratuita) es usar Visual Leak Detector. No es perfecto, pero es una buena forma de asegurarte de que tienes free'd/delete [] d/close'd, etc.

0

windbg o ntsd tienen una extensión! Handle que le indica qué manejos tiene abierta una aplicación. Supongo que podrías poner un punto de interrupción al final de tu programa y volcar las manijas allí.

También puede haber algo que pueda hacer en powerdbg (http://www.codeplex.com/powerdbg) para automatizar este proceso.

Por supuesto, esto supone que su tiempo es más barato que comprar una solución :)

Cuestiones relacionadas