У меня есть приложение C++/CLI смешанного режима, которое использует WPF. О сбоях от наших клиентов сообщается в виде мини-дампов на наш собственный сервер.
Когда я пытаюсь изучить минидамп с помощью команд !pe или !clrstack из sos-расширения Windbg, я часто получаю неполную информацию о кадрах стека из сборок WPF, например.
SP IP Function
0013E370 564618E3 PresentationFramework_ni!Unknown+0x1bf
0013E3A4 56461258 PresentationFramework_ni!Unknown+0x58
0013E3CC 5634C6D8 PresentationFramework_ni!Unknown+0x18
0013E3D8 55C04AA2 PresentationFramework_ni!Unknown+0x502
...
В этом случае декодирование трассировки стека также становится очень медленным.
Использование !sym noisy показывает много следующих сообщений от
SYMSRV: C:\Symbols\PresentationFramework.ni.dll\488F142Edab000\PresentationFramework.ni.dll not found
SYMSRV: http://msdl.microsoft.com/download/symbols/PresentationFramework.ni.dll/488F142Edab000/PresentationFramework.ni.dll not found
DBGHELP: C:\Program Files (x86)\Debugging Tools for Windows (x86)\PresentationFramework.ni.dll - file not found
DBGHELP: PresentationFramework.ni.dll not found in c:\Windows\System32
SYMSRV: C:\Symbols\PresentationFramework.ni.dll\488F142Edab000\PresentationFramework.ni.dll not found
SYMSRV: http://msdl.microsoft.com/download/symbols/PresentationFramework.ni.dll/488F142Edab000/PresentationFramework.ni.dll not found
DBGENG: C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\PresentationFramewo#\9519494798a88867406b5755e1dbded6\PresentationFramework.ni.dll - Couldn't map image from disk.
SYMSRV: C:\Symbols\PresentationFramework.dll\488F142E50e000\PresentationFramework.dll not found
SYMSRV: http://msdl.microsoft.com/download/symbols/PresentationFramework.dll/488F142E50e000/PresentationFramework.dll not found
DBGHELP: C:\Program Files (x86)\Debugging Tools for Windows (x86)\PresentationFramework.dll - file not found
DBGHELP: PresentationFramework.dll not found in c:\Windows\System32
SYMSRV: C:\Symbols\PresentationFramework.dll\488F142E50e000\PresentationFramework.dll not found
SYMSRV: http://msdl.microsoft.com/download/symbols/PresentationFramework.dll/488F142E50e000/PresentationFramework.dll not found
DBGENG: C:\WINDOWS\assembly\GAC_MSIL\PresentationFramework\3.0.0.0__31bf3856ad364e35\PresentationFramework.dll image header does not match memory image header.
DBGENG: C:\WINDOWS\assembly\GAC_MSIL\PresentationFramework\3.0.0.0__31bf3856ad364e35\PresentationFramework.dll - Couldn't map image from disk.
я использовал
c:\Windows\System32;SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols
как символ windbg и путь к изображению.
Насколько я понял, это происходит только для нативных образов .NET, если машина, на которой произошел сбой, и машина с отладчиком отличаются версией Windows, версией .NET SP. Я видел это в основном для собственных изображений WPF.
Что я могу сделать, чтобы избежать этой проблемы?
Обновление моего первоначального вопроса:
Я забыл упомянуть, что я боролся с подобной проблемой с разными версиями mscordacwks dll. Чтобы использовать SOS, версия mscordacwks.dll, используемая на сбойном компьютере, необходима на компьютере для отладки. Поэтому я начал собирать различные версии этой dll из разных комбинаций Windows и SP и размещать их на нашем собственном сервере символов. Это, конечно, довольно неудобно, и тем более, что они должны быть названы в соответствии со специальным соглашением (например, mscordacwks_x86_x86_2.0.50727.4952.dll).
Если я правильно понимаю ответ Рика ниже, мне нужно сделать что-то подобное для собственных образов сборок .NET, на которые мы ссылаемся. Я попробовал это вручную с одним примером (WindowsBase.ni.dll), но мне не удалось легко сохранить эту dll на нашем сервере символов. Кажется, нативные образы не понимаются симстором. Сообщение об ошибке от symstore:
SYMSTORE MESSAGE: Skipping file .\WindowsBase.ni.dll - not a known file type.
Поэтому я попытался поместить его в дополнительный каталог и добавить в свой путь к символу или изображению, а затем SOS правильно декодировал кадры WindowsBase_ni.
Но все это похоже на утомительную ручную настройку: получение всех нативных образов для разных версий .NET (как насчет SP и обновлений безопасности), настройка отладчика вручную, потому что symstore использовать нельзя,...
Это действительно единственный способ?
Это, вероятно, не такая проблема, если вы можете контролировать среду своих клиентов. Но для организаций, которые создают приложения смешанного режима для больших пользовательских баз, это похоже на кошмар отладки после смерти.