Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
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