3

我正在尝试使用 mono-symbolicate 来表示由我们的应用程序的发布版本产生的堆栈跟踪。在 .csproj Release 构建设置中,DebugSymbols、Optimize、MonoSymbolArchive 均已设置为 True,DebugType 已设置为 Full。

在构建 Release 时,它​​似乎成功生成了 msym 文件夹MyApp.Droid 7-13-18 3.35 PM.apkarchive/mSYM/com.myco.myapp.apk.mSYM,其中包含许多以 GUID 命名的文件夹,一些包含单个 .msym 文件,一些包含 .dll 和 .pdb 文件。正如我在堆栈跟踪中看到的那样,似乎 MyApp.Droid 已获得 GUID 7216aaa9c1294991b8b2782974cfb879,并在同名目录中查找,我确实看到了 MyApp.Droid.dll 和 MyApp.Droid.pdb。浏览 msym 文件夹,我还发现了其他四个目录,每个目录都包含一个名为 MyApp.Droid.msym 的文件,我认为这意味着它出于某种原因将 msym 拆分为多个文件。

使用最小堆栈跟踪

at MyApp.Droid.MainActivity.OnCreate (Android.OS.Bundle savedInstanceState) <0x7c92255fd8 + 0x0008b> in <bf44972100fb4c2b8f5abcae2e982c3f>:0

(或任何更完整、更长的堆栈跟踪)并运行mono-symbolicate path/to/MyApp.Droid 7-13-18 3.35 PM.apkarchive/mSYM/com.myco.myapp.apk.mSYM myStackTrace.txt时,单符号脚本崩溃并出现以下错误:

System.IndexOutOfRangeException: Index was outside the bounds of the array.
  at Mono.SymbolManager.GetOrCreateSeqPointInfo (System.String aotid) [0x00057] in <e1e81dae0fc04bc2a59e1766bbba201f>:0 
  at Mono.SymbolManager.TryResolveLocation (Mono.StackFrameData sfData) [0x0002e] in <e1e81dae0fc04bc2a59e1766bbba201f>:0 
  at Mono.Symbolicate.SymbolicateAction (System.Collections.Generic.List`1[T] args) [0x00034] in <e1e81dae0fc04bc2a59e1766bbba201f>:0 
  at Mono.Symbolicate.Main (System.String[] args) [0x0017f] in <e1e81dae0fc04bc2a59e1766bbba201f>:0 

阅读 mono-symbolicate 的源代码,它似乎因为试图从堆栈跟踪中解析一个 aotid 而失败,它似乎不包含。我的理解是,这个 aotid 将是最后一个尖括号内的第二部分,例如:

at MyApp.Droid.MainActivity.OnCreate (Android.OS.Bundle savedInstanceState) <0x7c92255fd8 + 0x0008b> in <bf44972100fb4c2b8f5abcae2e982c3f#4ed70d01848e11d51d01dac0cb2d805e>:0

where4ed70d01848e11d51d01dac0cb2d805e匹配包含 MyApp.Droid.dll.msym 文件的文件夹名称之一。实际上,手动查找包含 MyApp.Droid.dll.msym 的文件夹并#foldername在尖括号中添加为后缀,经过几次尝试后,我找到了一个可以工作的文件夹(不会产生崩溃)。

为什么我没有在堆栈跟踪中获得 AOTID,或者我该如何解决这个问题?

4

0 回答 0