Я разрабатываю многопоточное приложение для встроенной платформы Linux.
На данный момент я устанавливаю размер стека для каждого потока (через pthread_set_attr) на довольно большое значение по умолчанию. Я хотел бы точно настроить это значение для каждого потока на что-то меньшее, чтобы уменьшить использование памяти моим приложением. Я мог бы пройти путь проб и ошибок, устанавливая размер стека каждого потока на все меньшие значения, пока программа не выйдет из строя, но приложение использует ~ 15 потоков, каждый с совершенно разными функциями / атрибутами, поэтому такой подход будет чрезвычайно трудоемким.
Я бы предпочел иметь возможность напрямую измерять использование стека каждого потока. Могут ли какие-нибудь утилиты порекомендовать это сделать? (Например, я нахожусь в фоновом режиме vxWorks и использую команду 'ti' из оболочки vxWorks напрямую, выдает статистику использования стека, а также другую полезную информацию о статусе задачи.)
Спасибо
Я не знаю хороших инструментов, но в крайнем случае вы можете включить код в свое приложение, чтобы проверить его, как показано ниже:
__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
}
Ссылаясь на ответ Тоби: вы можете использовать pthread_attr_getstackaddr
для получения базы стека в любое время, если сложно установить переменную при инициализации потока. Затем вы можете получить адрес автоматической переменной в своей собственной функции, чтобы определить, насколько глубок стек в данный момент.
Вот два инструмента, которые измеряют использование стека (собственных потоков pthreads) в приложениях Linux:
Валгринд
Использование:
valgrind --tool=drd --show-stack-usage=yes PROG
Valgrind - стабильный и мощный инструмент, полезный не только для измерения использования стека. Однако он может поддерживать не все модели встроенных процессоров.
Stackusage
Использование:
stackusage PROG
Stackusage - это легкий инструмент, специально разработанный для измерения использования стека потоков, который должен быть портативным для большинства встраиваемых платформ Linux, оснащенных glibc. Вероятно, на данный момент он не так хорошо протестирован или зрел, как Valgrind / drd.
Полное раскрытие: я автор Stackusage.