1

我正在使用 Raygun.io (5.2.0) 的 Windows 10 Store 应用程序。我们发布了几次应用程序(最近一次是在 12 月中旬),我在 Rayguns 的 Web 界面中看到了来自以前版本的日志。在发布下一个版本之前测试应用程序时,我发现如果应用程序是使用 .NET 本机工具链构建的,则在发送异常时 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) 处没有异常在事件视图中我可以看到:

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
4

2 回答 2

3

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

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

您没有看到异常的原因是因为运行时对各种断言和下降低谷非常防御,因此在这些情况下它调用 OS FailFast。

希望有帮助。

于 2016-01-26T22:30:22.660 回答
0

摘自微软:

如果运行时缺少必要的元数据或实现代码,.NET Native 运行时会引发异常。您可以防止这些异常,并确保 .NET Native 工具链包含所需的元数据和实现代码,方法是使用运行时指令文件、一个 XML 文件,该文件指定其元数据或实现代码必须在运行时可用的程序元素并分配他们的运行时策略。

来自 Microsoft 的.NET Native 和编译

由 .NET Native 工具链生成的应用程序将写入项目目录的 Debug 或 Release 目录中名为 ilc.out 的目录。它由以下文件组成:

•<em>appName.exe,一个存根可执行文件,它只是将控制权转移到appName .dll 中的一个特殊的 Main 导出。

•<em>appName.dll,一个 Windows 动态链接库,其中包含您的所有应用程序代码,以及来自 .NET Framework 类库和您所依赖的任何第三方库的代码。它还包含支持代码,例如与 Windows 互操作和序列化应用程序中的对象所需的代码。

•mrt100_app.dll,一个重构的运行时,提供垃圾收集等运行时服务。

于 2016-01-21T15:44:37.893 回答