我在使用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的
您無法訪問內存的事實可能是核心轉儲的原因。使用堆棧跟蹤來查看結構指針的來源。或者使用Valgrind來追蹤未初始化的數據。 – 2014-11-06 14:32:01
對不起,但事實並非如此。核心轉儲是由於另一個問題。我知道崩潰發生的地方,這只是爲了使用gdb建立能力。正如我所說的,我無法看到代碼中其他結構的內容。這是一個很大的代碼,但我很確定這個例子中的結構已被正確分配和初始化。 – 2014-11-06 14:46:39
malloc'ed內存應該在覈心轉儲中,如果corefile ulimit沒有導致核心轉儲在該堆的那部分數據被轉儲之前被截斷。在gdb中運行'info files',看看核心轉儲文件映射的地址範圍是否包含0x2031b860。 – 2014-11-06 18:37:51