Изоляция неуправляемых сбоев при Mono

#c# #.net #mono #system.drawing

#c# #.net #mono #system.drawing

Вопрос:

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

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

 System.Drawing.Image.FromFile(imagePath);
  

приведет к сбою. Сообщение об ошибке выглядит примерно так:

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

Это мгновенно останавливает работу всего приложения.

Мы столкнулись с несколькими случаями, когда это происходит — поврежденные файлы GIF, неожиданные заголовки в файлах TIFF — и это лишь некоторые из них. Поскольку у нас нет контроля над источником изображений, нам просто придется иметь дело с возможными сбоями.

Вопрос: я хотел бы изолировать места, где мы используем GDI (через System.Рисование) на ненадежных файлах, чтобы он мог благополучно завершиться без уничтожения всего приложения.

Я пытался это сделать, используя отдельные домены приложений, но я просто не могу остановить сбои. Вполне вероятно, что я делаю это неправильно!

Некоторые подробности: openSUSE 11.4 (x86_64), версия Mono 2.10.2, libgdiplus0 (пакет) 2.10-30.2, libtiff3 (пакет) 3.9.4-3.7.1


Пожалуйста, обратите внимание, что конкретные проблемы, с которыми мы столкнулись, были быстро исправлены — см. Комментарии ниже. Однако вопрос все еще остается.

Мне бы хотелось как-то изолировать часть программы, чтобы она не разрушала все целиком, но я боюсь, что единственный ответ — вызвать внешний процесс, как указано в ответе ниже. Я оставлю это как есть на некоторое время, а затем приму этот ответ!

Комментарии:

1. Я бы предложил регистрировать ошибки для изображений, которые вызывают сбои ( bugzilla.xamarin.com ), чтобы проблемы могли быть устранены. Поскольку синтаксический анализ изображений исторически был источником проблем безопасности, было бы также предпочтительнее, если бы вы сделали ошибку закрытой для Xamarin, чтобы не раскрывать возможную проблему безопасности.

2. Правильно, зарегистрирован как bugzilla.xamarin.com/show_bug.cgi?id=1752 и bugzilla.xamarin.com/show_bug.cgi?id=1753 В конце концов мы обошли Систему стороной. Рисование, когда мы можем и полагаемся на Gdk под Mono, которые пока кажутся гораздо более надежными.

3. @FPC обе проблемы теперь исправлены. Спасибо!

4. ПОТРЯСАЮЩЕ! Очень впечатлен. Спасибо.

Ответ №1:

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

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

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

Комментарии:

1. Хорошее предложение — я «выкладывал» в качестве последнего средства! IPC звучит как открытие мира боли — по крайней мере, чтобы заставить его работать хорошо. Но я думаю, мне, возможно, придется смириться. Спасибо за ответ!

2. IPC на самом деле довольно прост, хорошо, что он находится в Windows со старой инфраструктурой удаленного доступа .NET. Лично я бы просто запустил его в командной строке и дождался кода выхода из exe, который вы можете легко контролировать.

3. Проблема в том, что скорость является обязательным требованием. Использование тысяч файлов изображений было бы неэффективным. IPC — или что-то вроде этого кажется лучшим вариантом — поиск в Google сейчас

4. В этом случае я бы пересмотрел использование самой библиотеки и попытался заменить ее. Получите библиотеку, которая не вызывает апокалипсиса, и тогда вы сможете сохранить весь свой код в одном exe. AForge. NET очень хорош, хотя я не уверен, что есть для Mono.

5. Реализация gdiplus использует (другие) собственные библиотеки для загрузки изображений. Эти библиотеки довольно распространены, поэтому вполне вероятно, что любая другая управляемая библиотека, которая также обеспечивает синтаксический анализ изображений (в Linux), будет использовать ту же собственную библиотеку (если только они не делают это полностью в управляемом коде). Мое предложение состояло бы в том, чтобы запустить внешний процесс и перезапустить его, если изображение вызывает сбой, и попытаться найти способ сделать это inproc более безопасным способом, если это слишком медленно для вас.