诊断已翻译的UWP堆栈跟踪的步骤

所以我在发布模式下从我的UWP窗口应用程序收到一个堆栈跟踪。 我现在已经使用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 

什么是build议的方式来处理这个翻译的堆栈跟踪来识别有问题的方法名称,或者至less缩小它?

如果有人遇到这个问题,这里是一个更新。

在.NET本地的Pdbs和堆栈

.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进行遥测,他们增加了重建堆栈的功能。 看到我们的博客文章 。

但是,这听起来像是你没有使用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