2008-09-12 4 views
3

Я разрабатываю многопоточное приложение для встроенной платформы Linux.Измерение использования стека для многопоточного приложения Linux

В настоящее время я устанавливаю размер стека для каждого потока (через pthread_set_attr) до довольно большого значения по умолчанию. Я хотел бы точно настроить это значение для каждого потока на меньшее, чтобы уменьшить использование памяти приложения. Я мог бы пройти через пробный и ошибочный маршрут установки размера стека каждого потока до более низких значений до тех пор, пока программа не потерпит крах, но приложение использует ~ 15 потоков каждый с совершенно разными функциональными возможностями/атрибутами, чтобы подход был чрезвычайно трудоемким.

Я предпочел бы иметь возможность напрямую измерять использование стека каждого потока. Есть ли какие-то полезные люди, которые могут порекомендовать это сделать? (К примеру, я родом из фона VxWorks и с помощью команды «Т.И.» из VxWorks оболочки непосредственно дает статистику по использованию стека, а также другую полезную информацию о состоянии задачи.)

Благодаря

ответ

3

I не знаю, есть хорошие инструменты, но в крайнем случае можно включить код в приложение, чтобы проверить его, похожее на следующее:

__thread void* stack_start; 
__thread long stack_max_size = 0L; 

void check_stack_size() { 
    // address of 'nowhere' approximates end of stack 
    char nowhere; 
    void* stack_end = (void*)&nowhere; 
    // may want to double check stack grows downward on your platform 
    long stack_size = (long)stack_start - (long)stack_end; 
    // update max_stack_size for this thread 
    if (stack_size > stack_max_size) 
    stack_max_size = stack_size; 
} 

check_stack_size() функция будет иметь называть в некоторых функций, наиболее глубоко вложены.

Тогда, как последний оператор в потоке, вы можете вывести stack_max_size куда-нибудь.

stack_start переменная будет иметь для инициализации при запуске вашего потока:

void thread_proc() { 
    char nowhere; 
    stack_start = (void*)&nowhere; 
    // do stuff including calls to check_stack_size() 
    // in deeply nested functions 
    // output stack_max_size here 
} 
2

REFERENCING ответ Тоби: Вы можете использовать pthread_attr_getstackaddr, чтобы получить основание стека в любое время, если установка переменной в потоке инициализация затруднена. Затем вы можете получить адрес автоматической переменной в своей собственной функции, чтобы определить, насколько глубок стек в этот момент.

2

Вот два инструмента, которые измеряют (родной Pthreads) использование стека в приложениях Linux:

Valgrind

Использование:

valgrind --tool=drd --show-stack-usage=yes PROG 

Valgrind - это стабильный и мощный инструмент, полезный не только для измерения использования стека. Однако он может не поддерживать все встроенные модели CPU.

Stackusage

Использование:

stackusage PROG 

Stackusage является инструментом легкого специально предназначен для измерения использования стека потока, который должен быть портативным для большинства встраиваемой Linux платформ, оснащенных Glibc. На данный момент это, скорее всего, не так хорошо проверено или зрело, как Valgrind/drd.

Полное раскрытие информации: Я являюсь автором Stackusage.

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

  • Нет связанных вопросов^_^