В моем приложении я использую функцию MiniDumpWriteDump (см. Dbghelp.dll) для записи файла аварийного дампа при каждом сбое моего приложения.
Я также использую сервер символов для хранения всех своих исполняемых файлов и файлов pdb, поэтому, когда клиент отправляет мне файл аварийного дампа, отладчик автоматически выбирает правильную версию исполняемого файла и информацию об отладке.
Я также храню DLL-файлы Windows (ntdll.dll, kernel32.dll, ...) и их отладочную информацию на сервере символов (используя SymChk). Отладочная информация берется с общедоступного сервера символов Microsoft.
В большинстве случаев это работает идеально, за исключением случаев, когда:
- клиент падает в одной из библиотек Windows
- и клиент использует библиотеки DLL, которые я не поместил на сервер символов
Это связано с тем, что хранить все варианты каждой DLL-библиотеки Windows на сервере символов (особенно с еженедельными исправлениями) весьма невозможно.
Так что, если клиент падает, скажем, в версии 5.2.123.456 NTDLL.DLL, и я не поместил эту точную версию DLL на моем Symbol Server, я застрял. Даже общедоступный сервер символов Microsoft не помогает, потому что он предоставляет только отладочную информацию, а не саму DLL.
Мое текущее решение - спросить у клиента его DLL, но это не всегда легко. Поэтому я ищу лучшее решение.
Есть ли способ получить отладчик, показывающий правильный стек вызовов, или загрузить отладочную информацию конкретной библиотеки DLL, даже если у вас нет точной версии библиотеки DLL?
В качестве альтернативы, есть ли способ получить все версии всех (или важных) Windows DLL (от Microsoft)?
EDIT:
А пока я нашел очень простой способ решить эту проблему.
С помощью утилиты ModuleRescue (см. http://www.debuginfo.com/tools/modulerescue.html) вы можете генерировать фиктивные DLL из файла мини-дампов. С этими фиктивными DLL отладчик удовлетворяется и корректно начинает загрузку символов отладки с серверов Microsoft.