Я работаю над библиотекой, где я занимаюсь различными задачами в некоторых сторонних библиотеках, которые выполняют относительно отрывочную или опасную работу на платформе. (В частности, я пишу математический анализатор функций, который вызывает JIT-компиляторы, такие как LLVM или libjit, для создания машинного кода.) На практике эти сторонние библиотеки имеют тенденцию к сбою (часть из этого - моя ошибка , конечно, но я все еще хочу некоторую страховку).Как изолировать задание/поток от сбоев
Я бы хотел, чтобы я мог очень грамотно справиться с работой, которая ужасно умирает - SIGSEGV, SIGILL и т. Д. - без снижения остальной части моего кода (или кода пользователей, вызывающих мои библиотечные функции). Чтобы быть ясным, меня не волнует, может ли эта конкретная работа продолжить (я не собираюсь пытаться восстановить состояние сбоя), и мне не очень-то интересно состояние объектов после такого сбоя (я отброшу их немедленно, если произошел сбой). Я просто хочу обнаружить, что произошел сбой, остановить крушение, чтобы вытащить весь процесс, прекратить вызывать все, что рушится, и возобновить выполнение.
(Для небольшого контекста код на данный момент представляет собой цикл for, проверяющий каждый из доступных JIT-компиляторов. Некоторые из этих компиляторов могут сбой. Если это так, я просто хочу выполнить continue;
и перейти на с тестированием другого компилятора.)
В настоящее время у меня есть реализация, основанная на signal()
, которая не проходит довольно ужасно; конечно, это неопределенное поведение для longjmp()
из обработчика сигнала, и обработчики сигналов в значительной степени ожидаются в конце с exit()
или terminate()
. Просто бросать код в другой поток не помогает сам по себе, по крайней мере, как я его протестировал до сих пор. Я также не могу взломать способ сделать эту работу с использованием исключений C++.
Итак, как лучше всего изолировать определенный набор инструкций/поток/работу от сбоев?
Это единственный способ сделать это. Поток может повредить память в любом месте процесса, поэтому после SEGV вы не можете гарантировать, что ваша память не затронута. – KeithB
Спасибо за хед-ап. Почти наверняка правильный ответ здесь. Я прочь читать на fork() и компании. –