У нас есть библиотека, которая занимается многими аспектами отчетов об ошибках. Мне было поручено перенести эту библиотеку в Linux. При выполнении моего небольшого набора тестов один из тестов не удался. Ниже приведена упрощенная версия теста.
// Compiler: 4.1.1 20070105 RedHat 4.1.1-52
// Output: Terminate called after throwing an instance of 'int' abort
#include <iostream>
#include <csignal>
using namespace std;
void catch_signal(int signalNumber)
{
signal(SIGINT, SIG_DFL);
throw(signalNumber);
}
int test_signal()
{
signal(SIGINT, catch_signal);
try
{
raise(SIGINT);
}
catch (int &z)
{
cerr << "Caught exception: " << z << endl;
}
return 0;
}
int main()
{
try
{
test_signal();
}
catch (int &z)
{
cerr << "Caught unexpected exception: " << z << endl;
}
return 0;
}
Я ожидаю, что появится сообщение Caught exception:. На самом деле происходит то, что программа завершается, поскольку никакой обработчик catch не присутствует для брошенного int.
Есть несколько вопросов о SO, которые кажутся связанными. Я нашел несколько страниц Google, которые были связаны. Кажется, что "мудрость" сводится к.
- Я не могу генерировать исключения из обработчиков сигналов, вызывать сигнал обработчик работает со своим собственным стеком, поэтому на нем не определены обработчики.
- Ya может генерировать исключения из обработчиков сигналов, просто восстановить подделку кадр в стеке, и вам хорошо идти.
- Я, мы делаем это все время. Это работает для меня на платформе X
-
Ya, который раньше был доступен с gcc, но, похоже, не работает Больше. Попробуйте опцию -fnon-call-exceptions, возможно, она будет работать
Код работает как ожидалось в нашем компиляторе/средах AIX/TRU64/MSVC. Это не удается в нашей Linux-среде.
Я ищу предложения, которые помогут решить эту проблему, поэтому поведение библиотеки в Linux будет соответствовать моим другим платформам, или каким-то образом или обходным путем, которые могут обеспечить такую же функциональность.