Номер строки ошибки сегментации - PullRequest
46 голосов
/ 03 февраля 2009

Можно ли установить какую-либо опцию gcc, которая даст мне номер строки ошибки сегментации?

Я знаю, что могу:

  1. Отладка построчно
  2. Поместите printfs в код, чтобы сузить.

редактирует:

  1. bt / where на GDB дают без стека.
  2. Полезное предложение

Ответы [ 8 ]

60 голосов
/ 03 февраля 2009

Я не знаю опции gcc, но вы должны иметь возможность запускать приложение с помощью gdb, а затем, когда оно падает, введите where, чтобы взглянуть на стек при его выходе, что должно приблизить вас .

$ gdb blah
(gdb) run
(gdb) where

Изменить для полноты:

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

Другой вариант - использовать команду bt (backtrace).

20 голосов
/ 03 февраля 2009

Вот полный сеанс shell / gdb

$ gcc -ggdb myproj.c
$ gdb a.out
gdb> run --some-option=foo --other-option=bar
(gdb will say your program hit a segfault)
gdb> bt
(gdb prints a stack trace)
gdb> q
[are you sure, your program is still running]? y
$ emacs myproj.c # heh, I know what the error is now...

Счастливого взлома: -)

10 голосов
/ 03 февраля 2009

Вы можете заставить gcc напечатать вам трассировку стека, когда ваша программа получит сигнал SEGV, аналогично тому, как Java и другие дружественные языки обрабатывают исключения нулевого указателя. Смотрите мой ответ здесь для более подробной информации:

Приятно то, что вы можете просто оставить это в своем коде; вам не нужно запускать вещи через gdb, чтобы получить хороший вывод отладки.

Если вы скомпилировали с помощью -g и следовали там инструкциям, вы можете использовать инструмент командной строки, такой как addr2line , чтобы получить информацию о файле / строке из выходных данных.

7 голосов
/ 04 октября 2010

Запустите его под Valgrind.

4 голосов
/ 03 февраля 2009

Если все предыдущие предложения по компиляции с отладкой (-g) и запускаться в отладчике (gdb, run, bt) у вас не работают, то:

  • Элементарно: Возможно, вы не работаете под отладчиком, вы просто пытаетесь проанализировать дамп ядра после смерти. (Если вы запускаете сеанс отладки, но не запускаете программу, или если она завершается, тогда, когда вы запрашиваете обратную трассировку, GDB скажет: «Нет стека» - потому что вообще нет запущенной программы. Не забывайте набрать «run».) Если это происходит с ошибкой, не забудьте добавить третий аргумент (core) при запуске gdb, иначе вы начнете в том же состоянии, не привязанном к какому-либо конкретному процессу или образу памяти.
  • Сложно: если ваша программа действительно работает, но ваш GDB говорит «Нет стека», возможно, ваш указатель стека сильно разбит. В этом случае у вас может возникнуть проблема переполнения буфера где-то, достаточно серьезная, чтобы полностью помешать состоянию выполнения. GCC 4.1 поддерживает ProPolice «Stack Smashing Protector», который активируется с -fstack-protector-all. Его можно добавить в GCC 3.x с помощью патча.
4 голосов
/ 03 февраля 2009

вам также нужно собрать с флагами отладки на -g

Вы также можете открыть дамп ядра с помощью gdb (вам нужно -g, хотя).

1 голос
/ 18 сентября 2015

Кажется, проблема No stack возникает, когда программа успешно завершается.

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

1 голос
/ 03 февраля 2009

У GCC нет способа предоставить эту информацию, вам придется полагаться на внешнюю программу, такую ​​как GDB.

GDB может дать вам строку, где произошел сбой, с помощью команды "bt" (сокращение от "backtrace") после сбоя программы. Это даст вам не только строку сбоя, но и весь стек программы (чтобы вы могли увидеть, что называется функцией, в которой произошел сбой).

...