在Linux下要保證程序崩潰時生成Coredump要注意這些問題:
一、要保證存放Coredump的目錄存在且進程對該目錄有寫權限。存放Coredump的目錄即進程的當前目錄,一般就是當初發出命令啟動該進程時所在的目錄。但如果是通過腳本啟動,則腳本可能會修改當前目錄,這時進程真正的當前目錄就會與當初執行腳本所在目錄不同。這時可以查看”/proc/<進程pid>/cwd“符號鏈接的目標來確定進程真正的當前目錄地址。通過系統服務啟動的進程也可通過這一方法查看。
二、若程序調用了seteuid()/setegid()改變了進程的有效用戶或組,則在默認情況下系統不會為這些進程生成Coredump。很多服務程序都會調用seteuid(),如MySQL,不論你用什麼用戶運行mysqld_safe啟動MySQL,mysqld進行的有效用戶始終是msyql用戶。如果你當初是以用戶A運行了某個程序,但在ps裡看到的這個程序的用戶卻是B的話,那麼這些進程就是調用了seteuid了。為了能夠讓這些進程生成Coredump,需要將/proc/sys/fs/suid_dumpable文件的內容改為1(一般默認是0)。
三、這個一般都知道,就是要設置足夠大的Core文件大小限制了。程序崩潰時生成的Core文件大小即為程序運行時占用的內存大小。但程序崩潰時的行為不可按平常時的行為來估計,比如緩沖區溢出等錯誤可能導致堆棧被破壞,因此經常會出現某個變量的值被修改成亂七八糟的,然後程序用這個大小去申請內存就可能導致程序比平常時多占用很多內存。因此無論程序正常運行時占用的內存多麼少,要保證生成Core文件還是將大小限制設為unlimited為好。