2010-11-13 38 views
0

我正在使用gdb調試以分段錯誤終止的C++程序。望着堆,前幾幀有:使用gdb檢查對象時獲得不同的值

#0 0x0041c496 in cDefaultList::doInsert (this=0x9c69708, obj=0x9c69348) at cdefaultlist.cc:119 
#1 0x0041c86c in cDefaultList::take (this=0x9c69708, obj=0x9c69348) at cdefaultlist.cc:189 
#2 0x0043bd9c in cPacket::encapsulate (this=0x9c69708, msg=0x9c69348) at cmessage.cc:589 
#3 0x08448861 in MobIPv6mn::handleMessage (this=0x96d3350, msg=0x9c69348) at src/networklayer/numbatIPv6/mip6.cc:170 
#4 0x0046069c in cSimulation::doOneEvent (this=0x87f3318, mod=0x96d3350) at csimulation.cc:627 
#5 0x0015ecdf in Tkenv::doRunSimulation (this=0x87f3110) at tkenv.cc:529 
#6 0x0015e899 in Tkenv::runSimulation (this=0x87f3110, mode=2, until_time=..., until_eventnum=0, until_msg=0x0, until_module=0x0) at tkenv.cc:402 
#7 0x00168f10 in run_cmd (interp=0x8842e48, argc=2, argv=0xbfffcb00) at tkcmd.cc:430 

所以我做的:

frame 3 

,後來要檢查「味精」與print * (IPv6 *) msg,因爲這是味精的類型應該是什麼。好吧,當我看着味精的IPv6特定領域,我總是得到完全不同的值,比如:

srcIP_var = {addr = "\000\000\000\000\000\000i\000\000\000\001\000\000\000\001"}, dstIP_var = { addr = "\000\000H\223\306\t\000\000\000\000\000\000\000\000\000"}, BindingUpdate_var = false, BindingAck_var = false, Dhcpv6Relay_var = false}

srcIP_var = {addr = "\000\000\000\000\000\000)\000\000\000\020\264K\000\020\264"}, dstIP_var = {addr = "\346\t:SCALEEXP_UNIN"}, BindingUpdate_var = 73, BindingAck_var = 84, Dhcpv6Relay_var = 73}

甚至:

srcIP_var = {addr = "\000\000\000\000\000\000\061\000\000\000\030\264K\000\030\264"}, dstIP_var = { addr = "K\000\a\350N\v\304\350N\v\001\000\000\000\001"}, BindingUpdate_var = false, BindingAck_var = false, Dhcpv6Relay_var = false}

這是爲什麼?這是否意味着這個數據包並不是我試圖使用的類型?

非常感謝!

回答

1

你確定你不只是在看未初始化(或釋放,然後重新使用)的內存?這可以解釋爲什麼你的代碼也崩潰了。

+0

這可能的確如此。我只是跑valgrind,它說,與我上面描述的相同的堆棧執行導致: '== 10112 ==條件跳轉或移動取決於未初始化的值(s) == 10112 ==無效寫入大小4 = = 10112 ==地址0x0未堆棧,malloc'd或(最近)已釋放 == 10112 ==進程以信號11(SIGSEGV)的默認操作終止(SIGSEGV) == 10112 ==訪問不在映射區域內在地址0x0' 關於接下來我應該做什麼的提示? – 2010-11-14 00:14:44

+0

您的程序中至少有一個變量未經初始化就使用。請注意,C和C++不會將內置類型初始化爲零/ null。例如,如果你只寫「int x; return x;」那麼你會返回一個未定義的數字。同樣,「int * px;」是一個未定義的指針。 – 2010-11-14 09:51:03

+0

我在做的演員其實是錯的! msg從來不是IPv6 *。對不起,我感到很困惑,並且非常感謝您的幫助! – 2010-11-15 23:08:18

相關問題