如果连接了调试器,为什么我的堆栈跟踪仅包含行号?

the*_*guy 3 .net visual-studio-debugging xamarin.android xamarin raygun

我有一个向Raygun报告崩溃的Xamarin.Android应用程序。从Release版本报告给Raygun的堆栈跟踪不包括行号。如果我为Release构建配置提供与.csproj文件中的Debug配置相同的设置:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
  <DebugSymbols>True</DebugSymbols>
  <DebugType>full</DebugType>
  <Optimize>false</Optimize>
  ...
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

那么我仍然看不到发送给Raygun的堆栈跟踪中的行号。但是,如果我在运行带有附加的Visual Studio调试器的应用程序时,则发送到Raygun的堆栈跟踪信息确实包含行号。请注意,无论如何,所有堆栈跟踪都包括类和方法的名称。这个问题只与行号有关。

如果引发异常时附加了调试器,为什么堆栈跟踪仅包含行号?更重要的是,如何在没有附加调试器的情况下,在Release版本的报告堆栈跟踪中获取行号?

Sus*_*ver 5

您需要mono-symbolicate使用发布版本的符号来符号化“本机” Android崩溃报告(该版本的msym和该构建应用程序必须来自同一版本)。

一些崩溃报告服务直接支持Xamarin,并允许您上载构建的msym文件并自动运行mono-symbolicate,而其他一些则不行,因此需要您手动执行(或某些支持网络挂钩,您可以自己实现以在每次收到的崩溃中运行报告,我是在Fabric上这样做的)

mono-symbolicate
Usage: symbolicate [options] <msym dir> <input file>
       symbolicate [options] store-symbols <msym dir> [<dir>]+

Available options:
  -h, --help                 Show this help
  -q                         Quiet, warnings are not displayed
  -v                         Verbose, log debug messages
Run Code Online (Sandbox Code Playgroud)

接下来,获取未处理异常的崩溃日志

adb logcat -d > errors.txt
Run Code Online (Sandbox Code Playgroud)

最后,使用mono-symbolicate将错误转换为包含文件和行号:

mono-symbolicate path-to-dll-in-.mSYM-directory path-to-errors.txt
Run Code Online (Sandbox Code Playgroud)

例如,给定一个errors.txt及其内容:

I/MonoDroid( 1545): System.Exception: wow it broke
I/MonoDroid( 1545):   at CrashApp.MainActivity+<OnCreate>c__AnonStorey0.<>m__0 (System.Object , System.EventArgs ) [0x00030] in <filename unknown>:0
I/MonoDroid( 1545):   at Android.Views.View+IOnClickListenerImplementor.OnClick (Android.Views.View v) [0x00014] in <filename unknown>:0
I/MonoDroid( 1545):   at Android.Views.View+IOnClickListenerInvoker.n_OnClick_Landroid_view_View_ (IntPtr jnienv, IntPtr native__this, IntPtr native_v) [0x00011] in <filename unknown>:0
I/MonoDroid( 1545):   at (wrapper dynamic-method) System.Object:5616285d-461b-4005-a31b-d4637a8cdddc (intptr,intptr,intptr)
Run Code Online (Sandbox Code Playgroud)

mono-symbolicate会将以上内容转换为:

I/MonoDroid( 1545): System.Exception: wow it broke
I/MonoDroid( 1545):   at CrashApp.MainActivity+<OnCreate>c__AnonStorey0.<>m__0 (System.Object , System.EventArgs ) [0x00030] in /Users/dean/Projects/CrashApp/CrashApp/MainActivity.cs:30
I/MonoDroid( 1545):   at Android.Views.View+IOnClickListenerImplementor.OnClick (Android.Views.View v) [0x00014] in /Users/dean/Documents/Sandbox/Xamarin/dellismonodroid/src/Mono.Android/platforms/android-19/src/generated/Android.Webkit.WebBackForwardList.cs:68
I/MonoDroid( 1545):   at Android.Views.View+IOnClickListenerInvoker.n_OnClick_Landroid_view_View_ (IntPtr jnienv, IntPtr native__this, IntPtr native_v) [0x00011] in /Users/dean/Documents/Sandbox/Xamarin/dellismonodroid/src/Mono.Android/platforms/android-19/src/generated/Android.Webkit.WebBackForwardList.cs:23
I/MonoDroid( 1545):   at (wrapper dynamic-method) System.Object:5616285d-461b-4005-a31b-d4637a8cdddc (intptr,intptr,intptr)
Run Code Online (Sandbox Code Playgroud)