一、要保證存放Core mp的目錄存在且進程對該目錄有寫許可權。存放Core mp的目錄即進程的當前目錄,一般就是當初發出命令啟動該進程時所在的目錄。但如果是通過腳本啟動,則腳本可能會修改當前目錄,這時進程真正的當前目錄就會與當初執行腳本所在目錄不同。這時可以查看"/proc/<進程pid>/cwd"符號鏈接的目標來確定進程真正的當前目錄地址。通過系統服務啟動的進程也可通過這一方法查看。
二、若程序調用了seteuid()/setegid()改變了進程的有效用戶或組,則在默認情況下系統不會為這些進程生成Core mp。很多服務程序都會調用seteuid(),如MySQL,不論你用什麼用戶運行mysqld_safe啟動MySQL,mysqld進行的有效用戶始終是msyql用戶。如果你當初是以用戶A運行了某個程序,但在ps里看到的這個程序的用戶卻是B的話,那麼這些進程就是調用了seteuid了。為了能夠讓這些進程生成Coremp,需要(echo "1" > /proc/sys/kernel/suid_mpable)。
三、這個一般都知道,就是要設置足夠大的Core文件大小限制了。程序崩潰時生成的Core文件大小即為程序運行時佔用的內存大小。但程序崩潰時的行為不可按平常時的行為來估計,比如緩沖區溢出等錯誤可能導致堆棧被破壞,因此經常會出現某個變數的值被修改成亂七八糟的,然後程序用這個大小去申請內存就可能導致程序比平常時多佔用很多內存。因此無論程序正常運行時佔用的內存多麼少,要保證生成Core文件還是將大小限制設為unlimited為好。
4
四、在/etc/profile中添加:ulimit -c unlimited > /dev/null 2?&1
五、一般在 CLI 上啟動的程序,如果設置:ulimit -c unlimited
就可以在程序以外終止時生成 core mp 文件。但是對於 daemon 方式運行的程序,其與 CLI 啟動的程序的主要區別是進程的運行環境,其中就包括
cwd(current working directory)。如果以相對路徑方式定義 core 文件的格式,比如定義 /proc/sys/kernel/core_pattern 為:
core-%e-%p-%t
則一般來說,daemon 文件的 cwd 就是/,你可以通過/proc/<your_program_pid>/cwd來查看,一般都是連接到/目錄。而如果用戶對這個目錄沒有寫許可權,那麼就不會生成 core mp 文件了。
最直接的解決的方法,是修改/proc/sys/kernel/core_pattern為絕對路徑:/data/coremp/core-%e-%p-%t
並且保證這樣就基本 OK 了。
修改/proc/sys/kernel/core_pattern文件中的 core mp 文件格式為絕對路徑,比如:
/data/coremp/core-%e-%p-%t
Ⅱ 如何調試崩潰mp文件
右擊「計算機」-「屬性」-「高級系統設置」-「高級」-「啟動和故障恢復」設置
2.提取藍屏文件"C:WINDOWSMinimp"mp文件及"C:WINDOWS"MEMERY.DUMP
3.下載安裝windbg
4.啟動"windbg"-點擊"File"-"OpenCrashDump"-選擇mp文件
5.找到"probablycausedby"字樣確定罪魁禍首
6.一些信息DEFAULT_BUCKET_ID:DRIVER_FAULT//指出錯誤類型,這里是驅動錯誤
BUGCHECK_STR:0xD1//bugcheck索引,可查windbg文檔,也可"!analyze?showD1"
PROCESS_NAME:NotMyfault.exe//錯誤所屬進程
附:windbg基本調試命令:
r可以顯示系統崩潰時的寄存器,和最後的命令狀態。
dd顯示當前內存地址,dd參數:顯示參數處的內存。
u可以顯示反匯編的指令
!analyze-...