为什么Raygun on .NET Native导致我的应用程序崩溃?

时间:2016-01-21 12:16:49

标签: c# uwp raygun

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

type
  TMyThread = class(TThread)
  private
    { Private declarations }
    FCS:TCriticalSection;
  public
    procedure Write(msg:string);
  protected
    procedure Execute; override;
    constructor Create(ACS: TCriticalSection);
  end;

constructor TMyThread.Create(ACS: TCriticalSection);
begin
  inherited Create;  // don't forget to call inherited constructor
  FCS:= ACS;
end;

procedure TMyThread.Write(msg:string);
begin
  FCS.Enter;
  { WRITING IN FILE msg }
  FCS.Leave;
end;

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

更新:应用程序在第(1)行后被杀死,在(2)处没有异常 在事件视图中,我可以看到:

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}";
        }
    }
}

2 个答案:

答案 0 :(得分:3)

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

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

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

希望有所帮助。

答案 1 :(得分:0)

摘自微软:

  

如果运行时缺少必要的元数据或实现代码,   .NET Native运行时抛出异常。你可以防止这些   例外,并确保.NET Native工具链包含   所需的元数据和实现代码,使用runtime directives file,   指定程序元素的XML文件   其元数据或实现代码必须在运行时可用   为它们分配运行时策略。

来自Microsoft .NET Native and Compilation

  

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

     

appName .exe,一个简单地将控制转移到a的存根可执行文件   特殊主要导出在 appName .dll。

     

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

     

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