测量Linux多线程应用程序的堆栈使用情况
时间:2020-03-05 18:52:06 来源:igfitidea点击:
我正在为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 }
回答
引用Tobi的答案:如果很难在线程初始化时设置变量,则可以随时使用pthread_attr_getstackaddr
获取堆栈的基础。然后,我们可以在自己的函数中获取自动变量的地址,以确定此时堆栈的深度。