c# - 为什么 .NET Native 上的 Raygun 会导致我的应用程序崩溃?

标签 c# uwp raygun

我正在使用 Raygun.io (5.2.0) 开发 Windows 10 应用商店应用程序。我们发布了该应用程序几次(最近一次是在 12 月中旬),我在 Rayguns 网络界面中看到来自以前版本的日志。在发布下一个版本之前测试应用程序时,我发现如果应用程序是使用 .NET native 工具链构建的,则在发送异常时 Raygun 不再工作(= 崩溃)。 我可以在一个简单的 UWP 测试应用程序中重现它:

public sealed partial class MainPage : Page
{
    //private readonly RaygunClient _raygunClient;

    public MainPage()
    {
        InitializeComponent();

        RaygunClient.Attach("<app_key>");
        //_raygunClient = new RaygunClient("<app_key>");
    }

    private async void OnClick(object sender, RoutedEventArgs e)
    {
        try
        {
            // this is crashing the app when project is build using .NET native toolchain
            // it is not even throwing exception
            //await _raygunClient.SendAsync(new InvalidOperationException("Raygun Test"));
            await RaygunClient.Current.SendAsync(new InvalidOperationException("Raygun Test")); // (1)
            Status.Text = "Ok";
        }
        catch (Exception exception) // (2)
        {
            Status.Text = $"Failed with {exception.Message}";
        }
    }
}

正在检查 https://github.com/MindscapeHQ/raygun4net支持的平台/框架,它似乎不明确支持 UWP。

更新:应用程序在第 (1) 行之后被终止,在 (2) 处没有异常被捕获 在事件 View 中我可以看到:

Faulting application name: rayguntest.exe, version: 1.0.0.0, time stamp: 0x56a0edc9
Faulting module name: mrt100_app.dll, version: 1.0.23406.0, time stamp: 0x561408ce
Exception code: 0x80000003
Fault offset: 0x000000000000a0ad
Faulting process id: 0x305c
Faulting application start time: 0x01d1545a0fea5649
Faulting application path: C:\Projects\rayguntest\rayguntest\bin\x64\Release\AppX\rayguntest.exe
Faulting module path: C:\Program Files\WindowsApps\Microsoft.NET.Native.Runtime.1.1_1.1.23406.0_x64__8wekyb3d8bbwe\mrt100_app.dll
Report Id: 52bbeeb5-97c6-4814-b5dc-51ee6c3fa9bd
Faulting package full name: 6ca59c51-ed22-482b-acf6-12d241079f4d_1.0.0.0_x64__1d8r4kqm7qz2y
Faulting package-relative application ID: App

最佳答案

我们已经完成调查,这确实是 .NET Native 中的一个错误。问题是在某些情况下我们没有正确处理所有涉及无效转换的情况。特别是将 Arrays 转换为具有多个泛型参数的泛型类型。通过检查 SimpleJson.SerializeValue,您可以看到 Raygun 中我们将遇到问题的地方: https://github.com/MindscapeHQ/raygun4net/blob/67c4bb9fd660afb91d62e9333d75a36a85ee5d4f/Mindscape.Raygun4Net/SimpleJson.cs#L1016

一个解决方法是避免让此代码路径首先序列化数组。另一种方法是修补 RayGun 以首先检查数组大小写,并避免它试图做的所有其他猜测。

您看不到异常的原因是因为运行时对各种断言和跌落低谷具有很强的防御性,因此它在这些情况下调用操作系统 FailFast。

希望对您有所帮助。

关于c# - 为什么 .NET Native 上的 Raygun 会导致我的应用程序崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34923594/

相关文章:

c# - 如何使您的服务引用代理 URL 动态化?

c# - 如何找到 2 个 IEnumerable 对象之间的差异

c# - Xamarin 形成自定义导航转换

c# - 我可以在 UWP 上运行一些 http 服务器吗?

在 Windows 10 IoT 上使用 UWP 进行 LDAP 查询

c# - 如何设置 AutoSuggestBox 中文本光标的位置?

go - go 程序中的一般 panic recover

c# - log4net 记录来自不同项目的 UnhandledException 异常

c# - 需要代理身份验证(Forefront TMG 需要授权才能完成请求。拒绝访问 Web 代理筛选器。)

java - 安卓/ Gradle : specify a dependency for a subset of build types