Re: Отключить обработку исключений для куска кода
От: Masterspline  
Дата: 24.08.17 14:48
Оценка:
Можно в своей функции создать ScopeGuard, который в деструкторе сделает abort(), а при успешном выходе из функции отключать Guard. Возможно, стек трейс останется.
Re[2]: Отключить обработку исключений для куска кода
От: rumit7  
Дата: 24.08.17 15:01
Оценка:
Здравствуйте, Masterspline, Вы писали:

M>Можно в своей функции создать ScopeGuard, который в деструкторе сделает abort(), а при успешном выходе из функции отключать Guard. Возможно, стек трейс останется.


можно через stack_unwinding
Re: Отключить обработку исключений для куска кода
От: Кодт Россия  
Дата: 24.08.17 15:03
Оценка:
Здравствуйте, Mazay, Вы писали:

M>Можно ли как-то обмануть рантайм и отключить перехватчик, устанавливаемый библиотекой?


Можно объявить твою функцию небросающей (throw()) — но это, фактически, просто добавит в неё код вида
void foo() throw() {
  try {
  .....
  } catch(...) { terminate(); }
}

То есть, стек размотается, все деструкторы вызовутся, а уже потом программа рухнет.

Другой вариант — собрать твою библиотеку (содержащую твою функцию) с ключом -f-noexceptions
Тогда весь STL будет не throw делать, а тупо abort().

Третий вариант — хакнуть загрузчик, подменить на лету __cxa_throw(). И сделать там внутри что угодно, приводящее к крешдампу.
Как это технически сделать
https://habrahabr.ru/post/199090/
https://codedump.io/share/whtWHR3CJ5Sa/1/disabling-c-exceptions-how-can-i-make-any-std-throw-immediately-terminate
Перекуём баги на фичи!
Re: Отключить обработку исключений для куска кода
От: Masterspline  
Дата: 24.08.17 15:19
Оценка:
IMHO, обсуждение было бы более конструктивным, если бы был представлен пример, где-нибудь на ideone, например или другом онлайн компиляторе, который позволяет выполнять код.
Re[2]: Отключить обработку исключений для куска кода
От: niXman Ниоткуда https://github.com/niXman
Дата: 24.08.17 15:52
Оценка:
Здравствуйте, Masterspline, Вы писали:

M>... который позволяет выполнять код.

+ собирать .so`шки и подсовывать их программе.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[7]: Отключить обработку исключений для куска кода
От: andrey.desman  
Дата: 24.08.17 16:03
Оценка:
Здравствуйте, Mazay, Вы писали:

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

M>Дааа! Именно то, что надо!

Это работает, только если каждое исключение фатальное. А если нет?
А если нет, то лучше в этой библиотеке залогировать бэктрэйс в __cxa_throw или через __gxx_personality_v0 (?).
Отредактировано 24.08.2017 16:04 andrey.desman . Предыдущая версия .
Re[3]: Отключить обработку исключений для куска кода
От: Masterspline  
Дата: 24.08.17 16:09
Оценка:
Здравствуйте, niXman, Вы писали:

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


M>>... который позволяет выполнять код.

X>+ собирать .so`шки и подсовывать их программе.

Скорее всего, вот здесь получится так сделать.
Re: Отключить обработку исключений для куска кода
От: swingus  
Дата: 24.08.17 21:40
Оценка: 2 (1)
Можно ещё форкнуть boost.python и убрать там заглушку.

Здравствуйте, Mazay, Вы писали:
Re: Отключить обработку исключений для куска кода
От: MasterZiv СССР  
Дата: 29.08.17 07:22
Оценка: -1
Здравствуйте, Mazay, Вы писали:

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

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

Всё, что тебе надо было сделать -- запустить отлдадчик, и сказать "Break on exceptions".
Всё, что надо было сделать авторам тех библиотек, что ты использовал, снабдить
все throw перед ними ASSERT-ами.
Re: Отключить обработку исключений для куска кода
От: Molchalnik  
Дата: 13.09.17 20:30
Оценка:
Здравствуйте, Mazay, Вы писали:

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

M>Есть библиотечный код, который эту функцию вызывает.
M>Библиотечный код заворачивает вызов моей функции в try/catch

перед инклюдом библиотеки сделай

#define try {}
#define catch(...) {} // только попробуйте уволить Mazay'я :)


отладка третьими лицами идёт накуй, но проблема решена дёшево и технично


А лучше — напрямую вставь в заголовочники библиотеки под ключ компиляции
#ifdef MY_DEBUG_MACRO_SUPER_PUPER_KEY
#  define try {}
#  define catch(...) {}
#endif


сам ключ передавай в параметрах командной строки. Тогда случайно эти строки не включатся.

Конечно, нужны исходники либы.

P.S. Отмаза. Естессно, это хакерское решение, костыль под краткосрочную задачу. В качестве постоянной или долговременной практики я такое категорически осуждаю
Отредактировано 13.09.2017 20:36 Molchalnik . Предыдущая версия .
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.