Développeurs, connaissez vous UMDH l’outil pour détecter les fuites mémoire ?

 

UMDH (User mode Dump Heap) est un outil qui s’utilise en mode console en tant qu’administrateur et permet de tracer de manière très précise les fuites mémoire.

Comment ça marche ?

Tout d’abord, vous devez créer une "User Stack Trace Database" à l’aide de l’outil GFLAGS en lui donnant une taille de 50 Méga-octets par exemple.

GFLAGS –i <image> +ust
GFLAGS –i <image> -tracedb 50

<Image> dans ce contexte, est le nom de votre application (ex : App1.exe)

Si vous ne l’avez pas déjà fait, il faut positionner la variable d’environnement _NT_SYMBOL_PATH pour que l’outil puisse charger les symboles.
Set _NT_SYMBOL_PATH=SRV*c:\LocalSymbolCache

Lancez votre application et prenez une première photo à un instant T1 de la mémoire consommée par votre application.
UMDH –p :<PID> -f:LogFile1.log

Note : PID, est le numéro du processus de votre application, que vous retrouverez soit à l’aide du gestionnaire de tâches, ou avec l’utilitaire tlist, livré avec la suite d’outils de débogage)
tlist –p <image>

Utilisez votre application, puis prenez une seconde photo.
UMDH –p :<PID> -f:LogFile2.log

Enfin comparez les deux fichiers de log.
UMDH logfile1.log logfile2.log > comparaison.txt

Le fichier de comparaison contiendra les informations de fuites mémoires. Par exemple j’ai dans mon exemple un BackTrace3E18904F qui consomme +0x140000104 Octets non libérés entre les deux photos (( 140000104 - 0)

+140000104 ( 140000104 - 0) 5 allocs BackTrace3E18904F
+ 5 ( 5 - 0) BackTrace3E18904F allocations

Et la pile des appels m’indique que cela ce passe dans la méthode Execute.

ntdll!RtlpCallInterceptRoutine+40
ntdll!RtlAllocateHeap+7B5F8
msvcr120d_app!heap_alloc_base+5D
msvcr120d_app!free_dbg_nolock+96B
msvcr120d_app!nh_malloc_dbg+B9
msvcr120d_app!nh_malloc_dbg+49
msvcr120d_app!malloc+2A
App1!App1::MainPage::Execute+DA (d:\app1\mainpage.xaml.cpp, 51)
App1!App1::MainPage::Button_Click+32 (d:\app1\mainpage.xaml.cpp, 39)
App1!`Windows::UI::Xaml::RoutedEventHandler::RoutedEventHandler<App1::MainPage,void (__cdecl App1::MainPage::*)(Platform::Object ^ __ptr64,Windows::UI::Xaml::RoutedEventArgs ^ __ptr64) __ptr64>'::`3'::__abi_PointerToMemberWeakRefCapture::Invoke+10A
App1!Windows::UI::Xaml::RoutedEventHandler::Invoke+91 (d:\app1\generated files\mainpage.g.h, 15732480)
App1!Windows::UI::Xaml::RoutedEventHandler::[Windows::UI::Xaml::RoutedEventHandler::__abi_IDelegate]::
__abi_Windows_UI_Xaml_RoutedEventHandler___abi_IDelegate____abi_Invoke+4D (d:\app1\generated files\mainpage.g.h, 16707566)
Windows.UI.XamlDirectUI::CRoutedEventSourceBase<DirectUI::IUntypedEventSource,Windows::UI::
Xaml::IRoutedEventHandler,IInspectable,Windows::UI::Xaml::IRoutedEventArgs>::Raise+3FC (d:\9144\windows\dxaml\xcp\dxaml\lib\joltclasses.h, 1139)
Windows.UI.Xaml!DirectUI::ButtonBase::OnClick+AD

Pour en savoir plus sur l’utilisation d’umdh, suivez le guide.

https://support.microsoft.com/kb/268343 et
https://msdn.microsoft.com/en-us/library/windows/hardware/ff558947(v=vs.85).aspx

Cet outil fait partie de la suite d’outils de débogage que vous pouvez télécharger à partir de cette adresse https://msdn.microsoft.com/en-us/library/windows/hardware/ff551063(v=vs.85).aspx

Eric