2014-11-06 73 views
0

我在使用gdb分析核心轉儲時遇到問題。我無法查看C代碼中任何結構的內容。 當我使用:gdb查看核心轉儲中的結構值

print myStruct->val 

我得到

Cannot access memory at address 0x2031b860 

或者

print *myStruct 

我得到同樣的錯誤。

當我嘗試從代碼中的其他結構打印內容時會發生這種情況。 但是,當我嘗試打印一個函數中的局部變量時,它打印確定。

執行的命令的順序是:

gdb ./myApp ./core 
(gdb)bt 
. 
. 
. 
#25 0x0868b276 in ikev2_check_icv (ike_sa=0x2031b860, packet=0x2031a950) at ikev2_payload.c:460 
. 
. 
(gdb) frame 25 
(gdb) print ike_sa 
$1 = (struct ikev2_sa *) 0x2031b860 
(gdb) print *ike_sa 
Cannot access memory at address 0x2031b860 
(gdb) 

所以我的問題是,沒有核心轉儲捕獲內存塊使用malloc分配呢?不僅僅是堆棧幀存儲器,就像從這個例子中看到的那樣。

我跑這在Linux上2.6.32.45-0.3 Xen的x86_64的

+3

您無法訪問內存的事實可能是核心轉儲的原因。使用堆棧跟蹤來查看結構指針的來源。或者使用Valgrind來追蹤未初始化的數據。 – 2014-11-06 14:32:01

+0

對不起,但事實並非如此。核心轉儲是由於另一個問題。我知道崩潰發生的地方,這只是爲了使用gdb建立能力。正如我所說的,我無法看到代碼中其他結構的內容。這是一個很大的代碼,但我很確定這個例子中的結構已被正確分配和初始化。 – 2014-11-06 14:46:39

+0

malloc'ed內存應該在覈心轉儲中,如果corefile ulimit沒有導致核心轉儲在該堆的那部分數據被轉儲之前被截斷。在gdb中運行'info files',看看核心轉儲文件映射的地址範圍是否包含0x2031b860。 – 2014-11-06 18:37:51

回答

0

所以我的問題是,是否使用malloc分配的核心轉儲捕獲內存塊?不僅僅是堆棧幀存儲器,就像從這個例子中看到的那樣。

這是正確的。

您觀察到的症狀通常表明您的core被截斷。

當您的ulimit -c太低或者當您用完磁盤空間寫入時會發生這種情況。

另一種可能性是您的core在轉移時被損壞將FTP從一臺機器轉移到另一臺機器進行分析。

+0

嗨,我沒有ftp文件,ulimit -c顯示,無限......我的磁盤上有53G可用空間。會有另一個原因嗎? – 2014-11-07 09:09:02