Отключить обработку исключений для куска кода
От: Mazay Россия  
Дата: 24.08.17 12:25
Оценка:
Есть моя функция, которая может бросать исключения.
Есть библиотечный код, который эту функцию вызывает.
Библиотечный код заворачивает вызов моей функции в try/catch и обрабатывает исключения неким своим образом, который мне не нравится.
Я хочу, чтобы программа просто падала при вылете исключений — хочу видеть дамп ядра. Но из-за библиотечного перехватчика стэк раскручивается и я не вижу откуда именно в моей функции вылетело исключение.
Можно ли как-то обмануть рантайм и отключить перехватчик, устанавливаемый библиотекой?
Можно хакерское решение, можно только для Линукса.
Главное гармония ...
Re: Отключить обработку исключений для куска кода
От: niXman Ниоткуда https://github.com/niXman
Дата: 24.08.17 12:34
Оценка:
в библиотечном коде сделать re-throw после библиотечного обработчика?

вообще, это проблема библиотеки. плохо, брать на себя заботу о том, знаниями о чем не владеешь...
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[2]: Отключить обработку исключений для куска кода
От: Mazay Россия  
Дата: 24.08.17 12:41
Оценка:
Здравствуйте, niXman, Вы писали:

X>в библиотечном коде сделать re-throw после библиотечного обработчика?


Это не поможет, потому что в библиотечном коде стэк от моей функции до обработчика уже раскручен.

X>вообще, это проблема библиотеки. плохо, брать на себя заботу о том, знаниями о чем не владеешь...

Да. Это Boost::Python. Решу проблему — напишу им гневное письмо.
Главное гармония ...
Re[3]: Отключить обработку исключений для куска кода
От: niXman Ниоткуда https://github.com/niXman
Дата: 24.08.17 12:48
Оценка: 5 (2) -1
Здравствуйте, Mazay, Вы писали:

M>Это не поможет, потому что в библиотечном коде стэк от моей функции до обработчика уже раскручен.

да, стек уже потерян...

ставь бряк на __cxa_allocate_exception()/__cxa_throw()/__cxa_free_exception().

ну и почитай: https://habrahabr.ru/post/279111/
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: Отключить обработку исключений для куска кода
От: rumit7  
Дата: 24.08.17 12:50
Оценка:
Здравствуйте, Mazay, Вы писали:

M>Есть моя функция, которая может бросать исключения.

M>Есть библиотечный код, который эту функцию вызывает.
M>Библиотечный код заворачивает вызов моей функции в try/catch и обрабатывает исключения неким своим образом, который мне не нравится.
M>Я хочу, чтобы программа просто падала при вылете исключений — хочу видеть дамп ядра. Но из-за библиотечного перехватчика стэк раскручивается и я не вижу откуда именно в моей функции вылетело исключение.
M>Можно ли как-то обмануть рантайм и отключить перехватчик, устанавливаемый библиотекой?
M>Можно хакерское решение, можно только для Линукса.


вместо(е) кидания исключения в fork-у делать SIGABRT как сказано здесь не пойдет?
Отредактировано 24.08.2017 12:51 rumit7 . Предыдущая версия .
Re[4]: Отключить обработку исключений для куска кода
От: Mazay Россия  
Дата: 24.08.17 13:04
Оценка:
Здравствуйте, niXman, Вы писали:


M>>Это не поможет, потому что в библиотечном коде стэк от моей функции до обработчика уже раскручен.

X>да, стек уже потерян...

X>ставь бряк на __cxa_allocate_exception()/__cxa_throw()/__cxa_free_exception().


Так что бы бряк поставить надо в дебагере запускаться. Тогда проблем нет. А хочется иметь возможность анализировать крэш-дамп.

X>ну и почитай: https://habrahabr.ru/post/279111/


Спасибо
Главное гармония ...
Re[2]: Отключить обработку исключений для куска кода
От: Mazay Россия  
Дата: 24.08.17 13:05
Оценка:
Здравствуйте, rumit7, Вы писали:


R>вместо(е) кидания исключения в fork-у делать SIGABRT как сказано здесь не пойдет?


Нет. Код кидания исключения тоже не мой — исключения летят из стандартной библиотеки.
Главное гармония ...
Re[3]: Отключить обработку исключений для куска кода
От: rumit7  
Дата: 24.08.17 13:06
Оценка:
Здравствуйте, Mazay, Вы писали:

M>Здравствуйте, rumit7, Вы писали:



R>>вместо(е) кидания исключения в fork-у делать SIGABRT как сказано здесь не пойдет?


M>Нет. Код кидания исключения тоже не мой — исключения летят из стандартной библиотеки.


самому врапнуть в try/catch потроха своей функции тоже не?
Re: Отключить обработку исключений для куска кода
От: Vamp Россия  
Дата: 24.08.17 13:11
Оценка:
Перехватить все исключения и сделать SIGABRT в перехватчике.
Да здравствует мыло душистое и веревка пушистая.
Re[4]: Отключить обработку исключений для куска кода
От: Mazay Россия  
Дата: 24.08.17 13:15
Оценка:
Здравствуйте, rumit7, Вы писали:


R>>>вместо(е) кидания исключения в fork-у делать SIGABRT как сказано здесь не пойдет?


M>>Нет. Код кидания исключения тоже не мой — исключения летят из стандартной библиотеки.


R>самому врапнуть в try/catch потроха своей функции тоже не?


В моём блоке catch тоже уже будет раскручен стэк.
Главное гармония ...
Re[2]: Отключить обработку исключений для куска кода
От: Mazay Россия  
Дата: 24.08.17 13:16
Оценка:
Здравствуйте, Vamp, Вы писали:

