Измерение использования стека для многопоточного приложения Linux - PullRequest
4 голосов
/ 12 сентября 2008

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

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

Я бы предпочел иметь возможность напрямую измерять использование стека каждого потока. Есть ли какие-то утилиты, которые люди могут порекомендовать сделать это? (Например, я пришел из фона vxWorks, и использование команды 'ti' из оболочки vxWorks напрямую дает статистику использования стека, а также другую полезную информацию о состоянии задачи.)

Спасибо

Ответы [ 3 ]

3 голосов
/ 04 марта 2015

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

Valgrind

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

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

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

Stackusage

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

stackusage PROG

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

Полное раскрытие: я автор Stackusage.

3 голосов
/ 12 сентября 2008

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

__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 голосов
/ 12 сентября 2008

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

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