core dump 崩溃分析
- linux core dump
- 分析無調試符號 core dump 文件
linux core dump
一般稱為核心轉儲、內核轉儲,統稱為轉儲文件。
代表某個時刻、某個進程的內存信息映射。包含了生成轉儲文件時該進程的整個內存信息以及寄存器信息。
轉儲文件可以是某個進程的,也可以是整個系統的。
可以在進程運行中生成,也可以在進程或者系統崩潰時自動生成。
為運行中的進程創建 core dump 文件一般通過 gdb 生成,使用 gdb 把進程 attach 進來之后,執行 generate-core-file 或者 gcore 命令來生成 core dump文件。
(程序運行異常,但是沒有崩潰,可以通過為運行中的進程創建 core dump 分析異常原因。)
運行中的程序生成 core dump 文件:
ps -aux | grep process //獲取正在運行中的 process進程的進程id。 gdb attach 29843 gcore test.core //運行中的程序生成 test.core文件。更多的情況是對程序崩潰時產生的 core dump 文件進行分析。
如何讓程序崩潰時自動產生 core dump 文件?
如果系統中 ulimit -c 命令顯示為0,表示當前不會自動生成 core dump 文件。
需要對于 ulimit -c 進行設置:
①:設置為無限值:ulimit -c unlimited。
core 文件名由 /proc/sys/kernel/core_pattern 文件控制。
[root@VM-16-8-centos remote-section]# cat /proc/sys/kernel/core_pattern core默認配置為 core 文件。
存在的缺陷:只有 core 文件名,如果程序在不同的地方崩潰,新生成的 core 文件將會覆蓋舊的 core 文件。
修改方式之一:加上進程名、pid、時間戳。
echo -e "%e-%p-%t" > /proc/sys/kernel/core_pattern使用 gdb 分析 core dump 文件:
加載core文件:
gdb ./[可執行文件] [core dump 文件]程序收到 SIGSEGV 信號終止表示出現了段錯誤 Segmentation fault。
段錯誤:非法訪問內存。
定位到崩潰的位置:查看堆棧
btf [數字] 根據崩潰幀的位置切換到數字對應的幀。
切換到 2 號幀。
f 2進入崩潰所在幀之后可以通過查看局部變量信息和源代碼進行原因分析。
分析方向:
①:內存是否分配不夠。(很少遇到)
②:是否出現棧溢出。(棧溢出非常難定位)
…………
分析無調試符號 core dump 文件
已經發布的正式版軟件,為了運行效率或節省空間等都會去掉調試信息,調試起來相對復雜。
沒有調試符號就無法查看參數,局部變量等信息。
使用 bt 命令 或者 where 命令定位到程序崩潰時調用棧的位置。
在 gdb 中使用 !head main.cpp -n 15 命令查看 main.cpp文件的前 15行代碼。
總結
以上是生活随笔為你收集整理的core dump 崩溃分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GDB调试基础操作详解【GDB调试】
- 下一篇: C++11线程