gdb 調試coredump文件過程


gdb 調試coredump文件過程:

第一步:首先需要一個進程的coredump文件,怎么搞出coredump文件呢?

1、 ps -fax|grep                 進程名稱 找到進程的pid

2、gdb -p pid                     調試進程

3、gcore coredump名稱        則生成core文件

https://www.cnblogs.com/wangjian8888/p/11978397.html 該鏈接有應用程序崩潰后生成core文件具體方法

第二步:找出coredump文件的應用程序

1、gdb -c corefile   使用gdb調試core文件

2、info auxv          索引31對應的是core文件的應用程序

第三部:gdb使用應用程序調試coredump文件

gdb  coredump應用程序  coredump文件     調試coredump文件 

 

通過以上三步就可以調試coredump文件了

通過以下命令調試coredump文件

info threads 顯示所有線程

bt 顯示線程堆棧信息

thread thread_num   切換線程

frame num  切換棧

info r 顯示當前幀的寄存器信息 (每一幀的寄存器信息都是不相同的)

 

readelf應用coredump

readelf -h 讀取coredump文件頭

readelf -wl 讀取應用程序debug_line

readelf -wf 讀取應用程序fde和cie信息

 

 

gdb core 多線程
在linux環境下調試多線程,總覺得不像.NET那么方便。這幾天就為找一個死鎖的bug折騰好久,介紹一下用過的方法吧。

多線程如果dump,多為段錯誤,一般都涉及內存非法讀寫。可以這樣處理,使用下面的命令打開系統開關,讓其可以在死掉的時候生成core文件。   
ulimit -c unlimited
這樣的話死掉的時候就可以在當前目錄看到core.pid(pid為進程號)的文件。接着使用gdb:
gdb ./bin ./core.pid 
進去后,使用bt查看死掉時棧的情況,在使用frame命令。

還有就是里面某個線程停住,也沒死,這種情況一般就是死鎖或者涉及消息接受的超時問題(聽人說的,沒有遇到過)。遇到這種情況,可以使用:
gcore pid (調試進程的pid號)
手動生成core文件,在使用pstack(linux下好像不好使)查看堆棧的情況。如果都看不出來,就仔細查看代碼,看看是不是在 if,return,break,continue這種語句操作是忘記解鎖,還有嵌套鎖的問題,都需要分析清楚了。

最后,說一句,靜心看代碼,捶胸頓足是沒有用的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM