Что означает префикс «Unloaded» в трассировке стека Windows? - PullRequest
2 голосов
/ 28 июня 2010

У меня адская проблема, связанная с тем, что сторонние библиотеки DLL вызывают рекурсивный сбой переполнения стека при его выгрузке. Я получаю этот шаблон в стеке (используя windbg):

<Unloaded_ThirdParty.dll>+0xdd01
ntdll!ExecuteHandler2+0x26
ntdll!ExecuteHandler+0x24
ntdll!KiUserExceptionDispatcher+0xf
<Unloaded_ThirdParty.dll>+0xdd01
ntdll!ExecuteHandler2+0x26
ntdll!ExecuteHandler+0x24
ntdll!KiUserExceptionDispatcher+0xf
...

Как вы могли догадаться, у меня нет исходного кода для ThirdParty.dll.

В: Что означает префикс «Unloaded_» в дампе стека. Я не сталкивался с этим раньше.

Ответы [ 2 ]

8 голосов
/ 28 июня 2010

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

.reload /f ThirdParty.dll=0xaaaaaaaa

Конечно, вам нужно заменить 0xaaaaaaaa на исходный базовый адресмодуль.Это может быть довольно сложно выяснить, если модуль уже был выгружен, но если у вас есть HMODULE, который указывает на dll, значение этого HMODULE является базовым адресом.В худшем случае, вы можете добавить в код код трассировки отладчика, который записывает HMODULE dll непосредственно перед его выгрузкой.

1 голос
/ 28 июня 2010

У меня был такой же сбой, как и раньше, и, как указывает JS, это означает, что dll была выгружена до сбоя.Однако наличие трассировки стека в этой dll может не обязательно дать вам информацию, необходимую для диагностики проблемы.

Что-то в вашем коде выгружает библиотеку, потому что она думает, что с ней покончено, но у вас все еще есть указатель на нее (или на функцию внутри нее) где-то.Мое предположение будет обратным вызовом, возможно, из другого потока.Я бы посоветовал поискать в вашем источнике любые звонки на FreeLibrary(), а также поставить точку останова на символе FreeLibrary.Узнайте, куда выгружается библиотека, а затем убедитесь, что все данные, которые ссылаются на dll, были сброшены.Используйте мьютекс, если у вас несколько потоков.

Инструмент, который может быть очень полезен для этого, - отличный Process Monitor , который, я думаю, показывает вам события загрузки и выгрузки dll и даст вамтрассировка стека для каждого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...