Linux環境崩環境潰生成core文件以及調試
gdb結合coredump定位崩潰進程
Linux 使用core file文件快速定位程序崩潰代碼行
http://www.cnblogs.com/hazir/p/linxu_core_dump.html
http://www.cnblogs.com/niocai/archive/2012/04/01/2428128.html
http://baidutech.blog.51cto.com/4114344/904419/
Linux上Core Dump文件的形成和分析
Windows環境崩潰問題可根據vs調試工具查看,Linux同樣可以查看調用堆棧的信息,只是
需要更改Linux設置,使程序崩潰時候產生core文件。然后gdb調試即可。
1產生core文件方法
產生coredump的條件,首先需要確認當前會話的ulimit –c,若為0,則不會產生對應的coredump,需要進行修改和設置。
ulimit -c unlimited (可以產生coredump且不受大小限制),這種設置僅對當前生效,如果想永久生效
那么需要在
/etc/profile中加入以下一行,這將允許生成coredump文件
ulimit-c unlimited
2更改core dump生成路徑
因為core dump默認會生成在程序的工作目錄,但是有些程序存在切換目錄的情況,導致core dump生成的路徑沒有規律,
所以最好是自己建立一個文件夾,存放生成的core文件。
我建立一個 /data/coredump 文件夾,在根目錄data里的coredump文件夾。
調用如下命令
echo /data/coredump/core.%e.%p> /proc/sys/kernel/core_pattern
將更改core文件生成路徑,自動放在這個/data/coredump文件夾里。
%e表示程序名, %p表示進程id
3測試生成core文件以及調試
該程序在core_test1()內部scanf的時候回崩潰,i前面應該加上&
編譯的時候帶上-g選項,這樣才能用gdb調試core
運行后結果顯示段錯誤
進入/data/coredump文件夾可以查看生成的core
用gdb調試該core,命令為 gdb core.ctest.6408 ,顯示如下
program terminated with signal 11 告訴我們信號中斷了我們的程序
敲命令: bt 可以打印堆棧信息
這個一堆問號很多人遇到過,有人說是沒加載符號表,有人說是標准glibc版本不一致,
可以通過如下命令調試:
gdb 可執行程序exe
進入gdb環境后
core-file core的名字
敲命令bt可以查看准確信息。
示例:
gdb ./ctest
進入gdb環境后,敲core-file /data/coredump/core.ctest.6408
敲bt命令,這是gdb查看back trace的命令
可以看到最近的棧中存儲的是調用了IO操作,之前一步是scanf,再往前能看到是
ctest.cpp中第九行 core_test1()函數出錯。
到此為止,就是core文件配置生成和調試方法