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

Ошибка здесь: for (int s2 = 0; s2 < dgw.Columns.Count - 1; s2++) Удалить -1 или изменить < на <=

47
задан Community 23 May 2017 в 11:54
поделиться

6 ответов

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

$ gdb blah
(gdb) run
(gdb) where

Редактирование для полноты:

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

Другая опция состоит в том, чтобы использовать bt (след) команда.

64
ответ дан Drew Noakes 26 November 2019 в 19:27
поделиться

Вот полная 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...

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

21
ответ дан Jonas Kölker 26 November 2019 в 19:27
поделиться

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

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

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

10
ответ дан Community 26 November 2019 в 19:27
поделиться

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

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

4
ответ дан cbrulak 26 November 2019 в 19:27
поделиться

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

  • Элементарный: Возможно, Вы не работаете под отладчиком, Вы просто пытаетесь проанализировать посмертный дамп ядра. (Если Вы запустите сеанс отладки, но не запустите программу, или если она выйдет, затем когда Вы попросите след, gdb не скажет "Стека" - потому что нет никакой запускающей программы вообще. Не забывайте вводить "выполненный".), Если это segfaulted, не забывайте добавлять третий аргумент (core) при выполнении gdb иначе Вы запускаете в том же состоянии, не присоединенном к какому-то конкретному образу процесса или отображению памяти.
  • Трудный: Если Ваша программа действительно работает, но Ваш gdb не говорит "Стека", возможно, Ваш указатель вершины стека плохо разбит. В этом случае можно быть проблемой переполнения буфера где-нибудь, достаточно серьезный для приготовления пюре из состояния во время выполнения полностью. GCC 4.1 поддерживает ProPolice "Средство защиты Разрушения Стека", которое включено с -fstack-protector-all. Это может быть добавлено к GCC 3.x с патчем.
4
ответ дан Liudvikas Bukys 26 November 2019 в 19:27
поделиться

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

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

1
ответ дан SoapBox 26 November 2019 в 19:27
поделиться
Другие вопросы по тегам:

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