Перейти к содержимому

Как узнать размер стека c

  • автор:

/F (Задать размер стека)

Без этого параметра размер стека по умолчанию по умолчанию — 1 МБ. Аргумент number может находиться в десятичной или C-языковой нотации. Аргумент может варьироваться от 1 до максимального размера стека, принятого компоновщиком. Компоновщик округляет указанное значение до ближайшего кратного 4 байта. Пространство между /F и number является необязательным.

Возможно, потребуется увеличить размер стека, если программа получает сообщения стека переполнения во время выполнения.

Вы также можете задать размер стека следующими способами:

  • /STACK Использование параметра компоновщика. Дополнительные сведения см. в разделе /STACK (Выделение стека).
  • Использование EDI ТБ IN в ФАЙЛЕ EXE. Дополнительные сведения см. в справочнике по EDI ТБ IN.

Установка данного параметра компилятора в среде разработки Visual Studio

  1. Откройте диалоговое окно Страницы свойств проекта. Подробнее см. в статье Настройка компилятора C++ и свойства сборки в Visual Studio.
  2. Перейдите на страницу свойств Свойства конфигурации>C/C++>Командная строка.
  3. Введите параметр компилятора в поле «Дополнительные параметры «.

Установка данного параметра компилятора программным способом

  • См. раздел AdditionalOptions.

Как узнать размер стека?

Можно ли из проги на С++ узнать размер стека? Просто нужно реализовать рекурсивные вычисления, и узнать насколько глубоко может зайти рекурсивная функция.

anonymous
04.11.03 20:12:44 MSK

Как узнать размер стека?

sS ★★★★★
( 04.11.03 20:48:08 MSK )

Re: Как узнать размер стека?

LONGOBARD ★
( 04.11.03 21:19:11 MSK )

Re: Как узнать размер стека?

Если более точно, то около min(getrlimit(RLIMIT_STACK)+getrlimit(RLIMIT_DATA), getrlimit(RLIMIT_AS)).

Реально чуть меньше, т.к. часть памяти уже занята.

Murr ★★
( 04.11.03 22:35:36 MSK )
Ответ на: Re: Как узнать размер стека? от Murr 04.11.03 22:35:36 MSK

Re: Re: Как узнать размер стека?

Правда, для нитевого стека это всё не годится.
В этом случае можно поковырять как-нибудь так:

register unsigned long esp asm(«esp»);
И далее ковырять /proc/self/maps на предмет размера карты.

Правда, это не переносимо 🙁

Может кто-нибудь получше что предложит в этом случае .

Murr ★★
( 04.11.03 23:10:26 MSK )
Ответ на: Re: Re: Как узнать размер стека? от Murr 04.11.03 23:10:26 MSK

Re: Re: Re: Как узнать размер стека?

Хотя вот для POSIX Threads есть pthread_attr_getstacksize/pthread_attr_setstacksize.

Murr ★★
( 04.11.03 23:41:01 MSK )
Ответ на: Re: Re: Re: Как узнать размер стека? от Murr 04.11.03 23:41:01 MSK

По-моему, эти pthread_attr_getstacksize/setstacksize возвращают не совсем то. Как узнать attr для треда?

Debugger ★
( 05.11.03 10:40:29 MSK )
Ответ на: Re: от Debugger 05.11.03 10:40:29 MSK

Для библиотеки GNU C: #include

Размер общей памяти, использованной текущим процессом под стек
находится в элементе long ru_isrss структуры rusage,
заполняемой ф-ей int getrusage(int who, struct rusage* res);
где who = RUSAGE_SELF

Мягкий/жесткий предел размера стека
находится в элементе rlim_t rlim_cur/rlim_max структуры rlimit,
заполняемой ф-ей int getrlimit(int what, struct rlimit* res);
где what = RLIMIT_STACK

Размер стека потока

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

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

Стек освобождается при выходе из потока. Он не освобождается, если поток завершается другим потоком.

Размер зарезервированной и первоначально зафиксированной памяти стека по умолчанию указывается в заголовке исполняемого файла. Создание потока или волокна завершается сбоем, если недостаточно памяти для резервирования или фиксации запрошенного количества байтов. Размер резервирования стека по умолчанию, используемый компоновщиком, составляет 1 МБ. Чтобы указать другой размер резервирования стека по умолчанию для всех потоков и волокон, используйте инструкцию STACKSIZE в файле определения модуля (DEF). Операционная система округляет указанный размер до ближайшего значения, кратного степени детализации распределения в системе (обычно 64 КБ). Чтобы получить степень детализации выделения текущей системы, используйте функцию GetSystemInfo .

Чтобы изменить изначально зафиксированное пространство стека, используйте параметр dwStackSize функции CreateThread, CreateRemoteThread или CreateFiber . Это значение округляется до ближайшей страницы. Как правило, резервный размер — это размер резерва по умолчанию, указанный в заголовке исполняемого файла. Однако если изначально зафиксированный размер, заданный dwStackSize , больше или равен размеру резерва по умолчанию, размер резерва — это новый размер фиксации, округленный до ближайшего, кратного 1 МБ.

Чтобы изменить размер зарезервированного стека, задайте параметру dwCreationFlagscreateThread или CreateRemoteThread значение STACK_SIZE_PARAM_IS_A_RESERVATION и используйте параметр dwStackSize . В этом случае изначально зафиксированный размер является размером по умолчанию, указанным в заголовке исполняемого файла. Для волокон используйте параметр dwStackReserveSizeэлемента CreateFiberEx. Зафиксированный размер указывается в параметре dwStackCommitSize .

Функция SetThreadStackGuarantee задает минимальный размер стека, связанного с вызывающим потоком или волокном, который будет доступен во время любых исключений переполнения стека.

Как узнать размер стека?

Buffer = «\x55» * (1040 — 124 — 95 — 4) = 841
NOPs = «\x90» * 124
Shellcode = «\xda\xca\xba\xe4\x11. \x5a\x22\xa2»
EIP = «\x66» * 4′

задача в том чтоб потом гдето посмотреть то что мне нужно.

я делал вот так: (gdb) x/2000xb $esp+550
и там вот так
0xffffd79a: 0x77 0xa4 0x3d 0xe8 0x7c 0x7b 0x3d 0x66
0xffffd7a2: 0x66 0x66 0x66 0x00 0x4c 0x53 0x5f 0x43

0ч66666666 эт окусок нагрузки

вот регистры
eax 0xffffd395 -11371
ecx 0xffffd1b0 -11856
edx 0xffffd1d4 -11820
ebx 0x56556fd4 1448439764
esp 0xffffd174 0xffffd174
ebp 0xffffd178 0xffffd178
esi 0xf7fc2000 -134471680
edi 0x0 0
eip 0x56555551 0x56555551

как узнать то мне нужно?

  • Вопрос задан более трёх лет назад
  • 1349 просмотров

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *