Как проверить текущее состояние стека потоков

у меня, вероятно, переполнение стека в моем приложении (конечно, только в режиме выпуска...), и я хотел бы добавить к нему некоторый код защиты/исследования. Я ищу Windows API, чтобы сообщить мне текущее состояние стека потоков (т. е. общий размер и используемый размер). любой ?

спасибо Ноам


person Noam    schedule 07.07.2009    source источник


Ответы (1)


Общий размер стека будет равен размеру стека, который вы запросили при создании потока (или связали программу, если это основной поток).

Есть несколько предварительных ссылок на получение размера стека для пула потоков в Windows 7 в MSDN ( QueryThreadpoolStackInformation ).

В качестве приближения вы можете сравнить адрес локальной переменной с адресом другой локальной переменной дальше по стеку, чтобы получить меру количества us. Я считаю, что то, как программа, работающая в Windows, решает размещать свои локальные переменные в пространстве виртуальной памяти, которое Windows выделяет потоку, зависит от реализации среды выполнения этого языка, а не от чего-то, о чем Windows действительно знает; вместо этого вы получаете исключение, когда пытаетесь получить доступ к адресу чуть ниже памяти, выделенной для стека.

Другой альтернативой усложнению вашего кода проверкой того, достиг ли стек предела, является добавление обработчика исключений для EXCEPTION_STACK_OVERFLOW, который будет вызываться ОС, когда она проверяет, что стек достиг своего предела. Пример приведен здесь.

person Pete Kirkham    schedule 07.07.2009