诊断转换的UWP堆栈跟踪的步骤

本文关键字:跟踪 UWP 转换 诊断 堆栈 | 更新日期: 2023-09-27 18:25:15

所以我在发布模式下收到了来自UWP windows应用程序的堆栈跟踪。我现在已经使用windbg将所有地址转换为它们的方法名。

我现在有这样的输出:

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

建议用什么方法来处理这个转换后的堆栈跟踪,以识别有问题的方法名称,或者至少缩小它的范围?

诊断转换的UWP堆栈跟踪的步骤

这里有一个更新,以防其他人遇到这个问题。

.NET Native中的Pdbs和Stacks

.NET本机PDB与您可能期望的PDB不同。请确保保存正确的!作为将应用程序编译为本机代码的一部分,我们需要生成一个新的PDB文件,该文件具有返回源代码的所有正确映射。如果您没有保存正确的PDB,您将拥有完全不可操作的堆栈/转储。如果你丢失了这个文件,就没有办法重新生成它。

对于本地开发构建或您的构建服务器,它将位于以下路径:

<projectRoot>'bin'<Architecture>'<Release|Debug>'ilc'YOURAPPLICATIONNAME.pdb

你会知道它是正确的,因为它将是巨大的(50 MB以上)。上传到应用商店后,您可以从开发中心获得云编译的pdb。

.NET本机堆栈不可读

为了最大限度地精简,.NET Native编译过程剥离了允许运行时生成人类可读堆栈的元数据。今天它们看起来像:

   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at SharedLibrary!<BaseAddress>+0x35d1d7
   at SharedLibrary!<BaseAddress>+0x35d10d
   at SharedLibrary!<BaseAddress>+0x35d0dd
   at FieldMedic!<BaseAddress>+0x13dec5 [2147500037]

如果你使用HockeyApp进行遥测,他们添加了重建堆栈的功能,使其更加有用。请参阅我们的博客文章。

然而,听起来你并没有使用冰球应用程序来进行此类遥测。假设是这样的话,您将需要使用StackParser。复制那个回购,构建,然后离开。

以下是帮助您了解将要处理的内容:

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).

我在Windows开发中心发生了多起崩溃,堆栈跟踪没有帮助。根据Matt Whilden的提示,我使用了StackParser。但手动象征所有崩溃是一件痛苦的事。因此,我编写了一个应用程序,可以对从开发中心下载的.tsv堆栈跟踪进行符号化,还可以使用Windows开发中心API完全自动地对崩溃进行符号化。

如果有人对此感兴趣,这里有一个Github的链接:https://github.com/hig-dev/WindowsDevCenterStacktraceSymbolicater