2017-02-23 42 views
0

Я выполняю многопоточную программу, а иногда получаю ошибку сегментации. Следовательно, чтобы эффективно отладить эту ошибку, я бы воспользовался функцией gdb.Ошибка при отладке, но ошибка при нормальном выполнении

Обычно я записывал весь свой объектный файл в файл сценария оболочки, как следует.

g++ ObjectFile.o ObjectFile2.o LogicFile.cpp -lpthread LogicExe

для отладки, я просто добавил -g расширение позади.

g++ ObjectFile.o ObjectFile2.o LogicFile.cpp -lpthread LogicExe -g

Далее, я хотел бы использовать эту команду gdb LogicExe, а затем run LogicExe.

Несмотря на то, что многократная работа не происходит, при отсутствии компиляции при отсутствии компиляции без функции gdb и -g.

Почему отладчик не обнаруживает ошибку сегментации, как обычное выполнение?

+3

Мой хрустальный шар говорит, что у вас, вероятно, есть условие гонки, и отладчик меняет время между потоками, что больше не вызывает проблем (как часто). Но это невозможно узнать, не видя кода. Пожалуйста, опубликуйте [SSCCE] (http://sscce.org) в своем вопросе. –

+0

Когда вы меняете сразу две вещи, иногда трудно сказать, что вызвало проблему. Можете ли вы попробовать это: не скомпилирована ли версия без '-g' или работает корректно при запуске с помощью gdb? –

+0

@MarkPlotnick, когда я компилирую без '-g', ошибка сегментации будет возникать время от времени, однако, когда я запускаю в формате' -g' и 'gdb', ошибка сегментации никогда не произойдет, несмотря на то, сколько раз я их запускаю. –

ответ

1

При запуске программы под управлением GDB, выполнение будет отличаться несколькими способами по сравнению с работой непосредственно из оболочки:

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

  • gdb установит LINES и COLUMNS в вашу среду программы, создав их, если их нет. Это изменит размер среды, поэтому база стека программы будет отличаться при запуске под gdb. Вы можете удалить эти переменные из среды, введя (gdb) unset environment COLUMNS и (gdb) unset environment LINES перед началом вашей программы.

  • gdb отслеживает динамические события библиотеки и создание потоков, кратковременно останавливая выполнение при их возникновении.

Смежные вопросы