umdh.exe показывает только часть выделений для конкретного стека

Я пытаюсь узнать, как устранить утечки памяти с помощью umdh.exe. Для этого я написал пример приложения:

void MemoryLeakTest(int argc, _TCHAR* argv[]);

int _tmain(int argc, _TCHAR* argv[])
{
MemoryLeakTest(argc, argv);
return 0;
}

void MemoryLeakTest(int argc, _TCHAR* argv[])
{
if (argc != 3)
{
wcout << "HelloWorld.exe <number of allocations> <number of bytes>" << endl;
getchar();
return;
}

int numAllocations = _wtoi(argv[1]);
int numBytes = _wtoi(argv[2]);

wcout << "Num allocations: " << numAllocations << ", num bytes: " << numBytes << endl;
wcout << "Press any key to start..." << endl;
getchar();

for (int i = 0; i < numAllocations; ++i)
{
void* unusedMemory = new byte[numBytes];

if ((i % (numAllocations / 100)) == 0)
{
wcout << i << endl;
Sleep(100);
}
}

wcout << "Press any key to finish..." << endl;
getchar();
}

Скомпилирован (выпуск), настроен umdh.exe:

  1. установить _NT_SYMBOL_PATH =http://msdl.microsoft.com/symbols/download;C: \ TestProjects \ HelloWorld \ x64 \ Release;
  2. gflags.exe / i HelloWorld.exe + ust

Затем сделал эксперимент:

  1. HelloWorld.exe 10000 1000
  2. Ждал пока он остановится @ first getchar
  3. umdh.exe -pn: helloworld.exe -f: c: \ first.log
  4. Продолжение выполнения, ожидание, пока оно не остановится @ второй getchar
  5. umdh.exe -pn: helloworld.exe -f: c: \ second.log

Я заметил, что независимо от того, какие параметры я называю, будь то 100 выделений или 1000 выделений, first.log и second.log выглядят очень похоже (для разных экспериментов).

  1. umdh.exe -d c: \ first.log c: \ second.log -f: c: \ result.log

И тогда я получаю единственный стек только с 17 выделяет (вместо ожидаемого 1000):

+   17000 (  17000 -      0)     17 allocs  BackTraceB5023D4D
+      17 (     17 -      0)    BackTraceB5023D4D   allocations

ntdll!memset+165B9
MSVCR120!malloc+5B
MSVCR120!operator new+1F
HelloWorld!MemoryLeakTest+108 (c:\my\main\private\testproject\debugit\helloworld\helloworld.cpp, 40)
HelloWorld!wmain+9 (c:\my\main\private\testproject\debugit\helloworld\helloworld.cpp, 16)
HelloWorld!__tmainCRTStartup+10F (f:\dd\vctools\crt\crtw32\dllstuff\crtexe.c, 623)
KERNEL32!BaseThreadInitThunk+D
ntdll!RtlUserThreadStart+1D

ОБНОВЛЕНО: TaskProcess показывает, что как личные байты, так и размер фиксации увеличиваются в зависимости от ожидаемого значения.

ОБНОВЛЕНО2: DebugDiag правильно отображает утечку с 10000 выделениями и несколькими выборочными стеками вызовов, указывающими на правильное местоположение.

Есть идеи, что я делаю не так?

Спасибо!

2

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]