步驟很詳細具體,很有幫助,所以**
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檔案以及除錯
#include #include using namespace std;該程式在core_test1()內部scanf的時候回崩潰,i前面應該加上&void core_test1()
int main()
編譯的時候帶上-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檔案配置生成和除錯方法
Linux程式崩潰core使用(續)
linux檢視呼叫堆疊的資訊,只是需要更改linux設定,使程式崩潰時候產生core檔案。然後gdb除錯即可。1產生core檔案方法 產生coredump的條件,首先需要確認當前會話的ulimit c,若為0,則不會產生對應的coredump,需要進行修改和設定。ulimit c unlimited...
Linux生成core檔案 core檔案路徑設定
在linux下產生並除錯core檔案 先看看我用的是個什麼機器 uname a linux dev 2.4.21 9.30axsmp 1 smp wed may 26 23 37 09 edt 2004 i686 i686 i386 gnu linux 再看看預設的一些引數,注意core file ...
Linux生成core檔案 core檔案路徑設定
在linux下產生並除錯core檔案 先看看我用的是個什麼機器 uname a linux dev 2.4.21 9.30axsmp 1 smp wed may 26 23 37 09 edt 2004 i686 i686 i386 gnu linux 再看看預設的一些引數,注意core file ...