segfault, только когда НЕ используется отладчик - PullRequest
51 голосов
/ 07 января 2011

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

Ответы [ 4 ]

72 голосов
/ 07 января 2011

Классик Гейзенбаг . Из Википедии:

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

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

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

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

6 голосов
/ 07 января 2011

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

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

  1. Попробуйте статический анализатор кода, такой какбесплатно cppcheck
  2. Попробуйте отладчик malloc (), например libefence
  3. Попробуйте запустить его через valgrind
4 голосов
/ 07 января 2011

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

1 голос
/ 07 января 2011

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

...