получение разных значений при проверке объекта с помощью GDB - PullRequest
0 голосов
/ 14 ноября 2010

Я использую 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 

и позже захотите проверить "msg" с помощью print * (IPv6 *) msg, потому что это тип сообщения msg. Ну, когда я смотрю на специфичные для Ipv6 поля msg, я всегда получаю совершенно разные значения, например:

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 Ответ

1 голос
/ 14 ноября 2010

Вы уверены, что не просто смотрите на неинициализированную (или освобожденную, а затем повторно используемую) память?Это может объяснить, почему ваш код также дает сбой.

...