Можно ли получить трассировку стека для необработанных (объективных) исключений C++?

Я разрабатываю приложение для iOS, которое недавно расширило большую базу C++. C++ не моя сильная сторона, и я расстраиваюсь из-за исключений. То, что я ищу, - это способ получить дорожку стека на сайт (необработанного) исключения. Я скажу, что квалификатор «необработанный» необязателен; Я бы остановился на любом исключении в крайнем случае, хотя необработанные исключения идеальны.

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

std::vector<int> my_vector;
my_vector.at(40) = 2; // Throws std::out_of_range

Приложение сломается main(), и я получу сообщение в журнале, в котором говорится: исключение." Не полезно.

Размещение общих блоков try/catch выше в стеке вызовов также не помогает, потому что стек вызовов раскручивается во время обработки исключения до точки блока catch, оставляя меня в неведении о фактическом происхождении исключения. Это также относится к предоставлению моего собственного terminate_handler. Утверждения более полезны, но они требуют, чтобы я в некоторой степени предвидел условия ошибки, что я не всегда могу делать. Я все же хотел бы, чтобы отладчик мог вмешиваться, даже если неожиданное исключение обходит мои упреждающие assert()s.

Чего я хочу избежать, так это необходимости заключать каждый вызов, который может вызвать исключение, в блок try/catch только для того, чтобы получить трассировку стека до ошибки. Во время выполнения я действительно не заинтересован в перехвате этих исключений. Когда они происходят, это означает, что в выполнении программы есть фатальная ошибка, и она не может нормально продолжаться. Я просто хочу получить уведомление, чтобы определить причину и устранить проблему, чтобы она больше не повторилась.


В Objective C я могу поставить символическую точку останова на objc_exception_throw, и каждый раз, когда я что-то испорчу, я немедленно прерву выполнение и получу хорошую трассировку стека, чтобы я знал, в чем проблема. . Очень полезно.

Я понимаю, что такое поведение действительно полезно только из-за философской разницы в обработке исключений между двумя языками. Исключения Objective C предназначены только для обозначения неисправимых ошибок. Задача рутинной обработки ошибок выполняется с помощью кодов возврата ошибок. Это означает, что любое исключение Objective C является отличным кандидатом на точку останова для разработчика.

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

6
задан Matt Wilding 29 February 2012 в 21:15
поделиться