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

Тема в разделе "Delphi - Система", создана пользователем -, 16 окт 2004.

Статус темы:
Закрыта.
  1. Гость

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

    ???? Гость

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

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

    Вот ещё можешь посмотреть код из KB HOW TO: Trap Stack Overflow in a Visual C++ Application, PSS ID Number: 315937
    Код (Text):
    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;
    }
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей