![]() |
|
Модераторы: xvr |
![]()
|
|
| xni |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 27.10.2006 Где: Обнинск Репутация: нет Всего: нет |
Вот есть такая программка. Если устанавливать maxN небольшое, то все работает. Если 190 (так нужно по условию задачи) - компилирую (просто $g++ m.cpp), и получаю Segmentation Fault. Как я понимаю - программа из-за этого большого массива выходит за отведенное ей адресное пространство. Сейчас перешел на g++, и нигде не могу найти - как там изменить размер стека. Подсткажите, пожалуйста!
Заранее, огромное спасибо! |
|||
|
||||
| xni |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 27.10.2006 Где: Обнинск Репутация: нет Всего: нет |
Единственное, что нашел - изменение размера стека для всех запускаемых программ.
ulimit -s unlimited # убрать ограничения на стек ulimit -a # показать текущие ограничения Так я установил, что выделенных 8Мб недостаточно. Поставил 16. Запускается, работает, но мне кажется, что это не выход. |
|||
|
||||
| bilbobagginz |
|
|||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: 4 Всего: 317 |
не понимаю, какую связь ты видишь между проблемой доступа в не твой регион памяти (или скажем вне границ конечного массива), и размером стека ?!?!?!
это совершенно разные вещи. -------------------- Я ещё не демон. Я только учусь. |
|||
|
||||
| MAKCim |
|
||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
xni
в твоем случае никакого segmentation fault быть не может, поскольку ты нигде к массиву не обращаешься а само изменение %esp ни к чему плохому не приводит
почему? выделение памяти под массив в стеке происходит
стек - область памяти с read/write доступом, под него изначально отводится некоторое пространство адресов от X до Y (X > Y) при уменьшении %esp, значение %esp - виртуальный адрес, который может отображатся на: - валидную read/write область (скажем данных или стека если диапозон X - Y >= 0x1A2A3E0 (Вот оно!!)) - код (read only) - если текущее значение %esp < 0x1A2A3E0, произойдет переполнение и в %esp будет содержаться отрицательное число в дополнительном коде, НО процессор об этом ничего не знает, а т. к это число скорее всего будет >= __PAGE_OFFSET (0xC0000000), то возникнет #PF (как доступ к данным (коду) ring0 из ring3) Т. е тут прямая зависимость между диапозоном адресов, отводимых под стек (в общем случае под область данных) и "проблемой доступа в не твой регион памяти" Это сообщение отредактировал(а) MAKCim - 3.1.2007, 11:30 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||
|
|||||
| xni |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 27.10.2006 Где: Обнинск Репутация: нет Всего: нет |
Согласен, в приложенном сокращении программы ничего происходить не будет... Конечно же там дальше будет цикл, который будет проходиться по всем значениям... Извините, недосмотрел.
А вот насколько я понял - никакие опции компилятора (линкера) не помогут, если в системе программе дается под переменные не более 8Мб. Т.е. манипулировать надо именно с системными настройками. Или я ошибаюсь? Спасибо за помощь! |
|||
|
||||
| bilbobagginz |
|
|||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: 4 Всего: 317 |
в принципе - да.
просто пользователь хотеть всегда может...предполагает, а система определяет и располагает - она знает какое оборудование имеется в распоряжении, какая нагрузка и т.д. и т.п. обычно в никсах эти настройки стабильны на дистрибутив т.е. конвенция распространяется на дистру. Есть ведь всякие встроенные устройства, где настройки нужны особые. а с т.з. системника, есть 2 входных точки - ulimit оболочки или /etc/security/limits.conf пока. -------------------- Я ещё не демон. Я только учусь. |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 3 Всего: 162 |
xni, при твоих 190 - тебе требуется больше 27 Mб стека!
ИМХО просто выделяй память динамически. И все проблемы будут сняты. |
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: нет Всего: 20 |
JackYF,
У меня тоже был подобный вопрос в связи с работой на старой системе. Видимо в старых версиях Красной Шляпы стоит слишком заниженное значения для стека, что у меня были проблемы при использовании локальных переменных скалярных типов. Т.е в более упрощенном виде, может возникнуть ситуация, когда просто невозможно будет использовать указатель. |
|||
|
||||
| MAKCim |
|
||||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
это уже почти фантастика
или используй глобальные переменные
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||||
|
|||||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 3 Всего: 162 |
Это чья примочка? И зачем так сложно? |
|||
|
||||
| MAKCim |
|
||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
Extension GCC А сложно, чтобы подчеркнуть, что массив должен лежать в .bss Естественно можно атрибут не писать
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||
|
|||||
| xni |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 27.10.2006 Где: Обнинск Репутация: нет Всего: нет |
Все. Спасибо всем огромное! Кажется, работает! Мда. Начало программы оказалось не ахти каким приятным
Это сообщение отредактировал(а) xni - 4.1.2007, 22:51 |
|||
|
||||
![]()
|
| Правила форума "С/С++: Программирование под Unix/Linux" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |