Что означает RegionUsageHeap в! Address -summary - PullRequest
1 голос
/ 27 октября 2011

У меня есть приложение .NET, которое взаимодействует с нативной DLL со следующими слоями.

a) API C ++ GetNames () возвращает список экземпляров wchar_t
б) C ++ / CLI API. Вызывает код GetNames2 () в C ++ API, маршаллизирует список wchar в строку .NET, возвращает этот список строк .NET
c) управляемый код C #, вызывающий API-интерфейс GetNames2 () уровня взаимодействия и отображающий список строк

Я вызываю CoTaskMemFree API на уровне взаимодействия, чтобы освободить нативные строки wchar. Однако мне просто интересно, как увидеть утечку памяти, вызванную отсутствующим вызовом CoTaskMemFree. Поэтому я закомментировал вызов CoTaskMemFree. В этом случае я понимаю, что если я присоединяю команду windbg и запускаю! Address -summary, любые выделения, выполненные на собственной стороне (которые не были освобождены), должны отображаться в RegionUsageHeap, но, похоже, не сообщают об этом. Любые идеи, как я могу увидеть использование собственной памяти (в контексте управляемого кода) в windbg?

1 Ответ

1 голос
/ 31 октября 2011

RegionUsageHeap - это общее количество, используемое для всех собственных куч, это значение увеличивается на довольно большие куски, и в этой переменной должна наблюдаться довольно большая утечка памяти.
Вы можете использовать команду! Heap. CoTaskMemAlloc использует кучу по умолчанию для каждого процесса, которая обычно является первым дескриптором в выводе из! Heap –s, или присматривает «ProcessHeap» в выводе! Peb.
Если у вас есть этот дескриптор, используйте! Heap –stat –h, чтобы увидеть, сколько блоков выделено.
Вы также можете сбросить всю кучу, проверьте справку windbg для команды! Heap. Образец:

0:011> !heap -stat -h 00150000   
heap @ 00150000  
group-by: TOTSIZE max-display: 20  
size     #blocks     total     ( %) (percent of total busy bytes)  
44      82f - 22c7c  (8.73)  
20000     1 - 20000  (8.03) 
<I have cut here>

...