Почему Raygun в.NET Native вызывает сбой моего приложения?
Я работаю над приложением для Магазина Windows 10, где я использую Raygun.io (5.2.0). Мы выпустили приложение пару раз (последний раз в середине декабря). Я вижу в веб-интерфейсе Rayguns логи предыдущих версий. При тестировании приложения сейчас, перед публикацией следующей версии, я обнаружил, что Raygun больше не работает (= сбой) при отправке исключений, если приложение создается с использованием встроенного набора инструментов.NET. Я могу воспроизвести это в простом тестовом приложении 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
2 ответа
Мы завершили наше расследование, и это действительно ошибка внутри.NET Native. Проблема в том, что в некоторых случаях мы неправильно обрабатывали все случаи, связанные с недействительными приведениями. Специально приведение массивов к универсальному типу с более чем одним универсальным параметром. Вы можете увидеть пятна в Raygun, где мы собираемся столкнуться с проблемами, изучив SimpleJson.SerializeValue: https://github.com/MindscapeHQ/raygun4net/blob/67c4bb9fd660afb91d62e9333d75a36a85ee5d4f/Mindscape.Raygun4Net/SimpleJson.cs#L1016
Одним из обходных путей может быть предотвращение сериализации массива в этом пути кода. Во-вторых, я бы исправил RayGun, чтобы сначала проверить регистр массива и избежать всех других догадок, которые он пытается сделать.
Причина, по которой вы не видите исключения, заключается в том, что среда выполнения довольно защищена от различных утверждений и падений, поэтому в этих случаях она вызывает ОС FailFast.
Надеюсь, это поможет.
Выдержка из Microsoft:
Если необходимые метаданные или код реализации отсутствуют во время выполнения, среда выполнения.NET Native вызывает исключение. Вы можете предотвратить эти исключения и убедиться, что цепочка инструментов.NET Native включает в себя необходимые метаданные и код реализации, используя файл директив времени выполнения, файл XML, который обозначает элементы программы, метаданные или код реализации которых должны быть доступны во время выполнения, и назначает политика выполнения для них.
От Microsoft на .NET Native и Компиляция:
Полученное приложение, созданное цепочкой инструментов.NET Native, записывается в каталог с именем ilc.out в каталоге Debug или Release каталога вашего проекта. Он состоит из следующих файлов:
•appName.exe, исполняемый файл-заглушка, который просто передает управление специальному главному экспорту в appName.dll.
•appName.dll, библиотека динамических ссылок Windows, которая содержит весь код вашего приложения, а также код из библиотеки классов.NET Framework и любых сторонних библиотек, от которых вы зависите. Он также содержит код поддержки, такой как код, необходимый для взаимодействия с Windows и для сериализации объектов в вашем приложении.
• mrt100_app.dll - измененная среда выполнения, предоставляющая такие службы времени выполнения, как сборка мусора.