ошибка сегментации после основных возвратов - PullRequest
3 голосов
/ 26 января 2011

У меня есть длинная программа на c поверх Linux, которая выдает ошибку сегментации после основных возвратов.Это длинная программа, поэтому я не могу опубликовать ее.Так можете ли вы помочь мне, что может сделать такую ​​ошибку?

Спасибо.

Вау, эти ответы пришли очень быстро.Спасибо вам всем.Я думаю, что я решил это, я забыл Malloc строку и использовал его в качестве буфера.Теперь, когда я его неправильно написал, он не сигнализирует мне об ошибке сегментации.

Еще раз спасибо всем.

Ответы [ 4 ]

3 голосов
/ 26 января 2011

Угадайте: возможно, вы случайно повредили стек в main, так что он потерял адрес возврата. Есть ли у вас там строковый буфер, который вы могли бы обойти?

Если нет, попробуйте:

  • запуск программы под valgrind
  • отладка программы с помощью gdb, чтобы поймать сбой и увидеть, где вы находитесь в данный момент; Вы также можете отладить файл дампа

Может быть полезно установить пакеты glibc-debug, если они есть в вашем дистрибутиве, поскольку в этот момент вы будете в коде glibc.

2 голосов
/ 26 января 2011

Используйте GDB и печатать трассировку стека по сигналу SIGSEGV.Затем, по крайней мере, напишите , что здесь, чтобы мы могли быть немного более полезными.

Если вы скомпилировали с:

$ gcc -g prog.c -o prog

Затем запустите его под GDB:

$ gdb ./prog
gdb> r

Когда вы получаете сигнал SIGSEGV (Ошибка сегментации), сделайте следующее:

gdb> bt

Затем посмотрите, что находится на трассировке стека, чтобы увидеть, что вызывает ошибку сегментации.

1 голос
/ 26 января 2011

Если это после возврата main(), то в соответствии со Стандартом все деструкторы были запущены (хотя я бы не стал отказываться от реализации, чтобы выдумать это), если только не была использована функция atexit(). Эта функция регистрирует функцию, которая будет вызываться после возврата main(), эффективно (если я правильно читаю 3.6.3). Вы можете проверить, есть ли в вашей программе atexit где-нибудь, хотя бы для полноты.

В зависимости от того, что вы подразумеваете под «после возвращения основной части», вы можете запускать деструкторы для статических объектов при сбое программы. Проверьте это. (Кроме того, опубликуйте то, что вы заметили, что заставило вас думать, что это произошло после того, как main() вернулся. Вы можете ошибаться там.)

Если нет, то вы вызывали неопределенное поведение где-то, очень вероятно, что каким-то образом повредили стек. См. Ответ Рупа для предложений там.

1 голос
/ 26 января 2011

Если ошибка сегментации возникает после возврата main (), это обычно означает, что глобальная определенная вещь пошла не так.Трудно помочь вам с таким небольшим количеством информации.Отправьте нам больше информации!

my2c

...