#windbg #handle-leak
#windbg #утечка дескриптора
Вопрос:
Когда я использую!htrace -diff в WinDbg для отладки утечки дескриптора, я получаю много дескрипторов (вероятно, тех, которые протекают), которые не отображают стек вызовов:
Что может быть причиной этого и какие варианты у меня есть для дальнейшей отладки?
Handle = 0x000273e4 - OPEN
Thread ID = 0x00001190, Process ID = 0x0000114c
--------------------------------------
Handle = 0x000273e0 - OPEN
Thread ID = 0x00001190, Process ID = 0x0000114c
--------------------------------------
Handle = 0x000273dc - OPEN
Thread ID = 0x00001190, Process ID = 0x0000114c
--------------------------------------
Handle = 0x000273d8 - OPEN
Thread ID = 0x00001190, Process ID = 0x0000114c
--------------------------------------
Handle = 0x000273d4 - OPEN
Thread ID = 0x00001190, Process ID = 0x0000114c
--------------------------------------
Handle = 0x000273d0 - OPEN
Thread ID = 0x00001190, Process ID = 0x0000114c
--------------------------------------
Handle = 0x000273cc - OPEN
Thread ID = 0x00001190, Process ID = 0x0000114c
--------------------------------------
Handle = 0x000273c8 - OPEN
Thread ID = 0x00001190, Process ID = 0x0000114c
--------------------------------------
Handle = 0x000273c4 - OPEN
Thread ID = 0x00001190, Process ID = 0x0000114c
--------------------------------------
Handle = 0x000273c0 - OPEN
Thread ID = 0x00001190, Process ID = 0x0000114c
--------------------------------------
Handle = 0x000273bc - OPEN
Thread ID = 0x00001190, Process ID = 0x0000114c
--------------------------------------
Handle = 0x000273b8 - OPEN
Thread ID = 0x00001190, Process ID = 0x0000114c
--------------------------------------
Handle = 0x000273b4 - OPEN
Thread ID = 0x00001190, Process ID = 0x0000114c
--------------------------------------
Handle = 0x000273b0 - OPEN
Thread ID = 0x00001190, Process ID = 0x0000114c
--------------------------------------
Handle = 0x000273ac - OPEN
Thread ID = 0x00001190, Process ID = 0x0000114c
--------------------------------------
Handle = 0x000273a8 - OPEN
Thread ID = 0x00001190, Process ID = 0x0000114c
--------------------------------------
Handle = 0x000273a4 - OPEN
Thread ID = 0x00001190, Process ID = 0x0000114c
--------------------------------------
Обновление: Утечка дескриптора, похоже, зависит от графических драйверов или видеокарт. Он начинает протекать, когда я использую любую форму WPF, он протекает только в некоторых системах Windows XP с определенными графическими картами / драйверами.
Комментарии:
1. На какой операционной системе вы работаете? Это дамп или оперативная отладка? Вызывали ли вы ‘!htrace -enable’ раньше?
2. Windows XP, да, я звонил
!htrace -enable
есть еще одна подсказка: утечка дескриптора, похоже, зависит от графических драйверов или видеокарт. Он начинает протекать, когда я использую любую форму WPF, он протекает только в некоторых системах Windows XP с определенными графическими картами / драйверами.3. Вы можете использовать ‘!handle 0x000273c4 0xf’, чтобы просмотреть дополнительную информацию о конкретном дескрипторе 0x000273c4. После этого вы узнаете, соответствует ли тип дескриптора тому типу, который вы ищете. Если утечки связаны с GDI, они обрабатываются другим пулом дескрипторов, а не в списке, с помощью которого вы можете получить доступ! обработайте. Утечки GDI болезненны, и я не знаю ни одного документированного способа их отслеживания. Вы можете попробовать этот инструмент ( nirsoft.net/utils/gdi_handles.html ) из NirSoft, чтобы посмотреть, можете ли вы сузить проблему.
4. Если ваша система обнаруживает инструменты от NirSoft как рекламное ПО, вы также можете попробовать это: 0memory.blogspot.com/2011/01 /…
5. Согласно
handle.exe
( technet.microsoft.com/en-us/sysinternals/bb896655 ) тип дескрипторов, которые протекают, имеют типProcess
.!handle 0x000273c4 0xf
не выдает никакой дополнительной информации.
Ответ №1:
Вызовы выполняются в режиме ядра подпрограммой ZwOpenProcess (http://msdn.microsoft.com/en-us/library/windows/hardware/ff567022 (v = vs.85).aspx) и не сопровождается вызовом ZwClose. Затем происходит утечка дескриптора. Вы не видите callstacks, потому что они доступны только тогда, когда вызовы выполняются из пользовательского режима (OpenProcess / CloseHandle).
На XP с пакетом обновления 3, кажется, трудно найти виновника. Решением было бы использовать встроенную в ОС функциональность трассировки ссылок на объекты, но этот путь сопряжен с проблемами (см. http://www.osronline.com/showthread.cfm?link=198302 для дальнейших ссылок). Поскольку вы выяснили, что эта проблема возникает только при наличии определенной видеокарты, вы можете попытаться связаться с поставщиком или проверить наличие более новой версии драйвера.