在Mono下隔离非托管崩溃

时间:2011-10-27 12:11:04

标签: c# .net mono system.drawing

我们在Linux下有一个Mono应用程序,可以对一堆文件进行图像处理。

为此我们(除其他外)使用System.Drawing,并且在大多数情况下它很好地为我们服务。然而,偶尔我们会遇到一个崩溃应用程序的图像 - 这是本机调用中的崩溃,这对try catch是免疫的。简化,像

这样的调用
System.Drawing.Image.FromFile(imagePath);

会导致崩溃。错误消息如下所示:

at (wrapper managed-to-native) System.Drawing.GDIPlus.GdipLoadImageFromFile (string,intptr&) <0xffffffff>

这会立即将整个应用程序拉下来。

我们遇到过一些这样的情况 - 损坏的GIF文件,TIFF文件中的意外标题 - 仅举几例。由于我们无法控制图像的来源,我们只需处理可能的崩溃。

问题:我想隔离我们在不受信任的文件上使用GDI +(通过System.Drawing)的地方,这样它就可以在不杀死整个应用程序的情况下快速崩溃。

我通过使用单独的应用程序域尝试了这一点,但我无法阻止崩溃。我可能做错了!

<子> 一些细节:openSUSE 11.4(x86_64),Mono版本2.10.2,libgdiplus0(包)2.10-30.2,libtiff3(包)3.9.4-3.7.1


请注意我们遇到的具体问题已经及时修复 - 请参阅下面的评论。问题仍然存在。

我本来希望以某种方式隔离程序的一部分,这样它就不会把整个程序拉下来 - 但我担心唯一的答案是调用外部程序,如下面的答案中所述。我将暂时离开,然后接受答案!

1 个答案:

答案 0 :(得分:0)

好的,这里有一些天真的因为我对Linux知之甚少... AppDomains(在Windows中无论如何)都驻留在同一个进程中。尝试将有问题的代码分离到另一个进程中,使用命令行或某些通信机制(如IPC),这样如果它崩溃,它不会导致主进程,只会影响子进程。

虽然我过去从未遇到过导致我出现问题的无法捕获的异常,但听起来主要的过程正在被杀死,这是你说过你试过的AppDomain想法之下的一层。

在必要时转换到Linux;对不起,我不能更具体。