Изоляция неуправляемых сбоев под Mono - PullRequest
4 голосов
/ 27 октября 2011

У нас есть приложение Mono под Linux, которое выполняет обработку изображений для нескольких файлов.

Для этого мы (помимо всего прочего) используем System.Drawing, и по большей части он нам хорошо служит.Тем не менее, иногда мы сталкиваемся с изображением, которое приводит к сбою приложения - это сбой при нативном вызове, и он неуязвим для попытки перехвата.Упрощенно, вызов типа

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 голосов
/ 27 октября 2011

Хорошо, с некоторой наивностью здесь, потому что я не очень разбираюсь в Linux ... Домены приложений (в любом случае, в Windows) находятся в одном и том же процессе. Попробуйте разделить проблемный код на другой процесс, используя командные строки или какой-либо механизм связи, например IPC, чтобы в случае сбоя он не остановил основной процесс, а только дочерний процесс.

Хотя у меня никогда не было неуловимого исключения, которое вызывало мои проблемы в прошлом, похоже, что основной процесс завершается, что находится на уровне ниже идеи AppDomain, которую, как вы сказали, вы пытались.

При необходимости переведите на Linuxese ... извините, я не могу быть более конкретным.

...