Как перейти к коду, который создал дескриптор
Я знаю, что если мы предоставим абсолютный путь к 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 и позволит вам проанализировать каждую отдельную операцию, связанную с ним, выполненную любым процессом. работает в системе.
Если дважды щелкнуть одну операцию, вы также сможете просмотреть обратную трассировку стека в контексте этого системного вызова, а также другие подробности, касающиеся операции ввода-вывода (в данном конкретном случае).