Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как установить размер стека в g++? размер стека в g++ 
V
    Опции темы
xni
Дата 2.1.2007, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 27.10.2006
Где: Обнинск

Репутация: нет
Всего: нет



Вот есть такая программка. Если устанавливать maxN небольшое, то все работает. Если 190 (так нужно по условию задачи) - компилирую (просто $g++ m.cpp), и получаю Segmentation Fault. Как я понимаю - программа из-за этого большого массива выходит за отведенное ей адресное пространство. Сейчас перешел на g++, и нигде не могу найти - как там изменить размер стека. Подсткажите, пожалуйста!

Код

#include <iostream>
#pragma comment(linker, "/STACK:16777216")

const int maxN=190;
const int delays[] = {0, 1, 3, 7, 15, 31, 63, 127};

int main()
{
        using namespace std;
        int A[maxN][maxN][maxN];
}


Заранее, огромное спасибо!

PM MAIL ICQ   Вверх
xni
Дата 2.1.2007, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 27.10.2006
Где: Обнинск

Репутация: нет
Всего: нет



Единственное, что нашел - изменение размера стека для всех запускаемых программ.

ulimit -s unlimited # убрать ограничения на стек
ulimit -a # показать текущие ограничения

Так я установил, что выделенных 8Мб недостаточно. Поставил 16. Запускается, работает, но мне кажется, что это не выход.
PM MAIL ICQ   Вверх
bilbobagginz
Дата 3.1.2007, 00:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 4
Всего: 317



не понимаю, какую связь ты видишь между проблемой доступа в не твой регион памяти (или скажем вне границ конечного массива), и размером стека ?!?!?!

это совершенно разные вещи.






--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
MAKCim
Дата 3.1.2007, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



xni
в твоем случае никакого segmentation fault быть не может, поскольку ты нигде к массиву не обращаешься а само изменение %esp ни к чему плохому не приводит  smile  
Цитата

не понимаю, какую связь ты видишь между проблемой доступа в не твой регион памяти (или скажем вне границ конечного массива), и размером стека ?!?!?!
это совершенно разные вещи.

почему?
выделение памяти под массив в стеке происходит
Код

...
movl    %esp, %ebp
subl    $0x1A2A3E0, %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


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
xni
Дата 3.1.2007, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 27.10.2006
Где: Обнинск

Репутация: нет
Всего: нет



Согласен, в приложенном сокращении программы ничего происходить не будет... Конечно же там дальше будет цикл, который будет проходиться по всем значениям... Извините, недосмотрел.

А вот насколько я понял - никакие опции компилятора (линкера) не помогут, если в системе программе дается под переменные не более 8Мб. Т.е. манипулировать надо именно с системными настройками. Или я ошибаюсь?

Спасибо за помощь!
PM MAIL ICQ   Вверх
bilbobagginz
Дата 3.1.2007, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 4
Всего: 317



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

а с т.з. системника, есть 2 входных точки - ulimit оболочки или /etc/security/limits.conf

пока.


--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
JackYF
Дата 3.1.2007, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 3
Всего: 162



xni, при твоих 190 - тебе требуется больше 27 Mб стека!
ИМХО просто выделяй память динамически. И все проблемы будут сняты.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
En_t_end
Дата 3.1.2007, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: нет
Всего: 20



JackYF
Цитата(JackYF @  3.1.2007,  18:18 Найти цитируемый пост)
ИМХО просто выделяй память динамически. И все проблемы будут сняты.

У меня тоже был подобный вопрос в связи с работой на старой системе. Видимо в старых версиях Красной Шляпы стоит слишком заниженное значения для стека, что у меня были проблемы при использовании локальных переменных скалярных типов. Т.е в более упрощенном виде, может возникнуть ситуация, когда просто невозможно будет использовать указатель.
PM MAIL ICQ Skype GTalk Jabber   Вверх
MAKCim
Дата 3.1.2007, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата

Т.е в более упрощенном виде, может возникнуть ситуация, когда просто невозможно будет использовать указатель. 

это уже почти фантастика  smile 
Цитата

ИМХО просто выделяй память динамически. И все проблемы будут сняты. 

или используй глобальные переменные
Код

static int array[190][190][190] __attribute__((__section__(".bss")));

...

int main() {
...
}



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
JackYF
Дата 4.1.2007, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 3
Всего: 162



Цитата(MAKCim @  3.1.2007,  19:07 Найти цитируемый пост)
__attribute__((__section__(".bss")));


Это чья примочка? И зачем так сложно?



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
MAKCim
Дата 4.1.2007, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата

Это чья примочка? И зачем так сложно?

Extension GCC
А сложно, чтобы подчеркнуть, что массив должен лежать в .bss
Естественно можно атрибут не писать
Код

static int array[190][190][190];



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
xni
Дата 4.1.2007, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 27.10.2006
Где: Обнинск

Репутация: нет
Всего: нет



Все. Спасибо всем огромное! Кажется, работает! Мда. Начало программы оказалось не ахти каким приятным  smile  Что же будет дальше? ;)

Это сообщение отредактировал(а) xni - 4.1.2007, 22:51
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0570 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.