Подтвердить что ты не робот

Номер строки ошибки сегментации

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

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

  • Отладка по строке
  • Поместите printfs в код для сужения.

Изменения:

4b9b3361

Ответ 1

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

$ gdb blah
(gdb) run
(gdb) where

Изменить полноту:

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

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

Ответ 2

Здесь полный сеанс оболочки /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...

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

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

Ответ 8

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

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