用gdb除錯coredump檔案

2021-06-17 20:51:52 字數 2622 閱讀 7311

在unix系統下,應用程式崩潰,一般會產生core檔案,如何根據core檔案查詢問題的所在,並做相應的分析和除錯,是非常重要的。

什麼是core dump?

core的意思是記憶體, dump的意思是扔出來, 堆出來.

開 發和使用unix程式時, 有時程式莫名其妙的down了,卻沒有任何的提示(有時候會提示core dumped). 這時候可以檢視一下有沒有形如core.程序號的檔案生成,這個檔案便是作業系統把程式down掉時的記憶體內容扔出來生成的, 它可以做為除錯程式的參考.

core dump又叫核心轉儲, 當程式執行過程中發生異常,程式異常退出時, 由作業系統把程式當前的記憶體狀況儲存在乙個core檔案中, 叫core dump.

為什麼沒有core檔案生成呢?

有時候程式down了, 但是core檔案卻沒有生成.core檔案的生成跟你當前系統的環境設定有關係, 可以用下面的語句設定一下,然後再執行程式便成生成core檔案.

ulimit -c unlimited

core檔案生成的位置一般於執行程式的路徑相同,檔名一般為core.程序號

當獲得了core檔案以後,就可以利用命令gdb進行查詢,引數一是應用程式的名稱,引數二是core檔案

如:gdb [...]xmsd [...]/xmsd_pid1065_sig11.core

ulimit -c unlimited

gdb test_svrd /data/corefile/test_svr_1334308671.20527

然後輸入bt或者where找到錯誤發生的位置和相應的堆疊資訊。就可知道發生錯誤時的函式呼叫關係,然後可以使用up或者down檢視上一條和下一條具體詳細資訊。這樣便能對問題進行大概定位,然後看源**,進行分析。

eg:(gdb) where

#0 0x0804ff8c inmemory_error (self=0x818ca10, ptr=0x82e5a94, msg=0x813efb2"memory_free") at/aston/h_debit/xms/bin/xms_1_15_11/src/xms/lib/memory.c:140

#1 0x080504cd inmemory_free (ptr=0x82e5a94) at/aston/h_debit/xms/bin/xms_1_15_11/src/xms/lib/memory.c:275

#2 0x080505ac inxml_free (ptr=0x82e5a94) at/aston/h_debit/xms/bin/xms_1_15_11/src/xms/lib/memory.c:316

#3 0xb7edb589 inxmlfreenode () from/home/zhenbo/workstation/devsuite-head/debug/lib/libxml2.so

#4 0x082b2228 in ??()

#5 0x08097031 ininte***cehandler_set (self=0x82bd74c, correlator=-4, conf=0x0,cb=0x82b0aac) at/aston/h_debit/xms/bin/xms_1_15_11/src/inte***ces/inte***cehandler.c:150

#6 0x0805e897 inconfigurable_set (self=0x82bd74c, correlator=-4, conf=0x0,cb=0x82b0aac) at/aston/h_debit/xms/bin/xms_1_15_11/src/xms/xms/configurable.c:85

#7 0x0805e73c inconfigurable_flush (self=0x82bd74c, correlator=-4, cb=0x82b0aac) at/aston/h_debit/xms/bin/xms_1_15_11/src/xms/xms/configurable.c:67 #80x08100ddc in system_complete (self=0x82b0aac, correlator=-5,code=0

如果之前不能準確定位錯誤的位置,則從以上資訊可以知道,可從函式inte***cehandler_set入手進行分析,其中的引數和行號都已經給出了。

多執行緒如果dump,多為段錯誤,一般都涉及記憶體非法讀寫。可以這樣處理,使用下面的命令開啟系統開關,讓其可以在死掉的時候生成core檔案。 

ulimit -cunlimited

這樣的話死掉的時候就可以在當前目錄看到core.pid(pid為程序號)的檔案。接著使用gdb:

gdb ./bin./core.pid

進去後,使用bt檢視死掉時棧的情況,在使用frame命令。

還有就是裡面某個執行緒停住,也沒死,這種情況一般就是死鎖或者涉及訊息接受的超時問題(聽人說的,沒有遇到過)。遇到這種情況,可以使用:

gcorepid(除錯程序的pid號)

手動生成core檔案,在使用pstack(linux下好像不好使)檢視堆疊的情況。如果都看不出來,就仔細檢視**,看看是不是在if,return,break,continue這種語句操作是忘記解鎖,還有巢狀鎖的問題,都需要分析清楚了。

用gdb除錯core dump檔案

在unix系統下,應用程式崩潰,一般會產生core檔案,如何根據core檔案查詢問題的所在,並做相應的分析和除錯,是非常重要的。什麼是core dump?core的意思是記憶體,dump的意思是扔出來,堆出來.開發和使用unix程式時,有時程式莫名其妙的down了,卻沒有任何的提示 有時候會提示co...

用gdb除錯core dump檔案

gdb基本的使用方法在此就不說了。載入core檔案的命令行為 dgb exe core 例如gdb testall core.2345 最重要的乙個命令是where,這個就像windbg的命令 analyze v 我模擬了幾個crash的情況,乙個乙個說。第乙個 刪除兩次指標導致crash的情況 源...

用gdb除錯core dump檔案

在unix系統下,應用程式崩潰,一般會產生core檔案,如何根據core檔案查詢問題的所在,並做相應的分析和除錯,是非常重要的。core的意思是記憶體,dump的意思是扔出來,堆出來.開發和使用unix程式時,有時程式莫名其妙的down了,卻沒有任何的提示 有時候會提示core dumped 這時候...