So I have received a stack trace from my UWP windows application in release mode. I've now translated all the addresses to their method names using windbg.
I now have this output:
System.InvalidOperationException: InvalidOperation_EnumFailedVersion. For
more information, visit http://go.microsoft.com/fwlink/?LinkId=623485
at MyApp!<BaseAddress>+0x7710b7
- MyApp!System::Func$4<System::__Canon,System::__Canon,System::__Canon,System::__Canon>.BeginInvoke+0x27
| (00b710c0) MyApp!System::Func$4<System::__Canon,System::__Canon,System::__Canon,System::__Canon>.Invoke
at MyApp!<BaseAddress>+0x771125
- MyApp!System::Func$3<System::__Canon,System::Int32,System::__Canon>.GetThunk+0x45
| (00b71130) MyApp!System::Func$3<System::__Canon,System::Int32,System::__Canon>.ReverseInvokeImpl
at MyApp!<BaseAddress>+0x7710d5
- MyApp!System::Func$4<System::__Canon,System::__Canon,System::__Canon,System::__Canon>.Invoke+0x15
| (00b710e0) MyApp!System::Func$3<System::__Canon,System::Int32,System::__Canon>.GetThunk
at MyApp!<BaseAddress>+0x85d8c9
- MyApp!$58_System::Net::Http::HttpContent::<>c__DisplayClass0.<ReadAsStringAsync>b__1$catch$0+0x16
| (00c5d8f2) MyApp!$58_System::Net::Http::HttpContent::<>c__DisplayClass0.<ReadAsStringAsync>b__1$catch$1
at MyApp.Collections.ViewModelCollection.<PrependListOfViewModelsAsync>b__24_1(ViewModels.ViewModel nt)
at MyApp!<BaseAddress>+0x784241
- MyApp!$45_System::Collections::Generic::Dictionary$2<$76_Microsoft::CSharp::RuntimeBinder::Syntax::OperatorKind,System::__Canon>.Remove+0x81
| (00b84310) MyApp!$45_System::Collections::Generic::Dictionary$2<$76_Microsoft::CSharp::RuntimeBinder::Syntax::OperatorKind,System::__Canon>.Resize
at MyApp!<BaseAddress>+0x786623
- MyApp!$45_System::Collections::Generic::Dictionary$2<$54_Newtonsoft::Json::Serialization::DefaultSerializationBinder::TypeNameKey,System::__Canon>.Remove+0x3
| (00b86790) MyApp!$45_System::Collections::Generic::Dictionary$2<$54_Newtonsoft::Json::Serialization::DefaultSerializationBinder::TypeNameKey,System::__Canon>.Resize
at MyApp!<BaseAddress>+0x7e41af
- MyApp!$62_System::Linq::Expressions::ConditionalExpression.Make+0x3f
| (00be4250) MyApp!$47_Internal::Reflection::Execution::FoundationTypesImplementation.get_SystemObject
at System.Collections.Generic.List<System.Object>..ctor(Collections.Generic.IEnumerable<System.Object> collection)
at MyApp.Collections.ViewModelCollection.<>c__DisplayClass24_0.<PrependListOfViewModelsAsync>b__0()
at System.Action.Invoke()
at MyApp!<BaseAddress>+0xcbb04f
- MyApp!$121_Type23.ReadArrayOfUrlEntityFromXml+0x1cf
| (010bb1a0) MyApp!$121_Type16.ReadArrayOfMediaFromXmlIsGetOnly
at MyApp!<BaseAddress>+0xdb9c41 --- End of stack trace from previous location where exception was thrown ---
- MyApp!$70_System::Xml::XmlConvert.CreateException+0xe1
| (011b9d60) MyApp!$70_System::SR.get_Xml_InvalidSurrogateHighChar
at MyApp!<BaseAddress>+0x819f65
- MyApp!$62_System::Linq::Expressions::Interpreter::LightCompiler.CompileNewExpression+0x55
| (00c1a190) MyApp!$62_System::Linq::Expressions::Interpreter::InstructionList.EmitNew
at MyApp!<BaseAddress>+0x81a319
- MyApp!$62_System::Linq::Expressions::Interpreter::LightCompiler.CompileMemberInit+0xb9
| (00c1a618) MyApp!$62_System::Linq::Expressions::Interpreter::LightCompiler.CompileMemberInit$fin$0
at MyApp!<BaseAddress>+0x9e9843 --- End of stack trace from previous location where exception was thrown ---
- MyApp!_$ILCT$::$ILT$ReflectionDynamicInvoke$.InvokeRetVI<$61_Windows.Foundation.Rect>+0x63
| (00de9850) MyApp!$122_Microsoft::Graphics::Canvas::Effects::AtlasEffect.put_SourceRectangle
at MyApp!<BaseAddress>+0x819f65
- MyApp!$62_System::Linq::Expressions::Interpreter::LightCompiler.CompileNewExpression+0x55
| (00c1a190) MyApp!$62_System::Linq::Expressions::Interpreter::InstructionList.EmitNew
at MyApp!<BaseAddress>+0x81a319
- MyApp!$62_System::Linq::Expressions::Interpreter::LightCompiler.CompileMemberInit+0xb9
| (00c1a618) MyApp!$62_System::Linq::Expressions::Interpreter::LightCompiler.CompileMemberInit$fin$0
at MyApp!<BaseAddress>+0x9f0481 --- End of stack trace from previous location where exception was thrown ---
- MyApp!$122_McgInterop::ForwardComSharedStubs.Func_Microsoft_Graphics_Canvas_CanvasDrawingSession__Numerics_Vector2__float__rg_Microsoft_Graphics_Canvas_Text_CanvasGlyph__bool__uint___Rect__+0x1b1
| (00df04f1) MyApp!$122_McgInterop::ForwardComSharedStubs.Func_Microsoft_Graphics_Canvas_CanvasDrawingSession__Numerics_Vector2__float__rg_Microsoft_Graphics_Canvas_Text_CanvasGlyph__bool__uint___Rect__$fin$0
at MyApp!<BaseAddress>+0x819f65
- MyApp!$62_System::Linq::Expressions::Interpreter::LightCompiler.CompileNewExpression+0x55
| (00c1a190) MyApp!$62_System::Linq::Expressions::Interpreter::InstructionList.EmitNew
at MyApp!<BaseAddress>+0x81a17f
- MyApp!$62_System::Linq::Expressions::Interpreter::LightCompiler.CompileNewExpression+0x26f
| (00c1a190) MyApp!$62_System::Linq::Expressions::Interpreter::InstructionList.EmitNew
at MyApp!<BaseAddress>+0x8dc247 Stack: InvalidOperation_EnumFailedVersion. For more information, visit http://go.microsoft.com/fwlink/?LinkId=623485
- MyApp!$78_System::Runtime::Serialization::CollectionDataContract.IsCollectionOrTryCreate+0x2f7
| (00cdc720) MyApp!$78_System::Runtime::Serialization::CollectionDataContract..ctor
What is the recommended way to approach this translated stack trace to identify the offending method name or at least narrow it down?
Here's an update in case anyone else runs into this issue.
Pdbs and Stacks in .NET Native
.NET Native PDBs are different than the PDBs you may expect. Make sure to save the correct ones! As part of compiling you application to native code, we need to generate a new PDB file that has all the proper mappings back to your source. If you don’t save the correct PDB you will have completely non-actionable stacks/dumps. There is no way to regenerate this file if you lose it.
For local dev builds or your build server it will live at paths like:
<projectRoot>\bin\<Architecture>\<Release|Debug>\ilc\YOURAPPLICATIONNAME.pdb
You’ll know it’s the right one because it’ll be gigantic (50+MB). After you upload to the Store you can get your cloud compiled pdb from the Dev center.
.NET Native stacks aren’t human readable
In an effort to be maximally lean, the .NET Native compilation process strips out metadata that would allow the runtime to generate human readable stacks. Today they look something like:
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at SharedLibrary!<BaseAddress>+0x35d1d7
at SharedLibrary!<BaseAddress>+0x35d10d
at SharedLibrary!<BaseAddress>+0x35d0dd
at FieldMedic!<BaseAddress>+0x13dec5 [2147500037]
If you use HockeyApp for telemetry, they have added functionality to reconstruct stacks to be more useful. See our blog post.
However, it sounds like you’re not using HockeyApp for telemetry of this sort of thing. Presuming that’s the case, you’ll need to use StackParser. Clone that repo, build, and away you go.
Here’s the help to give you an idea of what you’ll be dealing with:
StackParser [/pdbs {pdbFiles}] [/modules {PE files}]
[/keep] [/in inputFile] [/out outputfile] [/symsrv definition]
All arguments are optional, but at least one pdb file or one PE file need to be defined.
/pdb {pdbFiles} A non empty list of pdb files to be used
/modules {PE files} A non empty list of loaded modules used.
Symbols are fetched from the symbol store.
/keep Keep the pdb files.
(default: all downloaded symbol files are deleted).
/in <file> Input to operate on (default: stdin).
/out <file> Append output to file (default: stdout).
/symsrv <definition> "Standard"definition for symbol server cache.
(Implies /keep).
Examples:
StackParser /pdbs app.pdb SharedLibrary.pdb < log.txt
Uses existing PDB files to convert log.txt and writes result to console.
StackParser /pdbs app.pdb /modules Lib.dll /in log.txt /out symlog.txt
Uses existing PDB (app.pdb) and looks up pdb file for Lib.dll;
reads input from log.txt and writes result to symlog.txt.
StackParser /modules foo.dll /in log.txt /symserver srv*c:\symbols*http://msdl.microsoft.com/download/symbols
Converts log.txt by getting symbols from public symbol server
(with local cache at c:\symbols).
I had multiple crashes in the Windows Dev Center with not helpful stack traces. With the tip of Matt Whilden I used StackParser. But it was a pain to symbolicate all the crashes manually. So I wrote an application that can symbolicate the downloaded .tsv stack traces from the Dev Center and it can also use the Windows Dev Center API to symbolicate crashes fully automatically.
Here is a link to the Github in case that someone is interested in this: https://github.com/hig-dev/WindowsDevCenterStacktraceSymbolicater
来源:https://stackoverflow.com/questions/34019714/steps-to-diagnose-translated-uwp-stack-trace