我正在使用Raygun.io (5.2.0)开发一个Windows10Store应用程序。我们发布了几次应用程序(最近一次是在12月中旬),我在光线枪网络界面上看到了以前版本的日志。在发布下一个版本之前对这个应用程序进行测试时,我发现,如果应用程序是使用.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)行之后终止,在“事件视图”( Event )中也没有例外:
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发布于 2016-01-26 22:30:22
我们已经完成了我们的调查,这确实是.NET本地版中的一个bug。问题是,对于某些情况,我们没有正确处理所有涉及无效强制转换的案件。具体而言,将数组转换为具有多个泛型参数的泛型类型。通过检查SimpleJson.SerializeValue:https://github.com/MindscapeHQ/raygun4net/blob/67c4bb9fd660afb91d62e9333d75a36a85ee5d4f/Mindscape.Raygun4Net/SimpleJson.cs#L1016,您可以看到雷炮中我们将要遇到问题的地方。
一种解决方法是避免首先让这个代码路径序列化Array。另一种方法是修补RayGun,首先检查数组的情况,避免所有其他猜测。
您没有看到异常的原因是,运行时对于各种断言和低谷非常防御性强,因此在这些情况下它调用OS FailFast。
希望这能有所帮助。
发布于 2016-01-21 15:44:37
摘录自Microsoft:
如果运行时缺少必要的元数据或实现代码,则.NET本机运行时将引发异常。您可以防止这些异常,并确保.NET本机工具链包括所需的元数据和实现代码,方法是使用运行时指令文件文件,该文件指定程序元素,其元数据或实现代码必须在运行时可用,并将运行时策略分配给它们。
来自微软的.NET原生和编译
由.NET本机工具链生成的结果应用程序被写入到项目目录的调试或发布目录中名为ilc.out的目录中。它由以下文件组成: ·appName.exe,一种存根可执行文件,它简单地将控制转移到appName.dll中的特定主导出。 ·appName.dll是一个,它包含所有应用程序代码,以及来自.NET框架类库和您所依赖的任何第三方库的代码。它还包含支持代码,例如与Windows互操作和序列化应用程序中的对象所需的代码。 ·mrt100_app.dll,一个重构的运行时,提供诸如垃圾收集之类的运行时服务。
https://stackoverflow.com/questions/34923594
复制相似问题