由于Xamarin.Droid stacktrace不包含AotID,因此单符号失败

时间:2018-07-16 12:09:21

标签: .net xamarin xamarin.android mono xamarin.droid

我正在尝试使用单符号来符号化由我们的应用发行版产生的堆栈跟踪。在.csproj版本的构建设置中,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

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

为什么我没有在堆栈跟踪中获取AOTID,或者我该如何解决?

0 个答案:

没有答案