Steps to diagnose translated UWP stack trace
Asked Answered
P

2

5

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?

Panteutonism answered 1/12, 2015 at 11:48 Comment(2)
Hey Brad, I work on the .NET Native runtime and compiler team. We're working on some tooling to help with scenarios like this but would like your feedback. Can you send a mail to us at [email protected]? WE can post back here when we've hit pay dirt. :-)Azelea
Did you find a solution?Misogamy
A
6

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).
Azelea answered 28/2, 2017 at 0:56 Comment(2)
Hi, I do have my pdb file , and crash trace as a separate .txt file . I would like to translate release mode stack trace into readable one, how to do this ?Danaides
Hi I do have pdb file and a crash stack trace , I would like to build a server which translates stack trace to readable format. Kindly help.Danaides
C
2

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

Cheng answered 20/11, 2017 at 23:47 Comment(4)
Hi , I do have my app's release mode pdb file and crash trace in a separate text file(crash.txt) . How to symbolicate the release mode crash into readable format.Danaides
Hi I do have pdb file and a crash stack trace , I would like to build a server which translates stack trace to readable format. Kindly help.Danaides
Any document by Microsoft on "how to parse uwp live crash using pdb files" would be helpful.Danaides
Hi , I am getting the following error , what would be the problem "System.Runtime.InteropServices.COMException (0x806D0005): Exception from HRESULT: 0x806D0005 at StackParser.IDiaDataSource.loadDataFromPdb(String pdbPath) at StackParser.DiaHelper.LoadPDB(String pdbFileName) ,Danaides

© 2022 - 2024 — McMap. All rights reserved.