Я уже некоторое время использую 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