今天在公司的項目中的一個函數中,進行啟動並執行時候,出現了一個怪異的段錯誤現象。
開始以為是哪個字串在進行sprintf時類型不一致或是某個指標出現了問題,結果找了半天也沒有發現有這方面的問題,又使用gdb進行跟蹤,結果跟蹤到段錯誤的地方,使用bt命令列出當前函數棧列表,發現出錯的地兒是使用的另一個由別人開發的庫檔案中的一個函數,沒法,沒得原始碼,在此種情況下,只有二種解決方案:
(1)尋找原始碼,查看原始碼;
(2)一點一點的注釋掉接近段錯誤出現的函數周圍的代碼;
由於公司找代碼比較麻煩,且此庫的代碼並不是一時半會能看得完全懂,故最後採取了第二種方案。
使用第二種方法注釋後,還是存在這種問題,最後就試著把此函數中的一個800位元組的char型數組給改成了200個位元組(因為通過gdb調試看到只使用了190多位元組)的,再一編譯運行,居然就可以了,再改成400位元組大小的,就又有段錯誤的出現,故猜測應該是一個程式的棧空間的大小有限制,最後又嘗試了使用malloc在堆上進行800位元組空間的分配,編譯運行後也沒有問題,最後就認定為是由於棧空間已經不足而造成的。
以下是我寫的測試系統中的一個進程所支援的最大棧大小的程式:
/************************************
* author :Samson.wen
* create date:2011-02-14
* info :測試linux程式的棧的最大位元組值
* **********************************/
#include <stdio.h>
int testtack(int num)
{
int buff[num];
printf("num is %d/n", num);
return 0;
}
int main(int argc, char* argv[])
{
int buflen = 2 * 1024 * 1024;
for(; buflen < 8 * 1024 * 1024; buflen++)
testtack(buflen);
printf("hello, world");
return 0;
}
我本本運行結果如下:
.........省去N條列印
num is 3143036
num is 3143037
num is 3143038
num is 3143039
num is 3143040
段錯誤
當出現段錯誤前的時候所顯示的值就是當前進程所支援的最大棧大小,此處為3143040個int值,即為3143040 * 4個位元組。