關於線程堆棧大小的注意事項


    在單元測試時,發現了比較多的線程堆棧空間不夠導致 COREDUMP 的問題,這個問題的原因是由於線程獨立擁有一個可配置大小的堆棧,一個線程內所有函數使用到的堆棧都依賴於這個棧,如果太多的變量、參數需要使用棧,可能 導致棧溢出從而COREDUMP。目前基礎平臺子系統通過配置環境變量,將默認堆棧大小設置爲128K,可以減少這個問題的出現,但業務系統在編碼時仍然 需要注意棧的使用,避免出現問題。

    包括: 
    1、不要在函數內部定義過大的局部變量,如過大的結構體變量,聯合變量,過大的字符串,數組等;
    2、函數調用的深度也需要注意,如果函數 A 調用 B, B 再調用 C,而A/B/C每個函數定義了 10 K的局部變量,則總的棧空間需求將超過 30K;
    3、不要直接將大的結構變量通過函數參數傳遞,這樣也會消耗棧空間,可以通過指針或者引用的方式傳遞;
    4、在unit_test/callsvc 目錄下提供了一個 rs 程序,可以 misc16_pkg.h 和 particle_stru.h 中結構局部變量的大小,如果一個函數中使用了這裏邊的結構定義局部變量,可以通過 “rs [變量類型] ”計算總的棧內存需求。建議每個函數內部定義的變量大小控制在4-8K以下;
    5、如果在運行中 COREDUMP,並且通過 GDB 的 WHERE 命令時看到剛進入某個函數就報錯,連函數內的第一條調試語句都無法指向,則基本可以認爲是棧空間不夠導致的,可以嘗試將棧空間配置大一點,如果問題不再出現,則可以確定問題。這時需要按照前面幾點的要求修改代碼,減少棧的使用。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章