Есть ли в Linux эквивалент _set_purecall_handler ()?

0

Я хотел переопределить стандартный обработчик для чистого виртуального вызова (__cxa_pure_virtual()) с моим собственным. Ответ для Windows - "_set_purecall_handler()".

Есть ли аналогичное средство в Linux/GNU?

Теги:
gcc
gnu

2 ответа

4
Лучший ответ

Вы подошли так близко, чтобы ответить на этот вопрос самостоятельно. Это источник __cxa_pure_virtual в gcc/libstdc++-v3/libsupc++/pure.cc:

extern "C" void
__cxxabiv1::__cxa_pure_virtual (void)
{
  writestr ("pure virtual method called\n");
  std::terminate ();
}

Таким образом, нет прямого эквивалента Microsoft _set_purecall_handler с GCC. Тем не менее, поскольку std::terminate вызывается этой функцией, вы можете использовать std::set_terminate для установки обработчика, который std::set_terminate после его печати.

Другим возможным решением является предоставление собственного определения __cxxabiv1::__cxa_pure_virtual которое переопределяет библиотечную функцию. Что-то вроде этого:

namespace __cxxabiv1 {
        extern "C" void
        __cxa_pure_virtual(void) {
                char const msg[] = "my pure virutal\n";
                write(2, msg, sizeof msg - 1);
                std::terminate();
        }
}
  • 0
    Спасибо! Оба ваши предложения имеют смысл (и я действительно искал источник для pure.cc, но не знал о std :: set_terminate ()). Фактически, std :: terminate () - это именно то, что я хотел обойти. Так что std::set_terminate() является (достаточно близким) ответом!
  • 0
    Так что это слабый символ, иначе он нарушает ODR.
Показать ещё 8 комментариев
0

Без каких-либо дополнительных предупреждений, включенных вообще g++ (4.5 проверено), вы скажете, что вы вызываете абстрактную функцию из конструктора/деструктора, что должно аннулировать необходимость в настройке настраиваемого обработчика.

Поскольку действительная C++ программа никогда не приведет к чистому виртуальному вызову, я предполагаю, что этот обработчик установлен в Windows для целей диагностики/отладки. В этом случае гораздо проще диагностировать во время компиляции, а не во время выполнения.

  • 0
    Нет, я не говорю об обработке ошибок времени компиляции. Этот вопрос касается обработки исключений во время выполнения (т. __cxa_pure_virtual() Всякий раз, когда __cxa_pure_virtual() ).
  • 0
    Нет, я не установил этот обработчик в Windows. Я только что искал, и ответ, и я нашел, был только для Windows. И да, приложение, скомпилированное в Linux g ++, может и действительно останавливается в этом вызове во время выполнения. У конкретного рассматриваемого приложения нет ошибок времени компиляции. Это сложное многопоточное приложение, где экземпляры объекта производного класса просто «исчезают» во время выполнения, что приводит к системному исключению из этого «чисто виртуального вызова».
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню