代码之家  ›  专栏  ›  技术社区  ›  tacos_tacos_tacos

typeinitializationexceptions如何以及为什么会在linux上崩溃dotnet,我如何防御地防止这种情况?

  •  1
  • tacos_tacos_tacos  · 技术社区  · 6 年前

    我一直在用 dotnet 在Linux上有一段时间了,我注意到 点网 进程很难崩溃,每当 TypeInitializationException 发生。

    当然,解决方案是修复底层类型初始化问题,但我想知道 为什么 这种例外不是 点网 可以恢复,2)我是否可以做些什么来阻止 点网 如果发生这种异常会崩溃吗?未处理的有什么更糟的吗 类型初始化异常 与其他未处理的异常相反?

    例子

    例如,对我的应用程序的一个api调用最终会命中以下代码行。

    特别是在负载测试这个api调用时,我开始看到 点网 撞车。

    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 没有这些特殊的代码- 在没有安装gdi的linux机器上。 有时为了重现崩溃,我不得不用一些负载(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
    
    0 回复  |  直到 6 年前