通过gdb core dump方法查看程序异常时的堆栈信息
在Linux下可通過core文件來獲取當程序異常退出(如異常信號SIGSEGV, SIGABRT等)時的堆棧信息。core dump叫做核心轉儲,當程序運行過程中發生異常的那一刻的一個內存快照,操作系統在程序發生異常而異常在進程內部又沒有被捕獲的情況下,會把進程此刻內存、寄存器狀態、運行堆棧等信息轉儲保存在一個core文件里,叫core dump。core文件是程序非法執行后core dump后產生的文件,該文件是二進制文件,可以使用gdb、elfdump、objdump打開分析里面的具體內容。
產生core dump的可能原因:(1). 內存訪問越界;(2). 多線程程序使用了線程不安全的函數;(3). 多線程讀寫的數據未加鎖保護;(4). 非法指針;(5). 堆棧溢出。
查看操作系統是否開啟產生core文件:輸入命令:ulimit -c或ulimit -a, core file size為0,說明系統關閉了core dump,可通過命令:ulimit -c unlimited來打開,結果如下圖所示,注:此設置只對當前終端有效,再打開一個新的終端時,輸入ulimit -a,會發現core file size還是為0,若想始終有效,可在~/.bashrc文件最后加入命令:ulimit -c unlimited:
在Linux下執行程序時如果有提示”core dumped”信息,則會在當前目錄下產生一個core文件,若沒有產生,則可能core dump沒有打開。缺省情況下,內核在core dump時所產生的core文件放在與執行程序相同的目錄中,并且文件名固定為core,執行以下命令,可以將文件名修改為core.pid等形式,pid為執行當前程序的進程號,core_uses_pid中原始內容為0:
echo "1" > /proc/sys/kernel/core_uses_pid
測試代碼main.cpp如下:
#include <stdio.h>
#include <iostream>namespace {void func() {const char* p = "hello";delete p;
}} // namespaceint main()
{fprintf(stdout, "test start\n");func();fprintf(stdout, "test finish\n");
}
依次執行如下命令,執行結果如下圖所示,會在執行文件同一目錄下產生core二進制文件:
g++ -g -o main main.cpp
./main
如果有多個程序產生core文件,或者同一個程序多次崩潰,就會重復覆蓋同一個core文件。通過修改kernel參數,可以指定內核所生成的core dump文件的文件名,如設置core文件名形式為core_programname_time_pid,所有的core文件存放在/usr/core_log目錄下,則在終端輸入以下命令:
echo /usr/core_log/core_%e_%t_%p >> /proc/sys/kernel/core_pattern
通過gdb打開core文件:形式如下:$ gdb programname core,查看core dump時的堆棧信息,可以使用bt或where命令,如下圖所示,注:在編譯程序時加上-g選項才能夠獲取到具體的信息:
通過gdb help generate-core-file產生core文件,依次執行如下命令,執行結果如下圖所示,產生的core.pid好像不如上面方法產生的core文件信息詳細:
gdb main
help generate-core-file
start
generate-core-file
以上內容主要參考:
1.?https://blog.csdn.net/u014403008/article/details/54174109
2.?https://blog.csdn.net/ithomer/article/details/5945152
GitHub:https://github.com//fengbingchun/Messy_Test
總結
以上是生活随笔為你收集整理的通过gdb core dump方法查看程序异常时的堆栈信息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 海思3559A上编译libjpeg-tu
- 下一篇: FFmpeg中可执行文件ffplay用法