Как и почему TypeInitializationExceptions аварийно завершают работу dotnet в Linux, и как я могу предотвратить это в обороне? - PullRequest
0 голосов
/ 11 декабря 2018

Я уже некоторое время использую dotnet в linux, и я заметил, что мой dotnet процесс сильно падает и выдает дамп ядра при каждом TypeInitializationException.

Конечнорешение состоит в том, чтобы исправить основную проблему инициализации типа, но мне интересно , почему исключение такого рода не исключение, из которого dotnet может восстановиться, и 2) есть ли что-то, что я могу сделать, чтобы предотвратитьdotnet сбой при возникновении такого исключения?Есть ли что-то худшее в необработанном TypeInitializationException в отличие от других необработанных исключений?

example

Например, один из вызовов API моего приложения в конечном итоге встречает следующие строки кода.

Во время нагрузочного тестирования этого вызова API, в частности, я начал видеть мой dotnet сбой.

using (var gThumbNail = System.Drawing.Graphics.FromImage(scaledMap)) {
    gThumbNail.FillRectangle(new System.Drawing.SolidBrush(System.Drawing.Color.FromName(backgroundcolor)), 0, 0, width, height);

    int masterWidth = large.Width;
    int masterHeight = large.Height;
    int heightOffset = 0;
    int widthOffset = 0;
    int oldHeight = height;
    int oldWidth = width;

    // Scale or crop desired size thumb from master image
    if (cropthumb == false) {
        var pluckRect = new System.Drawing.Rectangle(large.Width / 2 - width / 2, large.Height / 2 - height / 2, width, height);
        var cropRect = new System.Drawing.Rectangle(0, 0, width, height);
        gThumbNail.DrawImage(large, cropRect, pluckRect, System.Drawing.GraphicsUnit.Pixel);
    } else {
        gThumbNail.DrawImage(large, widthOffset / 2, heightOffset / 2, width, height);
    }
}

Вы можете воспроизвести это, создав новый System.Drawing.Graphics без всего этого конкретного кода - на машине с Linux без установленного GDI. Иногда, чтобы воспроизвести сбой, я должен ударить его с некоторой нагрузкой (5 или 10 одновременно работающих пользователей).

Когда я проверял дамп ядра, я обнаружил:

Nested exception -------------------------------------------------------------
Exception object: 00007fcab86500b0
Exception type:   System.TypeInitializationException
Message:          The type initializer for 'Gdip' threw an exception.
InnerException:   System.DllNotFoundException, Use !PrintException 00007FCAB864AAC8 to see more.
StackTrace (generated):
    SP               IP               Function
    00007FC994FF5A70 00007FCFCD621866 System.Drawing.Common.dll!Unknown+0x56
    00007FC994FF5AF0 00007FCFCD621735 System.Drawing.Common.dll!Unknown+0x95
    00007FC994FF5B50 00007FCFCD61EADA Acme.App.dll!Unknown+0x9ca
    00007FC994FF5F30 00007FCFC5D88ACF System.Private.CoreLib.dll!System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()+0x1f
    00007FC996FF9F40 00007FCFC5DCBEB7 System.Private.CoreLib.dll!System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task)+0x57
    00007FC996FF9F60 00007FCFCD5B8CD3 Acme.App.dll!Unknown+0x343
    00007FC9F3FFBAF0 00007FCFCD621735 System.Drawing.Common.dll!Unknown+0x95
    00007FC9F3FFBB50 00007FCFCD61EADA Acme.App.dll!Unknown+0x9ca
    00007FC996FFA040 00007FCFC5D88ACF System.Private.CoreLib.dll!System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()+0x1f
    00007FC9F3FFBF30 00007FCFC5D88ACF System.Private.CoreLib.dll!System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()+0x1f
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...