2010-11-13 2 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 == Условный переход или перемещение зависит от неинициализированного значения (-ов) == 10112 == Неверная запись размера 4 = = 10112 == Адрес 0x0 не является stack'd, malloc'd или (недавно) free'd == 10112 == Процесс, завершающий действием по умолчанию сигнала 11 (SIGSEGV) == 10112 == Доступ не в отображаемой области по адресу 0x0' Любые советы о том, что я должен делать дальше? –

+0

В вашей программе есть хотя бы одна переменная, которую вы используете без инициализации. Обратите внимание, что C и C++ не инициализируют встроенные типы в ноль/нуль. Например, если вы просто пишете «int x; return x;» то вы вернете неопределенный номер. Аналогично, «int * px;» является неопределенным указателем. –

+0

Кастинг, который я делал, был фактически неправильным! msg никогда не был IPv6 *. Извините за путаницу и большое спасибо за вашу помощь! –

Смежные вопросы