Linux下棧溢出致使的core dump

本文有更新,請移步個人我的博客:https://blog.andyqiao.top/article/7/

 

1 問題產生

  前兩天在幹活的時候,寫好的一個daemon程序,一跑就core,連main函數都進不去。歷來沒見過這陣勢的職場新人被嚇尿了,幸虧不是在生產環境上測試。找來同事幫忙,看了很久也沒看出問題,你們都認爲多是Makefile文件裏缺乏相應的庫文件形成了。一開始就跑偏了,折騰了一上午也沒能解決問題。數組

2 問題解決

  在老司機的建議下,我採用了最粗暴的方法來排查問題:創建新工程,一點點將原代碼移入新工程,定位問題所在。因而,複製、粘貼、保存、make clean;make、再運行。終於程序再次core了。看了一下子也沒能發現這段代碼有什麼問題,因而再次縮小範圍。最終定位到結果的時候,我連連說了幾句,我操!問題居然出在庫裏的某個頭文件定義的結構體裏。原來,是被前輩坑了安全

  打開頭文件,發現結構體中有這樣的一個成員 char buf[20*1024*1024],感受這個成員變量多是問題所在。因而,上網查找相頭資料。原來,Linux對於線程的棧大小是有限制的,默認爲8M,而這個數組大小爲20M。在程序裏,這個數組所在的結構體被我用做類的成員變量,而這個類又在main函數裏被實例化,因而這麼一個巨大的數組就被放在了棧裏。爲了保護操做系統,程序固然會core了。函數

  找到了問題所在,那麼解決問題就很簡單了。三種方法:測試

  • 修改數組大小爲5M,即5*1024*1024
  • 結構體做爲類的成員變量時,手動分配內存,最好使用智能指針。這樣,這個大數組必定會被存儲在堆裏,就不會有棧大小的限制了
  • 修改Linux棧大小的限制

3 知識拓展

  在Linux操做系統中,ulimit -s能夠查看當前棧大小限制,也可能得到root權限後,修改棧大小限制。如操作系統

    ulimit -s 102400線程

  能夠將棧大小限制修改成100M,這樣就不會core了。但這樣有兩個問題,首先,不安全。Linux之因此對棧大小進行限制,就是爲了防止程序無限遞歸或者使用了過大的棧,是給操做系統加上了一層保護,修改得過大,可能會使系統容易崩潰。而後最重要的是,我並無root權限【那還說個屌】指針

相關文章
相關標籤/搜索