V>Перехватить все исключения и сделать SIGABRT в перехватчике.


Если перехватывать исключения с помощью try-catch, то на момент перехвата стэк уже раскручен, информация о точке вызова первого throw потеряна.
Главное гармония ...
Re[3]: Отключить обработку исключений для куска кода
От: Vamp Россия  
Дата: 24.08.17 13:26
Оценка:
Здравствуйте, Mazay, Вы писали:

M>Здравствуйте, Vamp, Вы писали:


V>>Перехватить все исключения и сделать SIGABRT в перехватчике.


M>Если перехватывать исключения с помощью try-catch, то на момент перехвата стэк уже раскручен, информация о точке вызова первого throw потеряна.


Компилируй с -fno-exceptions
Да здравствует мыло душистое и веревка пушистая.
Re[5]: Отключить обработку исключений для куска кода
От: rumit7  
Дата: 24.08.17 13:32
Оценка:
Здравствуйте, Mazay, Вы писали:

M>Здравствуйте, rumit7, Вы писали:



R>>>>вместо(е) кидания исключения в fork-у делать SIGABRT как сказано здесь не пойдет?


M>>>Нет. Код кидания исключения тоже не мой — исключения летят из стандартной библиотеки.


R>>самому врапнуть в try/catch потроха своей функции тоже не?


M>В моём блоке catch тоже уже будет раскручен стэк.


почему? вы же его перехватите до boost::Python-а
Re[5]: Отключить обработку исключений для куска кода
От: niXman Ниоткуда https://github.com/niXman
Дата: 24.08.17 13:39
Оценка: 13 (3)
Здравствуйте, Mazay, Вы писали:

M>Так что бы бряк поставить надо в дебагере запускаться. Тогда проблем нет. А хочется иметь возможность анализировать крэш-дамп.

тогда так: создавай .so библиотеку экспортирующую __cxa_allocate_exception() функцию, и в этой функции зови std::abort(), или что душе угодно. подгружать при помощи: LD_PRELOAD=mydll.so ./myapp
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[4]: Отключить обработку исключений для куска кода
От: Mazay Россия  
Дата: 24.08.17 13:40
Оценка:
Здравствуйте, Vamp, Вы писали:

V>Здравствуйте, Mazay, Вы писали:


M>>Здравствуйте, Vamp, Вы писали:


V>>>Перехватить все исключения и сделать SIGABRT в перехватчике.


M>>Если перехватывать исключения с помощью try-catch, то на момент перехвата стэк уже раскручен, информация о точке вызова первого throw потеряна.


V>Компилируй с -fno-exceptions


Не собирается из-за Boost.Python. Почему-то игнорируется флаг BOOST_NO_EXCEPTIONS.
Главное гармония ...
Re: Отключить обработку исключений для куска кода
От: Masterspline  
Дата: 24.08.17 13:40
Оценка:
А если объявить свою функцию noexcept?
Re[6]: Отключить обработку исключений для куска кода
От: Mazay Россия  
Дата: 24.08.17 13:41
Оценка:
Здравствуйте, rumit7, Вы писали:

R>>>>>вместо(е) кидания исключения в fork-у делать SIGABRT как сказано здесь не пойдет?


M>>>>Нет. Код кидания исключения тоже не мой — исключения летят из стандартной библиотеки.


R>>>самому врапнуть в try/catch потроха своей функции тоже не?


M>>В моём блоке catch тоже уже будет раскручен стэк.


R>почему? вы же его перехватите до boost::Python-а


Мне интересна именно та часть стэка, которая содержит вызовы потрохов моей функции — они уже будут раскручены.
Главное гармония ...
Re[2]: Отключить обработку исключений для куска кода
От: Mazay Россия  
Дата: 24.08.17 13:48
Оценка:
Здравствуйте, Masterspline, Вы писали:

M>А если объявить свою функцию noexcept?


Тогда стэк-трэйс в дампе только до функции noexcept показывается. Это хорошая мысль. Я даже пробовал делать матрёшку из функций с noexcept и с noexcept(false). Всё равно показывает стэк только до первого вызова — дальше просто адреса без имён.
Главное гармония ...
Re[6]: Отключить обработку исключений для куска кода
От: Mazay Россия  
Дата: 24.08.17 14:13
Оценка: 3 (1)
Здравствуйте, niXman, Вы писали:

X>Здравствуйте, Mazay, Вы писали:


M>>Так что бы бряк поставить надо в дебагере запускаться. Тогда проблем нет. А хочется иметь возможность анализировать крэш-дамп.

X>тогда так: создавай .so библиотеку экспортирующую __cxa_allocate_exception() функцию, и в этой функции зови std::abort(), или что душе угодно. подгружать при помощи: LD_PRELOAD=mydll.so ./myapp


Дааа! Именно то, что надо!
Для всех интересующихся:
What is the LD_PRELOAD trick?
How to wrap a system call (libc function) in Linux


Ещё ссылка по теме — обсуждение схожей проблемы в трекере GCC: Impossible to find/debug unhandled exceptions in an std::thread. Там они после 4-х лет обсуждений таки решили отключить обработку исключений и позволить программе падать с дампом.
Главное гармония ...
Re[7]: Отключить обработку исключений для куска кода
От: niXman Ниоткуда https://github.com/niXman
Дата: 24.08.17 14:22
Оценка:
Здравствуйте, Mazay, Вы писали:

M>Ещё ссылка по теме — обсуждение схожей проблемы в трекере GCC: Impossible to find/debug unhandled exceptions in an std::thread. Там они после 4-х лет обсуждений таки решили отключить обработку исключений и позволить программе падать с дампом.


лучше поздно... =)
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.