2013-08-16 2 views
3

Как определить текущий объем пространства стека, используемый текущим потоком в многопоточной программе на C++? Я использую POSIX pthreads.Определить использование стека для pixread?

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

Спасибо.

+0

Пространство для столов зарезервировано для каждой темы, а не только для использования. То есть Какую проблему ты пытаешься решить*? Вы пытаетесь остановить запуск кода из-за того, что он приближается к ограниченному хранилищу стека, который вы, без сомнения, задаете с помощью 'pthread_attr_setstack()'? – WhozCraig

+0

Я расширил вопрос. 'pthread_attr_setstack' устанавливает размер стека для создаваемых новых потоков. Я хочу знать текущее количество используемого пространства стека. – vy32

+0

Учитывая ограничения вашей проблемы, адрес локальной переменной области по сравнению с локальным в верхней части потока-proc, вероятно, будет достаточным. Даже не * закрыть * переносимым, но это может показать проблему. Является ли стек ударом из-за глубокой * рекурсии * (таким образом, рамки активации mondo) или действительно больших фиксированных массивов? Что касается портативных, однако, у меня нет таких знаний, что такой механизм существует даже, но его было немного, так как я был в pthreads-land. – WhozCraig

ответ

1

У меня есть многопоточная программа, в которой один из стеков взрывается, но я не могу понять, какой из них.

Дайте программе сбой и оставьте файл core. Загрузите это core в отладчик, и он скажет вам сразу, который разбился.

Поврежденный поток не обязательно тот, у которого переполнение.

Это правда, что существуют сценарии, в которых один поток переполняет свой стек, но из-за него падает другой поток.

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

Я ищу портативный подход, используя вызов pthreads или что-то подобное.

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

+0

Поврежденный поток не обязательно тот, у кого переполнение. – vy32

+0

@ vy32 Я обновил свой ответ. –

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