2009-10-31 8 views
0

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

+0

какая платформа это для? – steve

ответ

1

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

0

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

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

+0

спасибо за ваш ответ, он помог мне понять несколько других аспектов it.but, есть ли инструменты, доступные для обнаружения такого overflow.lets говорят, что мое приложение имеет три потока, выполняемых .so есть ли способ найти программно, какой поток вызвал переполнение стека? – pushkarpriyadarshi

+0

Вы можете анализировать указатели стека ваших потоков - он должен быть самым близким к адресу исключения – Xeor

1

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

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

Все это не переносное, но возможно.

Смежные вопросы