加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

测量Linux多线程应用程序的堆栈使用情况

发布时间:2020-12-14 00:32:49 所属栏目:Linux 来源:网络整理
导读:我正在为 Linux嵌入式平台开发一个多线程应用程序. 目前我正在将每个线程的堆栈大小(通过pthread_set_attr)设置为相当大的默认值.我想将每个线程的值调整为更小的值以减少应用程序的内存使用量.我可以通过试验和错误路径将每个线程的堆栈大小设置为逐渐变小
我正在为 Linux嵌入式平台开发一个多线程应用程序.

目前我正在将每个线程的堆栈大小(通过pthread_set_attr)设置为相当大的默认值.我想将每个线程的值调整为更小的值以减少应用程序的内存使用量.我可以通过试验和错误路径将每个线程的堆栈大小设置为逐渐变小的值,直到程序崩溃,但应用程序使用~15个线程,每个线程具有完全不同的功能/属性,因此这种方法非常耗时.

我更愿意能够直接测量每个线程的堆栈使用情况.是否有人可以推荐这样做的实用程序? (例如,我来自vxWorks背景,并使用vxWorks shell中的’ti’命令直接提供有关堆栈使用情况的统计信息以及有关任务状态的其他有用信息.)

谢谢

解决方法

我不知道任何好的工具,但作为最后的手段,您可以在应用程序中包含一些代码来检查它,类似于以下内容:

__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
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读