2008-09-12 59 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的作者。

相關問題