境配置操作指南)
ubuntu coredump 環(huán)境配置操作指南1. 概述本文檔說(shuō)明如何配置 Linux coredump 環(huán)境用于捕獲程序崩潰時(shí)的核心轉(zhuǎn)儲(chǔ)文件便于使用 gdb 進(jìn)行問(wèn)題定位。coredump 是程序崩潰時(shí)的內(nèi)存快照包含崩潰時(shí)的寄存器狀態(tài)、堆棧信息等對(duì)于分析引擎崩潰問(wèn)題至關(guān)重要。2. 配置步驟2.1 基礎(chǔ)環(huán)境檢查# 檢查當(dāng)前coredump配置cat/proc/sys/kernel/core_patternulimit-c2.2 方法一systemd-coredump推薦2.2.1 安裝 systemd-coredumpsudoapt-getupdatesudoapt-getinstall-ysystemd-coredump2.2.2 配置文件systemd coredump 配置/etc/systemd/coredump.conf:[Coredump] Storageexternal MaxSize50G KeepFree10G ProcessSizeMax100G Compressyes2.2.3 內(nèi)核 core_pattern 配置# 臨時(shí)設(shè)置重啟失效sudosysctl-wkernel.core_pattern|/lib/systemd/system/systemd-coredump%i.service# 持久化配置echokernel.core_pattern|/lib/systemd/system/systemd-coredump%i.service|\sudotee/etc/sysctl.d/99-coredump.conf2.2.4 啟用服務(wù)# 啟用socketsocket-activated方式按需啟動(dòng)sudosystemctlenablesystemd-coredump.socketsudosystemctl start systemd-coredump.socket2.2.5 設(shè)置進(jìn)程資源限制# 臨時(shí)設(shè)置當(dāng)前會(huì)話ulimit-cunlimited# 持久化設(shè)置echo* soft core unlimited|sudotee/etc/security/limits.d/coredump.confecho* hard core unlimited|sudotee-a/etc/security/limits.d/coredump.conf2.3 方法二文件模式簡(jiǎn)單測(cè)試用文件模式更簡(jiǎn)單可靠適合快速驗(yàn)證和內(nèi)網(wǎng)服務(wù)器。# 設(shè)置core文件輸出到指定目錄sudosysctl-wkernel.core_pattern/tmp/core.%e.%p.%t# 創(chuàng)建目錄并設(shè)置權(quán)限sudomkdir-p/tmpsudochmod1777/tmp# 設(shè)置文件大小限制ulimit-cunlimited文件名格式說(shuō)明格式符說(shuō)明%e可執(zhí)行文件名%p進(jìn)程PID%t時(shí)間戳秒%u用戶UID%g用戶GID%h主機(jī)名3. Docker 容器內(nèi) coredump 配置引擎運(yùn)行在 Docker 容器內(nèi)時(shí)需要額外配置3.1 容器啟動(dòng)參數(shù)sudodockerrun-it--privileged\--ulimitcoreunlimited\--cap-addSYS_ADMIN\--cap-addPERFMON\--networkhost\...其他參數(shù)... easzlab.io.local:5000/lyserver-builder:2.3 /bin/bash關(guān)鍵參數(shù)說(shuō)明--ulimit coreunlimited: 允許容器生成任意大小的core文件--privileged: 獲取完整系統(tǒng)權(quán)限性能分析需要--cap-addSYS_ADMIN: 系統(tǒng)管理能力用于性能分析工具3.2 宿主機(jī)捕獲容器內(nèi)進(jìn)程崩潰時(shí)core文件會(huì)寫入宿主機(jī)被內(nèi)核的 core_pattern 捕獲。確保宿主機(jī)已完成上述配置。4. 驗(yàn)證配置4.1 編寫測(cè)試程序創(chuàng)建/tmp/test_crash.c:#includestdio.h#includestdlib.h#includeunistd.h#includestring.hvoidtrigger_null_pointer_crash(){int*ptrNULL;printf(About to dereference NULL pointer...\n);*ptr42;// SIGSEGV here}intmain(intargc,char*argv[]){printf( Coredump Test \n);printf(PID: %d\n,getpid());if(argc1strcmp(argv[1],null)0){trigger_null_pointer_crash();}return0;}4.2 編譯和測(cè)試# 編譯帶調(diào)試符號(hào)cd/tmp gcc-g-O0-otest_crash test_crash.c# 設(shè)置ulimitulimit-cunlimited# 觸發(fā)崩潰./test_crash null4.3 驗(yàn)證結(jié)果方法一systemd-coredump:# 查看所有coredump記錄coredumpctl list# 查看最新coredump詳情coredumpctl info# 使用gdb分析coredumpctl debugPID方法二文件模式:# 檢查core文件ls-la/tmp/core.*# 使用gdb分析gdb /tmp/test_crash /tmp/core.test_crash.12345.1234567890(gdb)bt5. 使用 gdb 分析 core 文件5.1 加載 core 文件# 方法1直接加載gdb /path/to/executable /path/to/corefile# 方法2在gdb內(nèi)加載gdb(gdb)file/path/to/executable(gdb)core-file /path/to/corefile5.2 常用調(diào)試命令命令簡(jiǎn)寫說(shuō)明backtracebt顯示調(diào)用堆棧backtrace fullbt full顯示完整堆棧包含局部變量frame Nf N切換到第N個(gè)棧幀info locals顯示當(dāng)前棧幀的局部變量info args顯示當(dāng)前函數(shù)參數(shù)print varp var打印變量值x/64x addr十六進(jìn)制查看內(nèi)存5.3 分析示例(gdb) bt #0 0x00005c8d1e9671f0 in trigger_null_pointer_crash () at test_crash.c:10 10 *ptr 42; // SIGSEGV here #1 0x00005c8d1e9673ee in main (argc2, argv0x7ffd2bc83f88) at test_crash.c:47崩潰定位結(jié)果崩潰發(fā)生在trigger_null_pointer_crash()函數(shù)文件test_crash.c第10行代碼為*ptr 42;空指針解引用由main()函數(shù)在第47行調(diào)用6. 加載調(diào)試符號(hào)如果 gdb 顯示[unknown]而非函數(shù)名需要加載調(diào)試符號(hào)# 在gdb內(nèi)設(shè)置符號(hào)路徑(gdb)symbol-file /path/to/library.with.debug# 或者加載可執(zhí)行文件和符號(hào)(gdb)file/path/to/executable(gdb)add-symbol-file /path/to/library.debug 0x...# 查看是否加載成功(gdb)info sharedlibrary7. 多線程程序分析如果是多線程程序崩潰# 查看所有線程(gdb)info threads# 切換到指定線程(gdb)thread N# 查看所有線程堆棧(gdb)thread apply all bt8. 常見(jiàn)問(wèn)題8.1 core_pattern 配置正確但無(wú) core 文件檢查資源限制ulimit-c# 如果顯示0需要設(shè)置為 unlimitedulimit-cunlimited8.2 core 文件過(guò)大被截?cái)嘣?etc/systemd/coredump.conf中增加限制MaxSize100G8.3 gdb 顯示 [unknown]需要加載對(duì)應(yīng)的調(diào)試符號(hào)文件.debug 或帶調(diào)試信息的庫(kù)文件。8.4 程序啟動(dòng)時(shí)設(shè)置了 setrlimit如果程序內(nèi)部調(diào)用setrlimit(RLIMIT_CORE, ...)禁用了core需要在代碼中移除或修改。9. coredumpctl 命令參考# 列出所有coredumpcoredumpctl list# 顯示coredump信息coredumpctl info[PID]# 調(diào)試coredumpcoredumpctl debug[PID]# 刪除coredumpcoredumpctl delete[PID]# 清空所有coredumpcoredumpctl purge# 后臺(tái)轉(zhuǎn)儲(chǔ)用于大文件coredumpctl dump PIDcore.file10. 快速參考# 一行命令驗(yàn)證配置文件模式ulimit-cunlimited(echoint main(){int*p0;*p1;}|gcc-xc --o/tmp/t/tmp/t)# 清理測(cè)試文件rm-f/tmp/test_crash /tmp/test_crash.c /tmp/core.*11. 安全注意事項(xiàng)權(quán)限控制: core文件可能包含敏感信息密碼、密鑰等確保目錄權(quán)限正確磁盤空間: 大型程序的core文件可能很大幾十GB確保有足夠空間自動(dòng)清理: 設(shè)置合理的MaxSize和KeepFree避免磁盤耗盡調(diào)試完成后刪除: 使用完core文件后及時(shí)清理