linux中C程式運行時怪異的段錯誤–linux中因棧空間不足而出現的運行時段錯誤

來源:互聯網
上載者:User

今天在公司的項目中的一個函數中,進行啟動並執行時候,出現了一個怪異的段錯誤現象。

 

開始以為是哪個字串在進行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個位元組。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.