Здравствуйте, T4r4sB, Вы писали:
TB>Суть такова, до какого-то обновления (вот не помню, какую версию gcc я использовал) при возникновении исключения внутри потока, созданного через std::async, программа падала (я его нигде не перехватывал), причём срабатывал обработчик какого-то сигнала , который выводил трассу стека (при старте приложения вызывалась такая функция https://llvm.org/doxygen/namespacellvm_1_1sys.html#ab062fd190912d9ca714311df7cbe51d5).
TB>После обновления то ли компилятора, то ли фреймворка (сорян за сумбур, уже не могу откатиться и перепроверить) исключения в другом потоке стали молча глотаться. Причём я пробовал их перехватить и перебросить (например вызвать .get у фьючи, которую вернул std::async), но проблема в том, что при этом я теряю трассу: выводится позиция не того места, где на самом деле возникло исключение, а позиция того места, где я его перебросил.
TB>Как сделать чтоб "было как раньше"? Чтоб исключение в другом потоке сразу вызывало падение с правильной трассой.
тяжело установить все детали. Даже тяжело представить как стек мог сохраниться. В отдельном потоке исключение должен был перехватить обработчик от std::async и сохранить его (то есть на этом этапе мы должны были потерять всю информацию о стеке). При пробросе исключения в главном потоке вызывается terminate, но опять же информация о стеке должна была исчезнуть. Можно предположить, что компилятор провёл какую-то хитрую оптимизацию, понял что исключение в главном потоке всё равно никто ловить не будет и вызвал terminate в дочернем. И вот тогда всё идёт на откуп опять же компилятора:
If no matching handler is found, std::terminate is invoked; whether or not the stack is unwound before this invocation of std::terminate is implementation-defined.
Может оставить как есть, а может размотать стек и потереть таблицу переходов. Что частично может объяснить изменения поведения после обновления компилятора.
В любом случае закладываться на такие вещи себе дороже.