Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Общий по Linux (http://forum.oszone.net/forumdisplay.php?f=9)
-   -   Segmentation fault (http://forum.oszone.net/showthread.php?t=13974)

naka 21-11-2002 15:49 74848

Доброго всем дня!

Интересная ошибка, не пойму как она возникает. А собственно происходить следующее. Машина стоит под Debian woody, на ней крутяться apache, ldap, mysql,pgsql,dns. После трех четырех дней работы, если например, стартую ftp localhost, в ответ выдает сабж. отдельно службы перестартовать не пробовал, делел всегда полную перезагрузку, после чего все становилось нормально. Будуть у Вас какие мнения по поводу вышеописанного.

С уважением,
Р.

Retrospect 09-08-2003 22:18 74849

Ужас!! у меня этот Segmentation Fault везде и повсюду.
В Mandrake при работе возникает с любыми прогами.
Ну а Debian я так и не смог нормально установить.
После dselect начинаеться распаковка пакетов, и бац! dpkg received Segmentation Fault.
От чего зависит это ошибка? Подскажите это имеет что либо общего с конфигурацией ПК?

glassMonk 10-08-2003 02:16 74850

Интересно? А где вы его досталь, скачали?

Zur0 10-08-2003 04:35 74851

Segmentation fault возникает тогда, когда прога выходит за пределы памяти, которые ей предоставила ОС. От конфигурации это не зависит, а зависит от программы (точнее ошибок в ней).
Код:

int main(int argc, char *argv[]) {
  char buffer[4];
  strcpy(&buffer[0], argv[0]);
}

Если комптльнуть и запустить с параметром больше 4 букв то вылетит Segmentation fault

glassMonk 10-08-2003 20:56 74852

Zur0
Раз ты залез немного в программирование, так вот что, у меня это не прокатывает я ввоже 7 символов молчит, а если ввести штук 12 то выдаст Segmentation fault.
Как это обьяснить?

Zur0 11-08-2003 12:07 74853

glassMonk
Попробовал и я. Действительно в seg fault падает, не после 4, а после 8 (то есть на 8 мом).

Дело в том, что при запуске некой проги (да и отдельной функции), она во-первых, сохраняет адрес возврата. Адрес она сохраняет в первых 4х байтах
стека выделенного под эту прогу. Уже за этим участком выделеяется место для остальных переменных (Все локальные переменные хранятся в стеке). Т.е. чтобы выйти за границы стека нужно записать строку длинной размер буффера + 4  байта.

Если в данный пример запустить с параметром  4 < x < 8, то просто мы гробим данные, которые пренадлежат адресному пространству функции. Скорее всего мы гробим argc,argv

ЗЫ Извини если, что то криво объясняю. Просто сам только недавно увлекся данной темой, и еще много чего не понимаю/понимаю не до конца...

[s]Исправлено: Zur0, 20:10 11-08-2003[/s]

glassMonk 11-08-2003 15:17 74854

Zur0
Ты попробуй создать массив на 100 елементов и увидиш что переполнение происходит не тогда когда 104 а когда штук 130 и больше. Получается чем больше масив тем больше ты можеш писать в него до вывода этой ошибки. Вот это меня и удивляет.

ps. пигиг ты понятно насчет этого не беспокойся.

Zur0 11-08-2003 22:22 74855

glassMonk
Тогда Х.З. ... Может в "програмировании" этот вопрос задать?

glassMonk 12-08-2003 13:35 74856

Да понимаю, я через некоторое врямя, эту инфу узнаю точно. Сейчас не очень нужно.
Но спрошу.
Слух я топик тогда перемещу в программирование ты разрешаеш?

naka
Ждем два дня после чего понимаю что НЕТ. И я спрашиваю.


Zur0 13-08-2003 07:58 74857

glassMonk
Кажись разобрался. ГЦЦ по умолчанию выравнивает память по 2 двойным словам (вроде как), отсюда и рост длинны строки с размером буфера, при не кратных 8 числах...

[s]Исправлено: Zur0, 17:41 13-08-2003[/s]

Borislav 15-08-2003 22:50 74858

А у меня при запуке игрушки с ЮниксВарь.ру кидает это.  Я до этого мою проблему тут описал http://forum.oszone.net/topic.cgi?forum=8&topic=481 более детально. просто чтобы не копировать зря инфу ссылку дал.


Время: 18:20.

Время: 18:20.
© OSzone.net 2001-