Доступ к стеку, который выделен потоку - PullRequest
0 голосов
/ 31 октября 2009

Я хочу знать, возможно ли получить доступ к содержимому стека (выделенного потоку, который используется для хранения локальных переменных и т. Д.) Разумно. Это может помочь в моих усилиях по программному определению проблем переполнения стека. Заранее спасибо

Ответы [ 3 ]

1 голос
/ 31 октября 2009

В Unix вы можете установить альтернативный стек сигналов и использовать его для обнаружения переполнения стека (после бомбардировки). Когда ваш поток сталкивается с переполнением стека (при условии, что вы или операционная система помещают туда защитную страницу), вы можете посмотреть регистр стека в sigcontext_t, чтобы узнать, почему это так.

Если вы хотите программно предотвратить переполнение стека, выделите свой собственный стек потоков и затем периодически измеряйте значение указателя стека (вам придется иметь дело с непереносимыми проблемами, где находится база стека и как делать выборку указатель стека). Для однопоточной программы вы можете использовать основание стека в качестве выборки в main, по сравнению с ulimit стека процессов, чтобы увидеть, заходите ли вы слишком далеко.

Это все непереносимо, но возможно.

1 голос
/ 31 октября 2009

Не переносимо, нет. Однако, в зависимости от используемой вами платформы, вы можете установить размер стека для каждого потока. Например, если вы используете потоки POSIX, вы можете использовать pthread_attr_setstacksize для установки размера стека.

0 голосов
/ 31 октября 2009

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

Но обычно проблемы переполнения стека определяются операционной системой. Когда стек выделяется для потока или процесса, перед ним помещается специальный сегмент памяти с отключенным чтением и записью в этот сегмент. Когда у вас заканчивается стек, ваше приложение достигает этого сегмента, и доступ к нему вызовет системное исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...