诊断转换的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
建议用什么方法来处理这个转换后的堆栈跟踪,以识别有问题的方法名称,或者至少缩小它的范围?
这里有一个更新,以防其他人遇到这个问题。
.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