Можно ли программно узнать доступный объем стека.

  • Автор темы Guest
  • Дата начала
Статус
Закрыто для дальнейших ответов.
G

Guest

#1
Как в Delphi программно узнать доступный объем стека и максимальный размер.
Нужно программно следить за стеком и в случае его заполнения до критического уровня или если есть функции принудительного освобождения стека, то освободить или же дать программе освободить стек и не делать никаких вызовов до его освобождения.
 
?

????

#2
инспектор
следить за стеком
вызов рекурсивных и "глубоких" функций заключай в обработчик исключений.

Можно указать размер стека и при создании потока функцией CreateThread в параметре dwStackSize. Для получения размера стека в режиме пользователя можно использовать функцию VirtualQuery.

Вот ещё можешь посмотреть код из KB HOW TO: Trap Stack Overflow in a Visual C++ Application, PSS ID Number: 315937
Код:
void StackOverflow(int depth)
{
 char blockdata[10000];
 printf("Overflow: %d\n", depth);
 StackOverflow(depth+1);
}

int main(int argc, char* argv[])
{
 for (;;)
 {
   __try
   {
     StackOverflow(0);
   }
   __except(EXCEPTION_EXECUTE_HANDLER)
   {
     LPBYTE lpPage;
     static SYSTEM_INFO si;
     static MEMORY_BASIC_INFORMATION mi;
     static DWORD dwOldProtect;

     // Get page size of system
     GetSystemInfo(&si);
     
     // Find SP address
     _asm mov lpPage, esp;

     // Get allocation base of stack
     VirtualQuery(lpPage, &mi, sizeof(mi));

     // Go to page beyond current page
     lpPage = (LPBYTE)(mi.BaseAddress)-si.dwPageSize;

     // Free portion of stack just abandoned
     if (!VirtualFree(mi.AllocationBase,
             (LPBYTE)lpPage - (LPBYTE)mi.AllocationBase,
              MEM_DECOMMIT))
 {
       // If we get here, exit
       exit(1);
     }

 // Reintroduce the guard page
 if (!VirtualProtect(lpPage, si.dwPageSize, 
               PAGE_GUARD | PAGE_READWRITE, 
               &dwOldProtect))
 {
       exit(1);
     }
 printf("Exception handler %lX\n", _exception_code()); 
     Sleep(2000);
   }
}
return 0;
}
 
Статус
Закрыто для дальнейших ответов.