Как перейти к коду, который создал дескриптор

Я знаю, что если мы предоставим абсолютный путь к Handle.exe, он перечислит все процессы, которые заблокировали файл.

F:\Softwares\Handle>Handle.exe  D:\Source\sample.dll

Handle v4.0
Copyright (C) 1997-2014 Mark Russinovich
Sysinternals - www.sysinternals.com

test1.exe           pid: 9928   type: File           408: D:\Source\sample.dll
test2.exe           pid: 10840  type: File           6A8: D:\Source\sample.dll
test3.exe           pid: 15788  type: File           374: D:\Source\sample.dll
test4.exe           pid: 10940  type: File           308: D:\Source\sample.dll
test5.exe           pid: 15424  type: File           3FC: D:\Source\sample.dll
test6.exe           pid: 10076  type: File           8AC: D:\Source\sample.dll

Windows 7 64bit

Как заявляет Handle.exe, мой sample.dll заблокирован 6 различными процессами. Я хочу знать, какая строка кода на самом деле содержит sample.dll из каждого процесса. Моя задача - исправить утечку ручки в моем приложении мамонта. Поэтому моя проблема не связана с определенной частью программы. Задача состоит в том, чтобы создать отчет, содержащий сведения о том, кто его создал. Утечки не являются специфичными для файла, он распространяется на все системные ресурсы, такие как файл, раздел реестра, событие, семафор, поток... и т. Д.

Я сделал дамп с помощью windbg, но я не смог найти, как диагностировать файл дампа, особенно на наличие утечек. В моем поиске около полдня я не смог найти хорошего учебника или решения, подходящего моей проблеме.

Есть ли какой-либо инструмент командной строки или любой другой инструмент, который отвечает на мой вопрос.

2 ответа

Вы используете неправильный инструмент отладки. Если вы хотите прочитать эту статью, в ней подробно рассказывается, как получить трассировку стека для просочившихся дескрипторов с помощью !htrace команда отладчика. Также охватывается этот существующий вопрос SO.

Вы увидите часто упоминаемые "Средства отладки для Windows". Это больше не отдельная загрузка, но включена в установку Windows SDK.

Я думаю, что вы можете найти виновника с помощью procmon, другого инструмента Sysinternals.

Это сделает ваш день, единственная проблема в том случае, если скорость создания дескриптора очень низкая - вы не можете записывать системную активность более чем на несколько десятых минут... за исключением того, что в вашей системе установлено огромное количество памяти.

После того как вы записали свои события (не забудьте запустить его от имени администратора и остановить его через несколько минут, я предпочитаю анализировать захваченные данные после их обычной остановки), перейдите в меню "Инструменты" -> "Сводка файла" и найти файлы, к которым есть доступ.

Двойной щелчок по файлу (или по каталогу, в представлении папок и т. Д. Двойным щелчком "anywehere") добавит фильтр в представлении procmon и позволит вам проанализировать каждую отдельную операцию, связанную с ним, выполненную любым процессом. работает в системе.

Если дважды щелкнуть одну операцию, вы также сможете просмотреть обратную трассировку стека в контексте этого системного вызова, а также другие подробности, касающиеся операции ввода-вывода (в данном конкретном случае).

Другие вопросы по тегам