I have a mixed C ++ / CLI application that uses WPF. Failures from our customers are reported as mini-drives to our own server.
When I try to explore the mini drive using the commands! pe or! clrstack from sb extension windbg, I often get incomplete information for stack frames from WPF collectors, for example.
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 ...
In this case, decoding the stack trace also becomes very slow.
Using! sym noisy shows a lot of messages from
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
I used
C: \ Windows \ System32, SRV * C: \ Symbols * Http://msdl.microsoft.com/download/symbols
as a windbg symbol and image path.
As I understand it, this only happens for native .NET images if the machine that crashed and the machine with the debugger is different in terms of the Windows version, .NET version of SP. I saw this mainly for my own WPF images.
What can I do to avoid this problem?
Update original question:
I forgot to mention that I was struggling with a similar problem with different versions of the mscordacwks dll. To use SOS, the version of mscordacwks.dll used on the failed computer is needed on the computer for degradation. So I began to compile different versions of this DLL from different combinations of Windows and SP and put them on our own character server. This, of course, is quite inconvenient, and all the more so because they need to be called by special agreement (eg. Mscordacwks_x86_x86_2.0.50727.4952.dll).
If I understand that Rick answered correctly from below, I should do something similar for my own .NET assembly images that we reference. I tried this manually with one example (WindowsBase.ni.dll), but I could not store this DLL on our symbol server easily. It seems that the native images are not understood by symstore. Error message from symstore:
SYMSTORE MESSAGE: Skipping file .\WindowsBase.ni.dll - not a known file type.
So, I tried to put it in an additional directory and added it to my path to a character or image, and then SOS correctly decoded WindowsBase_ni frames.
But all this seems like a lot of annoying manual settings: getting all your own images for different versions of .NET (as for SP and security updates) by manually setting up the debugger, because symstore cannot be used, ...
Is this really the only way?
This is probably not such a problem if you can control the environment of your customers. But this is like a posthumous debugging nightmare for orgnizations that create mixed-mode applications for large user bases.