2009-02-02 7 views
39

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

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

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

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

  1. bt/where на GDB не дают стека.
  2. Helpful suggestion
+0

можете ли вы разместить свои флагов компилятора? – cbrulak

+0

gcc -DDEBUG -I "" -O0 -g3 -Wall -c -fmessage-length = 0 -MMD -MP – Rohit

+0

(в следующий раз введите свой код в свой вопрос, пожалуйста). – cbrulak

ответ

54

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

$ gdb blah 
(gdb) run 
(gdb) where 

Edit для полноты:

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

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

+2

Что делать, если показывает «Нет стека»? – Rohit

+0

Некоторые сбои могут повредить стабильное содержимое, и тогда вам, вероятно, лучше всего вставить printf и проверить правильность ввода в разных кодовых точках. – che

+2

вы также можете попробовать мое предложение ниже - он использует процедуры раскрутки стека glibc, чтобы распечатать вас из stacktrace без необходимости прибегать к gdb. – tgamblin

4

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

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

+0

Brulak находится на месте, если вы не получаете стек в gdb, вам нужно исправить свои символы –

1

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

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

19

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

Happy хакерство :-)

+2

bt и где дает «Нет стека». Как это исправить? – Rohit

+5

вы запускаете его на моем компьютере ;-) [извините] –

9

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

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

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

+0

Ссылка не работает ... исправлено: http://stackoverflow.com/questions/77005/how-to-generate-a-stacktrace-when- мой-GCC-C-приложение-аварий –

3

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

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

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

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

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

  • Нет связанных вопросов^_^