【问题标题】:Why do my stack traces only include line numbers if the debugger is attached?如果附加了调试器,为什么我的堆栈跟踪只包含行号?
【发布时间】:2018-09-13 08:32:57
【问题描述】:

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

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

然后我仍然看不到发送到 Raygun 的堆栈跟踪中的行号。但是,如果我在附加了 Visual Studio 调试器的情况下运行应用程序,则发送到 Raygun 的堆栈跟踪确实包含行号。请注意,在任何情况下,所有堆栈跟踪都包括类和方法名称。这个问题只关心行号。

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

【问题讨论】:

    标签: .net xamarin xamarin.android visual-studio-debugging raygun


    【解决方案1】:

    您需要通过mono-symbolicate 使用发布构建的符号来表示“原生”Android 崩溃报告(构建的 msym 和构建应用必须来自同一个构建)。

    一些崩溃报告服务直接支持 Xamarin 并允许您上传构建的 msym 文件并自动运行mono-symbolicate,其他不支持因此需要您手动执行(或者某些支持 web-hook 并且您可以自己实现它在收到的每个崩溃报告上运行,我在 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
    

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

    adb logcat -d > errors.txt
    

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

    mono-symbolicate path-to-dll-in-.mSYM-directory path-to-errors.txt
    

    例如,给定一个包含以下内容的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)
    

    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)
    

    【讨论】:

      猜你喜欢
      • 2021-09-28
      • 1970-01-01
      • 2022-08-18
      • 2016-02-19
      • 1970-01-01
      • 2017-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多