отладка утечки ресурсов в драйвере принтера

Я пытаюсь устранить утечку памяти в драйвере принтера. Я почти уверен, что это утечка ресурсов, а не просто утечка памяти, потому что анализ кучи с помощью !heap -s в windbg не показывает никакого увеличения. Как мне контролировать другие виды объектов с помощью windbg? Количество объектов GDI и открытых дескрипторов тоже не растет, так что же это может быть?

Симптом утечки памяти заключается в том, что приватные байты увеличиваются до 180 МБ, после чего при печати начинаются случайные проблемы.


person MK.    schedule 21.04.2010    source источник


Ответы (1)


Это могут быть прямые звонки на VirtualAlloc. Попробуйте изолировать тип памяти с помощью !address -summary. Еще лучше найти копию vadump.exe из старого комплекта ресурсов. Это дает более удобочитаемую разбивку.

Вы можете получить некоторые подсказки, сравнив выходные данные двух запусков команды WinDbg !vadump, а затем сбросив часть вновь выделенной оперативной памяти. Если у вас есть файлы символов и вы делаете дамп оперативной памяти с помощью команды dps, WinDbg будет отображать совпадения символов для каждого DWORD. Другими словами, если у значения есть имя в файле символов, вы его увидите. Хорошим примером этого является создание дампа объектов C++ с помощью VTables. VTable имеет символ, так что вы увидите, какой это тип.

И последнее, но не менее важное: вы можете установить точку останова на VirtualAlloc и выгружать стек для каждого вызова. Даже при отсутствии строгого сравнения между выделением и освобождением можно заметить интересный стек вызовов или размер выделения. Синтаксис точки останова для сброса стека и продолжения:

bp kernel32!virtualalloc "kb;g"

Кроме того, укажите точку останова на VirtualAllocEx. Насколько я знаю, большинство распределений VAD, инициированных процессом, должны достичь точки останова, за исключением тех, которые реализованы в ядре, таких как сопоставления файлов (CreateFileMapping/MapViewOfFile) и, возможно, LoadLibrary.

person Gary Kratkin    schedule 22.04.2010
comment
Спасибо за помощь. vadump.exe производит множество различий, слишком много, чтобы на них смотреть. !address -summary показывает, что регион 1886000 ( 25112) : 01,20% 50,05% : RegionUsageIsVAD растет. Я думаю, это указывает на VirtualAlloc. Однако точка останова в virtualalloc вообще не срабатывает. Есть ли у VirtualAlloc близкие родственники? - person MK.; 22.04.2010
comment
На самом деле после diffing !address output я вижу новую область размером 4 КБ, выделенную в области RegionUsageIsVAD. Но как мне понять, что его выделило? - person MK.; 22.04.2010