| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Программирование под Unix/Linux > Как установить размер стека в g++? |
| Автор: xni 2.1.2007, 23:09 | ||
Вот есть такая программка. Если устанавливать maxN небольшое, то все работает. Если 190 (так нужно по условию задачи) - компилирую (просто $g++ m.cpp), и получаю Segmentation Fault. Как я понимаю - программа из-за этого большого массива выходит за отведенное ей адресное пространство. Сейчас перешел на g++, и нигде не могу найти - как там изменить размер стека. Подсткажите, пожалуйста!
Заранее, огромное спасибо! |
| Автор: xni 2.1.2007, 23:31 |
| Единственное, что нашел - изменение размера стека для всех запускаемых программ. ulimit -s unlimited # убрать ограничения на стек ulimit -a # показать текущие ограничения Так я установил, что выделенных 8Мб недостаточно. Поставил 16. Запускается, работает, но мне кажется, что это не выход. |
| Автор: bilbobagginz 3.1.2007, 00:55 |
| не понимаю, какую связь ты видишь между проблемой доступа в не твой регион памяти (или скажем вне границ конечного массива), и размером стека ?!?!?! это совершенно разные вещи. |
| Автор: MAKCim 3.1.2007, 11:30 | ||||
| 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) Т. е тут прямая зависимость между диапозоном адресов, отводимых под стек (в общем случае под область данных) и "проблемой доступа в не твой регион памяти" |
| Автор: xni 3.1.2007, 13:11 |
| Согласен, в приложенном сокращении программы ничего происходить не будет... Конечно же там дальше будет цикл, который будет проходиться по всем значениям... Извините, недосмотрел. А вот насколько я понял - никакие опции компилятора (линкера) не помогут, если в системе программе дается под переменные не более 8Мб. Т.е. манипулировать надо именно с системными настройками. Или я ошибаюсь? Спасибо за помощь! |
| Автор: bilbobagginz 3.1.2007, 13:28 |
| в принципе - да. просто пользователь хотеть всегда может...предполагает, а система определяет и располагает - она знает какое оборудование имеется в распоряжении, какая нагрузка и т.д. и т.п. обычно в никсах эти настройки стабильны на дистрибутив т.е. конвенция распространяется на дистру. Есть ведь всякие встроенные устройства, где настройки нужны особые. а с т.з. системника, есть 2 входных точки - ulimit оболочки или /etc/security/limits.conf пока. |
| Автор: JackYF 3.1.2007, 14:18 |
| xni, при твоих 190 - тебе требуется больше 27 Mб стека! ИМХО просто выделяй память динамически. И все проблемы будут сняты. |
| Автор: MAKCim 3.1.2007, 19:07 | ||||||
это уже почти фантастика
или используй глобальные переменные
|
| Автор: JackYF 4.1.2007, 15:50 |
Это чья примочка? И зачем так сложно? |
| Автор: MAKCim 4.1.2007, 19:11 | ||||
http://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Attribute-Syntax.html#Attribute-Syntax А сложно, чтобы подчеркнуть, что массив должен лежать в .bss Естественно можно атрибут не писать
|
| Автор: xni 4.1.2007, 22:51 |
| Все. Спасибо всем огромное! Кажется, работает! Мда. Начало программы оказалось не ахти каким приятным |