Есть моя функция, которая может бросать исключения.
Есть библиотечный код, который эту функцию вызывает.
Библиотечный код заворачивает вызов моей функции в try/catch и обрабатывает исключения неким своим образом, который мне не нравится.
Я хочу, чтобы программа просто падала при вылете исключений — хочу видеть дамп ядра. Но из-за библиотечного перехватчика стэк раскручивается и я не вижу откуда именно в моей функции вылетело исключение.
Можно ли как-то обмануть рантайм и отключить перехватчик, устанавливаемый библиотекой?
Можно хакерское решение, можно только для Линукса.
Здравствуйте, niXman, Вы писали:
X>в библиотечном коде сделать re-throw после библиотечного обработчика?
Это не поможет, потому что в библиотечном коде стэк от моей функции до обработчика уже раскручен.
X>вообще, это проблема библиотеки. плохо, брать на себя заботу о том, знаниями о чем не владеешь...
Да. Это Boost::Python. Решу проблему — напишу им гневное письмо.
Главное гармония ...
Re[3]: Отключить обработку исключений для куска кода
Здравствуйте, Mazay, Вы писали:
M>Это не поможет, потому что в библиотечном коде стэк от моей функции до обработчика уже раскручен.
да, стек уже потерян...
ставь бряк на __cxa_allocate_exception()/__cxa_throw()/__cxa_free_exception().
Здравствуйте, Mazay, Вы писали:
M>Есть моя функция, которая может бросать исключения. M>Есть библиотечный код, который эту функцию вызывает. M>Библиотечный код заворачивает вызов моей функции в try/catch и обрабатывает исключения неким своим образом, который мне не нравится. M>Я хочу, чтобы программа просто падала при вылете исключений — хочу видеть дамп ядра. Но из-за библиотечного перехватчика стэк раскручивается и я не вижу откуда именно в моей функции вылетело исключение. M>Можно ли как-то обмануть рантайм и отключить перехватчик, устанавливаемый библиотекой? M>Можно хакерское решение, можно только для Линукса.
вместо(е) кидания исключения в fork-у делать SIGABRT как сказано здесь не пойдет?
M>>Это не поможет, потому что в библиотечном коде стэк от моей функции до обработчика уже раскручен. X>да, стек уже потерян...
X>ставь бряк на __cxa_allocate_exception()/__cxa_throw()/__cxa_free_exception().
Так что бы бряк поставить надо в дебагере запускаться. Тогда проблем нет. А хочется иметь возможность анализировать крэш-дамп.
X>ну и почитай: https://habrahabr.ru/post/279111/
Спасибо
Главное гармония ...
Re[2]: Отключить обработку исключений для куска кода
Здравствуйте, Mazay, Вы писали:
M>Здравствуйте, rumit7, Вы писали:
R>>вместо(е) кидания исключения в fork-у делать SIGABRT как сказано здесь не пойдет?
M>Нет. Код кидания исключения тоже не мой — исключения летят из стандартной библиотеки.
самому врапнуть в try/catch потроха своей функции тоже не?
R>>>вместо(е) кидания исключения в fork-у делать SIGABRT как сказано здесь не пойдет?
M>>Нет. Код кидания исключения тоже не мой — исключения летят из стандартной библиотеки.
R>самому врапнуть в try/catch потроха своей функции тоже не?
В моём блоке catch тоже уже будет раскручен стэк.
Главное гармония ...
Re[2]: Отключить обработку исключений для куска кода
Здравствуйте, Mazay, Вы писали:
M>Здравствуйте, Vamp, Вы писали:
V>>Перехватить все исключения и сделать SIGABRT в перехватчике.
M>Если перехватывать исключения с помощью try-catch, то на момент перехвата стэк уже раскручен, информация о точке вызова первого throw потеряна.
Компилируй с -fno-exceptions
Да здравствует мыло душистое и веревка пушистая.
Re[5]: Отключить обработку исключений для куска кода
Здравствуйте, Mazay, Вы писали:
M>Здравствуйте, rumit7, Вы писали:
R>>>>вместо(е) кидания исключения в fork-у делать SIGABRT как сказано здесь не пойдет?
M>>>Нет. Код кидания исключения тоже не мой — исключения летят из стандартной библиотеки.
R>>самому врапнуть в try/catch потроха своей функции тоже не?
M>В моём блоке catch тоже уже будет раскручен стэк.
почему? вы же его перехватите до boost::Python-а
Re[5]: Отключить обработку исключений для куска кода
Здравствуйте, Mazay, Вы писали:
M>Так что бы бряк поставить надо в дебагере запускаться. Тогда проблем нет. А хочется иметь возможность анализировать крэш-дамп.
тогда так: создавай .so библиотеку экспортирующую __cxa_allocate_exception() функцию, и в этой функции зови std::abort(), или что душе угодно. подгружать при помощи: LD_PRELOAD=mydll.so ./myapp
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[4]: Отключить обработку исключений для куска кода
Здравствуйте, Vamp, Вы писали:
V>Здравствуйте, Mazay, Вы писали:
M>>Здравствуйте, Vamp, Вы писали:
V>>>Перехватить все исключения и сделать SIGABRT в перехватчике.
M>>Если перехватывать исключения с помощью try-catch, то на момент перехвата стэк уже раскручен, информация о точке вызова первого throw потеряна.
V>Компилируй с -fno-exceptions
Не собирается из-за Boost.Python. Почему-то игнорируется флаг BOOST_NO_EXCEPTIONS.
Здравствуйте, rumit7, Вы писали:
R>>>>>вместо(е) кидания исключения в fork-у делать SIGABRT как сказано здесь не пойдет?
M>>>>Нет. Код кидания исключения тоже не мой — исключения летят из стандартной библиотеки.
R>>>самому врапнуть в try/catch потроха своей функции тоже не?
M>>В моём блоке catch тоже уже будет раскручен стэк.
R>почему? вы же его перехватите до boost::Python-а
Мне интересна именно та часть стэка, которая содержит вызовы потрохов моей функции — они уже будут раскручены.
Главное гармония ...
Re[2]: Отключить обработку исключений для куска кода
Здравствуйте, Masterspline, Вы писали:
M>А если объявить свою функцию noexcept?
Тогда стэк-трэйс в дампе только до функции noexcept показывается. Это хорошая мысль. Я даже пробовал делать матрёшку из функций с noexcept и с noexcept(false). Всё равно показывает стэк только до первого вызова — дальше просто адреса без имён.
Главное гармония ...
Re[6]: Отключить обработку исключений для куска кода
Здравствуйте, niXman, Вы писали:
X>Здравствуйте, Mazay, Вы писали:
M>>Так что бы бряк поставить надо в дебагере запускаться. Тогда проблем нет. А хочется иметь возможность анализировать крэш-дамп. X>тогда так: создавай .so библиотеку экспортирующую __cxa_allocate_exception() функцию, и в этой функции зови std::abort(), или что душе угодно. подгружать при помощи: LD_PRELOAD=mydll.so ./myapp
Здравствуйте, Mazay, Вы писали:
M>Ещё ссылка по теме — обсуждение схожей проблемы в трекере GCC: Impossible to find/debug unhandled exceptions in an std::thread. Там они после 4-х лет обсуждений таки решили отключить обработку исключений и позволить программе падать с дампом.
лучше поздно... =)
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)