Здравствуйте, so5team, Вы писали:
S>Возможно, вы пользуетесь какой-то сторонней либой, которая берет на себя выдачу подобных стек-трейсов. Если это так, то вопросы нужно задавать по этой либе.
Я в первом же сообщении написал что использую llvm и при старте программы ставлю на обработчик сигналов выдачу трассы (там сразу готовая функция есть на это)
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Здравствуйте, T4r4sB, Вы писали:
TB>Я в первом же сообщении написал что использую llvm и при старте программы ставлю на обработчик сигналов выдачу трассы (там сразу готовая функция есть на это)
Сорри, я не понял, что под "фреймворком" подразумевался LLVM. Виноват, был невнимателен.
Может быть можно сравнить что изменилось в новых реализациях stdlib и LLVM по сравнению со старыми? Т.е. если std::async сейчас ведет себя по новому, то можно глянуть как он вел себя раньше. А уже исходя из этой разницы искать решение.
Здравствуйте, so5team, Вы писали:
S>Может быть можно сравнить что изменилось в новых реализациях stdlib и LLVM по сравнению со старыми? Т.е. если std::async сейчас ведет себя по новому, то можно глянуть как он вел себя раньше. А уже исходя из этой разницы искать решение.
Вот откатываться на прошлые версии не хотелось бы: сборка занимает пол дня
Подозреваю что llvm::ThreadPool раньше использовал std::thread, а в новой версии std::async
Велосипедить свой тредпул — это насколько адекватно?
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Здравствуйте, T4r4sB, Вы писали:
TB>Вот откатываться на прошлые версии не хотелось бы: сборка занимает пол дня
Я не про откат говорил, а про то, чтобы сравнить и уже потом искать пути решения.
TB>Подозреваю что llvm::ThreadPool раньше использовал std::thread, а в новой версии std::async
Здравствуйте, T4r4sB, Вы писали:
TB>Как сделать чтоб "было как раньше"? Чтоб исключение в другом потоке сразу вызывало падение с правильной трассой.
Нашлось решение?
Ваша проблема с фреймворком звучит похоже на проблему, которую я недавно решал. Проблема была вызванна статической линковкой libstdc++ в динамической библиотеке и использованием std::future/std::async.
Здравствуйте, T4r4sB, Вы писали:
TB>Линкер не дает, говорит что __cxa_throw уже определена в libstd++.a(eh_throw.o)
Статическая линкова к с libstd++ может быть проблематичной.
Посмотрите как символы разрешаются в рантайме и смотрите что-то связанное с _Prepare_execution:
Например, вот этот код в libstdc++ плохо дружит со статитческой линковкой: во время выполнения код может переключачться между разными бинарями/контекстами, и использовать разные __once_callable, инициализация может произойти в одном, а использование — в другом. Вот эта лямда может появиться в разных бинарях. nm/objdum/readelf в помощь.
Вот простейший пример для воспроизведения проблемы:
Здравствуйте, Skorodum, Вы писали:
S>Здравствуйте, T4r4sB, Вы писали:
TB>>Как сделать чтоб "было как раньше"? Чтоб исключение в другом потоке сразу вызывало падение с правильной трассой. S>Нашлось решение? S>Ваша проблема с фреймворком звучит похоже на проблему, которую я недавно решал. Проблема была вызванна статической линковкой libstdc++ в динамической библиотеке и использованием std::future/std::async.
Да, навелосипедил новый тредпул, 50 строк кода
А причина была в том что обновившийся фреймворк использовать std::async а раньше использовал std::thread
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Здравствуйте, T4r4sB, Вы писали:
TB>Да, навелосипедил новый тредпул, 50 строк кода TB>А причина была в том что обновившийся фреймворк использовать std::async а раньше использовал std::thread
Понятно. Скорее всего эта проблема которую я более подробно описал в другом ответе
.
У нас тоже одним из возможных решений было переписать код с std::future на std::thread, т.к. оно проблему решало. Но это пока не поняли что там на самом деле происходит. Если вы линкуете libstdc++ статически в динамическую библиотеку, то подобные проблемы могут вылезти в другом месте. Нам разработчик GCC на днях прямо ответил так не делать.