2008-09-12 55 views
3

我正在为Linux嵌入式平台开发多线程应用程序。测量Linux多线程应用程序的堆栈使用情况

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

我更愿意能够直接测量每个线程的堆栈使用情况。人们可以推荐一些实用程序来做到这一点吗? (例如,我来自一个VxWorks的背景,并使用ti的命令从VxWorks的外壳直接给出在堆叠使用情况统计信息,以及在任务状态其他有用的信息。)

由于

回答

3

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

__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

引用托比的回答是:你可以使用pthread_attr_getstackaddr随时获取堆栈的基础,如果在线程设置变量初始化很困难。然后,您可以在自己的函数中获取自动变量的地址,以确定此时堆栈的深度。

2

下面是测量两个工具(原生并行线程)的Linux应用程序栈的使用:

Valgrind的

用法:

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

Valgrind是一个稳定而强大的工具,不仅用于测量堆栈使用情况。它可能不支持所有嵌入式CPU模型。

Stackusage

用法:

stackusage PROG 

Stackusage是专门用于测量应该是便携式的用于配备有glibc的大多数嵌入式Linux平台线程堆栈使用而设计的轻质工具。在这一点上,它可能不像Valgrind/drd那样经过充分测试或成熟。

完全披露:我是Stackusage的作者。

相关问题