前兩天在幹活的時候,寫好的一個daemon程序,一跑就core,連main函數都進不去。歷來沒見過這陣勢的職場新人被嚇尿了,幸虧不是在生產環境上測試。找來同事幫忙,看了很久也沒看出問題,你們都認爲多是Makefile文件裏缺乏相應的庫文件形成了。一開始就跑偏了,折騰了一上午也沒能解決問題。數組
在老司機的建議下,我採用了最粗暴的方法來排查問題:創建新工程,一點點將原代碼移入新工程,定位問題所在。因而,複製、粘貼、保存、make clean;make、再運行。終於程序再次core了。看了一下子也沒能發現這段代碼有什麼問題,因而再次縮小範圍。最終定位到結果的時候,我連連說了幾句,我操!問題居然出在庫裏的某個頭文件定義的結構體裏。原來,是被前輩坑了。安全
打開頭文件,發現結構體中有這樣的一個成員 char buf[20*1024*1024],感受這個成員變量多是問題所在。因而,上網查找相頭資料。原來,Linux對於線程的棧大小是有限制的,默認爲8M,而這個數組大小爲20M。在程序裏,這個數組所在的結構體被我用做類的成員變量,而這個類又在main函數裏被實例化,因而這麼一個巨大的數組就被放在了棧裏。爲了保護操做系統,程序固然會core了。函數
找到了問題所在,那麼解決問題就很簡單了。三種方法:測試
在Linux操做系統中,ulimit -s能夠查看當前棧大小限制,也可能得到root權限後,修改棧大小限制。如操作系統
ulimit -s 102400線程
能夠將棧大小限制修改成100M,這樣就不會core了。但這樣有兩個問題,首先,不安全。Linux之因此對棧大小進行限制,就是爲了防止程序無限遞歸或者使用了過大的棧,是給操做系統加上了一層保護,修改得過大,可能會使系統容易崩潰。而後最重要的是,我並無root權限【那還說個屌】指針