!htrace не показывает стека вызовов

#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 для дальнейших ссылок). Поскольку вы выяснили, что эта проблема возникает только при наличии определенной видеокарты, вы можете попытаться связаться с поставщиком или проверить наличие более новой версии драйвера.