Отслеживание невоспроизводимой ошибки в переполнении стека

Я разрабатываю приложение вычислительной геометрии на C ++. Это работает параллельно с использованием потоков и openmp. Итак, я получаю некоторые геометрические значения (такие как узлы, ребра и т. Д.) И выдаю вывод. Это работает почти всегда идеально. Тем не менее, есть случаи, как 1%, что я получаю этот испорченный результат. Приложение не падает, но я получаю очень плохие результаты, например, мой вывод имеет случайные значения памяти. Но даже если я использую одни и те же данные дважды, во второй раз все будет нормально. Я использовал valgrind и helgrind, но они не обнаружили связанных ошибок. Итак, у меня заканчиваются идеи, как это отследить. Есть ли какой-нибудь другой инструмент, который может обнаружить возможные ошибки потока лучше, чем helgrind? Или есть какие-либо идеи о том, как воспроизвести такую ​​проблему и как записать точное состояние, которое привело к этой ошибке?

-5

Решение

Отказ от ответственности: Я не использовал подход, описанный ниже, используя OpenMP, но на основании того, что я только что посмотрел, это представляется возможным.


У меня была похожая ошибка, которую мне нужно было воспроизвести в GDB. Эта почта помог мне запустить приложение на неопределенный срок, пока не произошла ошибка сегментации.

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

set pagination off
break exit
commands
run
end
break file.cpp:123 if some_condition_holds

Теперь, если вы запустите вышеописанное с помощью GDB, оно будет работать бесконечно, пока не произойдет плохой результат (some_condition_holds правда). Затем мы можем переключиться на правильный поток, используя подчиненные команды:

info inferiors
inferior inferior_num
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector