Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Размер стека программы?


Автор: GSasha 20.1.2009, 18:22
Добрый день. 
Возможно ли, если да то каким способом, узнать размер стека программы?
Спасибо.

Автор: pan2004 20.1.2009, 18:24
хех... Получить значение регистра процессора - базы или вершины стека. Так как он растет сверху вниз, то данные числа и дадут "размер".
Но все это платформозависимо

Автор: GSasha 20.1.2009, 18:32
Примерно понял, но можно пример или типа этого... 
Как такое на практике сообразить.
thx

Автор: GoldFinch 20.1.2009, 19:06
какая ОС? максимальный размер? минимальный размер? текущий размер у запущенной программы?

Автор: GSasha 20.1.2009, 19:13
Цитата(GoldFinch @ 20.1.2009,  19:06)
какая ОС? максимальный размер? минимальный размер? текущий размер у запущенной программы?

OS WindowsXP.
Это один из тестовых вопросов, который дословно звучит: Как определить размер стека программы?
Я думаю, что имеется ввиду текущий размер у запущенной программы.

Автор: MAKCim 20.1.2009, 19:15
Цитата(GSasha @  20.1.2009,  18:32 Найти цитируемый пост)
Примерно понял, но можно пример или типа этого... 

вот пример для Linux x86-64 (если стек не рандомизируется)
Код

unsigned long rsp;
asm("movq %%rsp, %0" : "=r" (rsp));
rsp = ((1UL << 47) - rsp - 1) & ~(PAGE_SIZE - 1);

rsp - минимальная граница

Автор: GSasha 20.1.2009, 19:36
Цитата(MAKCim @  20.1.2009,  19:15 Найти цитируемый пост)
вот пример для Linux x86-64 (если стек не рандомизируется)

К сожалению без комментариев мне не разобраться  с этим примером, работаю под WinXP.
Мне всего лишь нужно ответить на вопрос из теста: Как определить размер стека программы?
И если честно, меня этот вопрос в замешательство привел.

Автор: GoldFinch 20.1.2009, 19:53
GSasha, программа состоит из потоков, у каждого потока размер стека может быть свой
у 1го потока при запуске программы размер стека такой который указан в заголовке программы
у остальных потоков размер либо такойже либо другой
в процессе работы программы размер и расположение стека может меняться, хз еще что считать стеком, в esp можно чтоугодно засунуть

Автор: GSasha 20.1.2009, 21:29
GoldFinch , спасибо Вам большое.
Я кое какими знаниями обладаю насчет организации процессов и потоков в Windows-системах, и про стеки потоков мне также известно. 
Но вот данный вопрос мне не дает покоя, точнее - нет ответа на него.
Как бы Вы ответили на него... Вопрос я выше процитировал.

Автор: GoldFinch 20.1.2009, 21:38
ну допустим я бы ответил что размер стека надо прочитать из TEB

Автор: GSasha 20.1.2009, 22:43
Так-так, это что-то интересное.
К TEB я еще не добирался, полезное направление для расширении кругозора.
Пока что понятие не имею про ТЕВ, но послушаю ваш совет, и постараюсь дорыться все-таки. 

Автор: GoldFinch 20.1.2009, 22:55
http://www.google.ru/search?q=размер+стека+TEB
1я ссылка

Автор: GSasha 21.1.2009, 00:08
Ок, разрулю полезного отпишусь. smile

Автор: mes 21.1.2009, 02:40
Цитата(GSasha @  20.1.2009,  18:36 Найти цитируемый пост)
Мне всего лишь нужно ответить на вопрос из теста: Как определить размер стека программы?

Что то мне подсказывает, что Вы вопрос неправильно процитировали ...
нельзя ли еще парочку вопросов из той же категории теста ?
 smile 

Автор: GSasha 21.1.2009, 16:07
mes, вопрос именно так и звучит: Как определить размер стека программы?
Остальные вопросы типа: Свойства статической переменной... Разница между процессом и потоком... и т д 

Автор: GSasha 22.1.2009, 19:52
Сможет ли данная функция правильно определить текущий размер стека? 
Код

DWORD GetCurrentStackSize()
{
    DWORD dwCount = 0;

    __try
    {
        __asm
        {
            mov eax, esp
        __probe:
            mov edx, dword ptr[eax]
            inc dwCount
            add eax, 4
            jmp __probe
        }
    }
    __except( EXCEPTION_EXECUTE_HANDLER )
    {
        printf( "EXCEPTION!\n" );
    }

    return dwCount * 4;
}

Автор: GoldFinch 23.1.2009, 00:46
а зачем так сложно? надо сразу страницы переребирать, а не по 4байта
и где гарантии что по адресу выше стека будет нечитаемая страница?
и проверять лучше не на чтение а на запись

Автор: georain 23.1.2009, 19:07
Может как-то так пойдет?
Код


static char * main_stack_address;

void some_function(){
    char function_stack_address;
    cout << "Размер стека от main до some_function: "
    << (main_stack_address - &function_stack_address)
    << " байт";
};

int main(){
    char in_stack;
    main_stack_address = &in_stack;

...
}

Автор: GSasha 23.1.2009, 19:26
Цитата(georain @  23.1.2009,  19:07 Найти цитируемый пост)
Может как-то так пойдет?

Может и пойдет, но до main размера стека нету. Неполный стек а только кусок его, если я не ошибаюсь...

Автор: Мурлыкатам_ 5.3.2009, 14:21
Размер стека = 1 МБ smile   smile 

http://msdn.microsoft.com/en-us/library/ms686774(VS.85).aspx

Автор: GoldFinch 5.3.2009, 14:31
некропостер =\

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)