Непонятное исключение - методы отладки (C ++) - PullRequest
2 голосов
/ 27 мая 2011

Я столкнулся с любопытным сценарием, в котором следующий маловероятный код:

try{
  throw Core::ValueError();
}
catch (Core::Error &e){
  ...
}

(ValueError наследует от Error наследует от std :: exception)

приводит к тому, что исключение перехватывается, еслискомпилировано в исполняемый файл, но не в том случае, если оно скомпилировано в определенную общую библиотеку.

И вот мои вопросы:

  1. Какие инструменты и / или методы отладки можно использовать для просмотравнутри черного ящика, который является процессом обработки исключений?Могу ли я пройти через это с помощью GDB?

  2. Есть ли какая-либо информация, которую я мог бы извлечь из заголовков Mach-o, которая могла бы рассказать мне что-нибудь о возможности улова (если хотите) определенных исключений некоторыми пунктами catch?В частности, могу ли я посмотреть, скажем, раздел «gcc_except_tab» с его прекрасными LSDA, или таблицей символов, или другой частью, и вывести любую проблему с видимостью символа или другую проблему, связанную с перехватом исключений?

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

(у меня работает i686-apple-darwin10-g ++ - 4.2.1 на OSX 10.6.7)

1 Ответ

2 голосов
/ 27 мая 2011

Вы бросаете временный объект, поэтому вы должны catch( Core::Error const& e ).

...