Как найти строку, вызвавшую ошибку сегментации в программе, скомпилированной на c ++ - PullRequest
0 голосов
/ 09 мая 2020

Я использую vim для программирования на C ++. Я привязал команду компиляции к ctrl+c в vim и запускаю ее на другой панели tmux, запустив ./main.out. Моя проблема в том, что когда моя программа на C ++ выдает мне ошибку segmentation fault, я не знаю, какая строка вызвала проблему. Но когда я скомпилировал и запустил программу в vscode, она показала мне строку, которая вызвала ошибку. Я ищу способ найти строки, которые вызывают ошибки времени выполнения, такие как ошибка segmentation fault, при запуске двоичного файла программы в консоли. Это пример вывода, когда я делаю ./main.out:

[1]    24656 segmentation fault (core dumped)  ./main.out

Ответы [ 2 ]

2 голосов
/ 09 мая 2020

При компиляции программы добавьте флаг компилятора -g или, что еще лучше, -ggdb3, что даст вам гораздо более красивый результат, добавив отладочные символы в исполняемый файл. Также убедитесь, что вы компилируете с уровнем оптимизации -O0.

Для фактической отладки программы запустите gdb ./main.out, чтобы запустить программу в сеансе отладки. Если затем вы запустите r, gdb начнет выполнение программы, а затем остановится на строке, которая дает segfault.

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

Конечно, вы можете сделать гораздо больше чем это (и вам, вероятно, понадобится, поскольку определение источника ошибки часто является только первым шагом). Вы можете использовать p для печати значений переменных, установки точек наблюдения и многого другого. Какое-то время gdb даже поставляется с полноценным интерпретатором python, так что вы даже можете написать сценарий python для собственных нужд отладки.

Изучение того, как использовать gdb, может показаться сложным вначале , но проявите настойчивость, и я гарантирую, что ваши усилия окупятся со временем :)

0 голосов
/ 09 мая 2020

То же самое с Adin. Также ваш код может взломать sh из-за вызова, в котором параметры допустимы, но вызывают пресловутую ошибку защиты вне допустимого диапазона из какой-либо библиотеки, если у вас нет этих отладочных версий. Если там используется процедура сборки, они могут делать некоторые странные вещи. Так что не бойтесь добавлять временный код, чтобы помочь, например, найти один вызов, который дает сбой, когда 1 000 000 других вызовов к тому же не работают. Вот почему мне нравится использовать много сгенерированных случайных чисел, если это возможно, чтобы проверить, когда вы их исправите.

...