SIGABRT при попытке вызвать исключение - PullRequest
0 голосов
/ 25 июня 2011

У меня очень странная проблема, которая заняла у меня уже несколько часов:

При неправильном вводе программного обеспечения, над которым я работаю, я могу выдать исключение (которое, конечно, предназначено),Это работает нормально, и я вижу правильное сообщение об ошибке при выполнении программы.Но когда я передаю точно такой же ввод через API (который дает почти тот же поток управления), программа падает.С отладкой я вижу следующее (я использую gdb для отладки):

  • Класс Exception (в данном случае называется UserExcption, и этот класс не имеет виртуальных методов, а также его предшественники не имеют никаких виртуальных методов) успешно создается.
  • Когда я перехожу "в оператор throw" (хочу сказать, что я просто продолжаю шаг после создания экземпляра объекта исключения), я получаю следующий вывод:

(gdb) s

Чистый виртуальный метод называется

Программа получила сигнал SIGABRT, прервано.

0x00007fff95c64ce2 в __pthread_kill ()

(GDB)

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

Кто-нибудь имеет представление о том, что может быть источником такого поведения?

Лучший Маркус

1 Ответ

2 голосов
/ 25 июня 2011

Интересно, если вы вызываете какой-то (не чистый) виртуальный метод из конструктора или деструктора, или, возможно, какой-то тип приведения неверен. Я полагаю, вы должны проверить это в своем классе исключений, поскольку вы получаете ошибку при создании одного экземпляра.

Действительно, компилятор не даст вам класс с не реализованной чисто виртуальной функцией. С другой стороны, полиморфизм виртуальных функций не совсем безопасен в конструкторе и деструкторах.

Просто предложение, но не видя код, это всего лишь гипотеза.

Я бы тоже сделал чистую сборку, может быть, у вас есть некоторые устаревшие объекты по какой-то причине.

...