Как изолировать задание / поток от сбоев

Я работаю над библиотекой, в которой передаю различные задачи некоторым сторонним библиотекам, которые выполняют некоторую относительно схематичную или опасную работу, специфичную для платформы. (В частности, я пишу синтаксический анализатор математических функций, который вызывает JIT-компиляторы, такие как LLVM или libjit, для создания машинного кода.) На практике эти сторонние библиотеки имеют тенденцию к сбоям (отчасти это моя ошибка , конечно, но мне все еще нужна страховка).

Я бы хотел, чтобы тогда я мог очень изящно справляться с ужасно умирающей работой - SIGSEGV, SIGILL и т. д. - без нарушения остальной части мой код (или код пользователей, вызывающих мои библиотечные функции). Чтобы было ясно, меня не волнует, можно ли продолжить эту конкретную работу (я не собираюсь пытаться исправить состояние сбоя), меня не волнует и состояние объектов после такого сбоя (я сразу их отброшу, если произойдет сбой). Я просто хочу иметь возможность обнаружить, что произошел сбой, остановить сбой от уничтожения всего процесса, прекратить вызывать сбой и возобновить выполнение.

(Для немного большего контекста код на данный момент является for, тестируя каждый из доступных JIT-компиляторов. Некоторые из этих компиляторов могут дать сбой. Если они это сделают, я просто хочу выполнить continue; и продолжить тестирование другого компилятора.)

В настоящее время, У меня есть реализация на основе signal () , которая ужасно не работает; конечно, это неопределенное поведение для longjmp () вне обработчика сигнала, Ожидается, что обработчики сигналов завершатся exit () или terminate () . Простое добавление кода в другой поток само по себе не помогает, по крайней мере, так, как я это тестировал. Я также не могу найти способ заставить эту работу работать с использованием исключений C ++.

Итак, как лучше всего защитить конкретный набор инструкций / потока / задания от сбоев?

6
задан Charles Pence 24 August 2010 в 15:16
поделиться

2 ответа

В Windows , вы можете использовать VirtualProtect (YourMemory, PAGE_READONLY) при вызове ненадежного кода. Любая попытка изменить эту память вызовет структурированное исключение. Можете смело это поймать и продолжить выполнение. Однако память, выделенная этой библиотекой, конечно же, будет протекать, как и другие ресурсы. Эквивалент Linux - mprotect (YorMemory, PROT_READ) , который вызывает SEGV.

0
ответ дан 8 December 2019 в 13:43
поделиться

Какие выходные данные вы собираете при успешном выполнении задания?

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

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

Процессы обеспечивают наилучшую защиту.

5
ответ дан 8 December 2019 в 13:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: