Автор Гілка: Segmentation Error в С  (Прочитано 4098 раз)

rules(Guest)

  • Гість
Segmentation Error в С
« : 2005-09-07 00:24:12 »
OC RH 9.0
Написав невеликий код на С.
виконав gcc proga.c
a rjkb dbrjye. ./a.out - отримую Segmentation Error.
Я гадаю потрібно компілювати з якимись особливими директвами, а от які не знаю.
Не підкажите???

dusoft

  • Гість
Re: Segmentation Error в С
« Відповідей #1 : 2005-09-07 04:06:41 »
Як можна задавати таке питання, не надавши код який ви власне намагаєтесь скомпілювати? Давайте вашу програму а потім подивимось.

Відсутній tech

  • Письменник
  • *****
  • дописів: 586
  • Карма: +1/-0
  • Гигик
Re: Segmentation Error в С
« Відповідей #2 : 2005-09-07 04:54:05 »
gcc -Wall code.c теж іноді допомагає

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3749
  • Карма: +9/-0
  • Програміст
Re: Segmentation Error в С
« Відповідей #3 : 2005-09-07 18:16:13 »
OC RH 9.0
Написав невеликий код на С.
виконав gcc proga.c
a rjkb dbrjye. ./a.out - отримую Segmentation Error.
Я гадаю потрібно компілювати з якимись особливими директвами, а от які не знаю.
Не підкажите???

додайте ключик -ggdb . Дозвольте корки і натравіть gdb на корку або запустіть програму під відлагоджувачем (рекомендую DDD).

Детальніше - у bash-і робите ulimit -c 1000000000 - це дозволяє робити корки програм, які зазбоїли, розміром до одного гігабайта.
У цьому ж bash-і (де ви дозволили корки) запускаєте програму - ./a.out , вона падає і створює корку - файл core у поточному каталозі.
Запускаєте gdb ./a.out ./core. У консолі gdb пишете bt (backtrace) і вона виводить стек викликів для кожного процесу на момент падіння. Дивитеся номер рядочка, в якому впала програма, і думаєте, чому вона так зробила. Можна також подивитися значення змінних але це значно зручніше робити у DDD, він тому і називається Data Display Debugger :-) .
« Змінено: 2005-09-07 18:17:32 від lvm »
[Fedora Linux]

Відсутній Rainbow

  • Новачок
  • *
  • дописів: 45
  • Карма: +0/-0
  • Що новенького?
Re: Segmentation Error в С
« Відповідей #4 : 2005-09-13 18:07:38 »
OC RH 9.0
Написав невеликий код на С.
виконав gcc proga.c
a rjkb dbrjye. ./a.out - отримую Segmentation Error.
Я гадаю потрібно компілювати з якимись особливими директвами, а от які не знаю.
Не підкажите???
Телепати у відспустці. Код показати можна?

Відсутній Сергій Лисовенко

  • Літератор
  • ******
  • дописів: 1489
  • Карма: +0/-0
Re: Segmentation Error в С
« Відповідей #5 : 2005-12-27 12:46:59 »
OC RH 9.0
Написав невеликий код на С.
виконав gcc proga.c
a rjkb dbrjye. ./a.out - отримую Segmentation Error.
Я гадаю потрібно компілювати з якимись особливими директвами, а от які не знаю.
Не підкажите???

Коли я писав свою першу програму на С мені теж при запуску програми написало : "Segmentation error core dumped" притчина була банальною: просто функції scanf() передав замість пойнтера саму величину, здаєтья, int от воно і викинуло такого коника.
Тому загальна порада може бути такою: якщо програма під час виконання злітає - проблеми з адресною арифметикою, треба перевірити чи всі пойнтери на своїх місцях, чи не вилазять за масиви, чи замість пойнтера не стоїть щось ліве 32 розрядне (той же int)...
Оскільки ми тут обговорюєм відкрите програме забезпечення - давайте код: обговорювати "чорну скриньку - невдячнасправа". Хоч в мене є така підозра, що коли ми побачимо код - половина форуму лусне зосміху ;D
Якщо Лінукс написали студенти - нехай вони під ним і навчаються.

Відсутній miwa

  • Літератор
  • ******
  • дописів: 1111
  • Карма: +0/-0
Re: Segmentation Error в С
« Відповідей #6 : 2005-12-27 13:26:49 »
<OFFTOP>
Хоч в мене є така підозра, що коли ми побачимо код - половина форуму лусне зосміху ;D
Не факт. Розумні люди здогадаються, що людина вчиться і або спробують допомогти, або ж проігнорують, не маючи часу чи необхідних знань.
</OFFTOP>
Читайте документацію - вона кермує.

Відсутній Yaroslav Fedevych

  • Літератор
  • ******
  • дописів: 1069
  • Карма: +0/-0
  • Людина — ніщо, справа — все
Re: Segmentation Error в С
« Відповідей #7 : 2005-12-27 14:44:30 »
А ще є strace.

Відсутній Сергій Лисовенко

  • Літератор
  • ******
  • дописів: 1489
  • Карма: +0/-0
Re: Segmentation Error в С
« Відповідей #8 : 2005-12-27 16:50:42 »
<OFFTOP>
Хоч в мене є така підозра, що коли ми побачимо код - половина форуму лусне зосміху ;D
Не факт. Розумні люди здогадаються, що людина вчиться і або спробують допомогти, або ж проігнорують, не маючи часу чи необхідних знань.
</OFFTOP>
Як це можна не мати необхідних знань з програмування на С?!!
Ми ж тут говорим про відкрите програмне забезпечення, а як можна про ньго говорити, не знаючи тієї ж С?

До речі, не варто радити одразу всілякі дебугери: поки навчишся ним користуватись - легше самому знайти помилку і виправити. Хоч останнім часом мені тільки й дебугер допомагав знаходити явні дурниці в коді (не прочитав допутя документацію на free() і застосовував її до пойнтера при не виділеному блоці пам'яті, звідки порада оголошуйте пойнтери зануленими напр int *p=0; тоді free() не так легко зробить помилку сегментації).
Якщо Лінукс написали студенти - нехай вони під ним і навчаються.

Відсутній miwa

  • Літератор
  • ******
  • дописів: 1111
  • Карма: +0/-0
Re: Segmentation Error в С
« Відповідей #9 : 2005-12-28 09:22:42 »
Як це можна не мати необхідних знань з програмування на С?!!
Ми ж тут говорим про відкрите програмне забезпечення, а як можна про ньго говорити, не знаючи тієї ж С?
Легко й невимушено. Я оно навіть у модератори вибився, хоча сам свої знання С оцінюю на 2 по 10-бальній шкалі. ВПЗ - це не тільки С. Це ще й Python/shell/perl/etc. Це знання англійської та мережевих протоколів, апаратного забезпечення й біс-його-зна-що-ще. І все одна людина знати не може. І те що хтось знає С, а хтось ні не дає першому права ані на мить зверхнього чи зневажливого ставлення до другого.
Читайте документацію - вона кермує.

Відсутній Євген Ященко

  • Кореспондент
  • ***
  • дописів: 131
  • Карма: +0/-0
  • SuSE9.3 user
Re: Segmentation Error в С
« Відповідей #10 : 2005-12-28 20:43:29 »
Нмв помилка сегментації виникає із-за того, що функція десь вилізла за межі виділеної їй пам'яті в стеку. А за нею що? Правильно, адреса повернення. А програма її затирає, і що має робити система, бачачи замість коректної адреси якийся мотлох? Викидає сегфолт. Цим і користуються хакери, які роблять експлойти. Мораль - завжди перевіряйте межі вказівників!
« Змінено: 2005-12-28 20:43:54 від john_yashchenko »
Лінукс - дружелюбна система, але розбірлива в друзях

Відсутній Сергій Лисовенко

  • Літератор
  • ******
  • дописів: 1489
  • Карма: +0/-0
Re: Segmentation Error в С
« Відповідей #11 : 2005-12-29 12:33:47 »
Нмв помилка сегментації виникає із-за того, що функція десь вилізла за межі виділеної їй пам'яті в стеку. А за нею що? Правильно, адреса повернення. А програма її затирає, і що має робити система, бачачи замість коректної адреси якийся мотлох? Викидає сегфолт. Цим і користуються хакери, які роблять експлойти. Мораль - завжди перевіряйте межі вказівників!
О!!!
Це вже цікавенько...
Можна звідси подетальніше?
Яким чином хакер може добратись до "core"?
Це що за дюра в лінуксі?
Цитата
Це ще й Python/shell/perl/etc. Це знання англійської та мережевих протоколів, апаратного забезпечення й біс-його-зна-що-ще.
А як можна примудритися зробити sell - скрипт закритим програмним забезпеченням? По моєму до цього навіть Гейтс не додумався  ;)
Цитата
І те що хтось знає С, а хтось ні не дає першому права ані на мить зверхнього чи зневажливого ставлення до другого.
Ніхто нікого в цьому форумі ні на мить не зневажає...
При реєстрації було сказано, що тут культурні люди зібрались...
 А дрібні зауваження аж ніяк не є ознакою зневаги.
Якщо Лінукс написали студенти - нехай вони під ним і навчаються.

Відсутній Yaroslav Fedevych

  • Літератор
  • ******
  • дописів: 1069
  • Карма: +0/-0
  • Людина — ніщо, справа — все
Re: Segmentation Error в С
« Відповідей #12 : 2005-12-29 21:54:35 »
Цитата
Як це можна не мати необхідних знань з програмування на С?!!
Ми ж тут говорим про відкрите програмне забезпечення, а як можна про ньго говорити, не знаючи тієї ж С?
Собі на сором кажу -- я C в силу специфіки роботи знаю так, що можу читати програми, але писати тільки по складах і з букварем. Набагато краще знаю PHP, Python. Однак... причому тут ВПЗ? Лікнеп: на чому була написана перша версія "найвільнішого" (в плані "благословення" автора) редактора текстів? На чому написана значна частина тепер двадцять другої його версії, й чим саме є та частина, що написана на C? На чому була написана перша версія Unix як такої?

Відсутній Євген Ященко

  • Кореспондент
  • ***
  • дописів: 131
  • Карма: +0/-0
  • SuSE9.3 user
Re: Segmentation Error в С
« Відповідей #13 : 2005-12-29 23:25:52 »
О!!!
Це вже цікавенько...
Можна звідси подетальніше?
Яким чином хакер може добратись до "core"?
Це що за дюра в лінуксі?
Це не така вже й дюра, та й не в лінуксі взагалі, а у деяких утилітах, та й та зараз майже усюди виправлена. Погугліть по слову exploit. Я їх ніколи не писав, але в силу специфіки роботи довелось ознайомитись. Якщо уявити стек
+-------------------------+------------+------------
|          сегмент 1           | Адр. пов. | сегмент 2
+-------------------------+------------+------------
то при викликанні сегфолту програма аварійно припиняється і система повертається у функцію за адресою повернення. Хакер пише програму, яка замінює цю адресу повернення на власну, яка веде до шкідливого коду, і навмисно викликає сегфолт в сегменті 1. Далі думаю зрозуміло, система передає керування шкідливій функції з рутівськими правами, яка передає хакеру доступ до машини і т. д.
Вибачте, якщо десь помилився чи випустив якісь деталі, але це наскільки я зрозумів проблему сегфолту.  :-/
« Змінено: 2005-12-29 23:29:51 від john_yashchenko »
Лінукс - дружелюбна система, але розбірлива в друзях