Подтвердить что ты не робот

Segfault только когда НЕ используется отладчик

У меня многопоточная программа на C, которая последовательно генерирует ошибку сегментации в определенной точке программы. Когда я запускаю его с помощью gdb, никаких сбоев не отображается. Можете ли вы подумать о какой-либо причине, по которой может возникнуть ошибка, только если вы не используете отладчик? Это довольно раздражает, не имея возможности использовать его, чтобы найти проблему!

4b9b3361

Ответ 1

Классический Heisenbug. Материал из Википедии:

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

Отладчик может менять время и скрывать состояние гонки.

В Linux GDB также отключает рандомизацию адресного пространства, и ваша авария может быть специфичной для адресной компоновки пространства. Попробуйте (gdb) set disable-randomization off.

Наконец, ulimit -c unlimited и посмертная отладка (уже предложенная Робей) могут работать.

Ответ 2

Возможно, при использовании gdb память отображается в месте, где ваш поток over/under не топчет память, которая вызывает сбой. Или это может быть состояние гонки, которое больше не сработает. Хотя это звучит неинтуитивно, вы должны быть счастливы, что ваша программа была достаточно хороша, чтобы сбой на вас.

Некоторые предложения

  • Попробуйте статический анализатор кода, например, бесплатный cppcheck
  • Попробуйте отладчик malloc(), например libefence
  • Попробуйте запустить valgrind

Ответ 3

Отлаживая его, вы меняете среду, в которой он работает. Похоже, вы имеете дело с каким-то гоночным состоянием, и, отлаживая его, все запланировано несколько иначе, чтобы вы не столкнулись с проблемой. Это или вещи хранятся несколько иначе, так что это не происходит. Можете ли вы вывести в код некоторый отладочный вывод, чтобы помочь в решении проблемы? Это может иметь меньшее влияние и позволяет найти вашу проблему.

Ответ 4

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