Определить строку кода, которая вызывает ошибку сегментации?

Как мы можем определить, где находится ошибка в нашем коде, которая вызывает ошибку сегментации ?

После написания некоторого кода, чтобы определить, где у меня ошибка сегментации, может ли мой компилятор ( gcc) показать мне место неисправности в моей программе?

135
задан Raedwald 18 December 2017 в 09:19
поделиться

4 ответа

GCC не может этого сделать, но GDB ( отладчик ) точно может. Скомпилируйте вашу программу, используя переключатель -g , например:

gcc program.c -g

Затем используйте gdb:

$ gdb ./a.out
(gdb) run
<segfault happens here>
(gdb) backtrace
<offending code is shown here>

Здесь - хороший учебник для начала работы с GDB.

188
ответ дан 23 November 2019 в 23:46
поделиться

Также вы можете попробовать Valgrind: если вы установите Valgrind и запустите valgrind --leak-check = full, тогда он запустит вашу программу и отобразит трассировки стека для любых ошибок сегментации, а также любых недопустимых операций чтения или записи в память и утечек памяти. Это действительно очень полезно.

37
ответ дан 23 November 2019 в 23:46
поделиться

Вы также можете использовать дамп ядра и затем исследовать его с помощью gdb. Чтобы получить полезную информацию, вам также нужно компилировать с флагом -g.

Каждый раз, когда вы получаете сообщение:

 Segmentation fault (core dumped)

файл ядра записывается в ваш текущий каталог. И вы можете просмотреть его с помощью команды

 gdb your_program core_file

Файл содержит состояние памяти на момент сбоя программы. Дамп ядра может быть полезен во время развертывания вашей программы.

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

ulimit -c unlimited

Осторожно, дампы ядра могут стать огромными.

17
ответ дан 23 November 2019 в 23:46
поделиться

Ответ Лукаса о дампах ядра хорош. В моем .cshrc у меня есть:

alias core 'ls -lt core; echo where | gdb -core=core -silent; echo "\n"'

для отображения обратной трассировки путем ввода «core». И отметка даты, чтобы убедиться, что я смотрю правильный файл :(.

Добавлено : Если есть ошибка повреждения стека , то обратная трассировка, примененная к дампу ядра, часто является мусором. . В этом случае выполнение программы в gdb может дать лучшие результаты в соответствии с принятым ответом (при условии, что ошибка легко воспроизводима). А также остерегайтесь одновременного сброса ядра несколькими процессами; некоторые ОС добавляют PID к имени основного файла.

2
ответ дан 23 November 2019 в 23:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: