Почему куча дампа пользовательского режима (UMDH) не обнаруживает утечки BSTR в приложениях x64?
У меня был большой успех в поиске утечек памяти через GFLAGS и UMDH. Однако я только что обнаружил, что UMDH почему-то не видит BSTR-Leaks в 64-битных приложениях. Кто-нибудь знает, почему это так? Это ошибка в UMDH? Изменение того, как Heap-Manager работает для приложений x64? Где я могу даже сообщить о таких проблемах в Microsoft?
Я исследовал эту проблему с помощью небольшого тестового исполняемого файла, например:
int main()
{
while (true)
{
BSTR sLeak = CComBSTR("I am a leaky BSTR. Please find me!").Detach();
Sleep(16);
}
return 0;
}
Вот UMDH-вывод для исполняемого файла теста x86. Утечка видна!
+ 2878464 ( 3597312 - 718848) 2342 allocs BackTrace53973BC
+ 1874 ( 2342 - 468) BackTrace53973BC allocations
ntdll!RtlWalkHeap+194
ntdll!RtlAllocateHeap+10DC
ntdll!RtlAllocateHeap+3E
combase!PropVariantCopy+456
OLEAUT32!SysAllocString+10F
OLEAUT32!SysAllocStringLen+40
LeakTestCom!main+48 (d:\...\leaktestcom\leaktestcom.cpp, 78)
LeakTestCom!__scrt_common_main_seh+FA (d:\agent\_work\3\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl, 288)
KERNEL32!BaseThreadInitThunk+19
ntdll!RtlGetAppContainerNamedObjectPath+11E
ntdll!RtlGetAppContainerNamedObjectPath+EE
- 288 ( 0 - 288) 0 allocs BackTrace26DADAC
- 3 ( 0 - 3) BackTrace26DADAC allocations
ntdll!RtlWalkHeap+194
ntdll!RtlAllocateHeap+10DC
ntdll!RtlAllocateHeap+3E
ntdll!TpSetWaitEx+552
ntdll!TpCallbackIndependent+208
KERNEL32!BaseThreadInitThunk+19
ntdll!RtlGetAppContainerNamedObjectPath+11E
ntdll!RtlGetAppContainerNamedObjectPath+EE
- 1380 ( 0 - 1380) 0 allocs BackTrace26DAE00
- 3 ( 0 - 3) BackTrace26DAE00 allocations
ntdll!RtlWalkHeap+194
ntdll!RtlAllocateHeap+10DC
ntdll!RtlAllocateHeap+3E
ntdll!TpCallbackIndependent+7F0
KERNEL32!BaseThreadInitThunk+19
ntdll!RtlGetAppContainerNamedObjectPath+11E
ntdll!RtlGetAppContainerNamedObjectPath+EE
Total increase == 2876796 requested + 134772 overhead = 3011568
А вот вывод UMDH для исполняемого файла теста x64. Как видите, выделения BSTR не видны.
- 136 ( 0 - 136) 0 allocs BackTraceD670D5C4
- 1 ( 0 - 1) BackTraceD670D5C4 allocations
ntdll!RtlAllocateHeap+AFD
ntdll!TpReleaseCleanupGroupMembers+1D51
ntdll!TpReleaseCleanupGroupMembers+4F0
KERNEL32!BaseThreadInitThunk+14
ntdll!RtlUserThreadStart+21
- 2736 ( 0 - 2736) 0 allocs BackTraceD670DA44
- 3 ( 0 - 3) BackTraceD670DA44 allocations
ntdll!RtlAllocateHeap+AFD
ntdll!TpReleaseCleanupGroupMembers+B5C
KERNEL32!BaseThreadInitThunk+14
ntdll!RtlUserThreadStart+21
Total decrease == 2872 requested + 200 overhead = 3072