在Mono下隔离非托管崩溃

本文关键字:崩溃 隔离 Mono | 更新日期: 2023-09-27 18:12:28

我们有一个Linux下的Mono应用程序,它在一堆文件上做图像处理。

为此,我们(除其他外)使用System。绘画,在很大程度上,它对我们很有帮助。但是,我们偶尔会遇到导致应用程序崩溃的映像——这是本机调用中的崩溃,并且不受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 (package) 2.10-30.2, libtiff3 (package) 3.9.4-3.7.1


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

我本想以某种方式隔离程序的一部分,这样它就不会把整个程序拉下来——但我担心唯一的答案是调用外部进程,如下面的答案所示。我先不考虑这个问题,然后再接受这个答案!

在Mono下隔离非托管崩溃

好吧,这里有一些天真,因为我不太了解Linux…应用域(无论如何在Windows中)驻留在同一进程中。尝试使用命令行或IPC之类的通信机制将有问题的代码分离到另一个进程中,这样如果它崩溃了,它不会使主进程崩溃,只会使子进程崩溃。

虽然我过去从来没有遇到过不可捕获的异常导致我的问题,但听起来像是主进程被杀死了,这是在你说你尝试过的AppDomain想法下面的一层。

必要时翻译成Linuxese…对不起,我不能更具体。