Отладка с использованием GDB

Я пытаюсь вывести ошибку из моей программы ns-3 (программное обеспечение для моделирования сетей).

Я запускаю его под gdb:

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff4850195 in ns3::MpTcpBulkSendApplication::StartApplication (this=0x706850) at ../src/applications/model/mp-tcp-bulk-send-application.cc:170
170       m_socket->Bind();
(gdb) bt
#0  0x00007ffff4850195 in ns3::MpTcpBulkSendApplication::StartApplication (this=0x706850) at ../src/applications/model/mp-tcp-bulk-send-application.cc:170
#1  0x00007ffff09f9b45 in ns3::EventImpl* ns3::MakeEvent<void (ns3::Application::*)(), ns3::Application*>(void (ns3::Application::*)(), ns3::Application*)::EventMemberImpl0::Notify() (this=0x62f440) at ./ns3/make-event.h:94
#2  0x00007ffff02e90ef in ns3::EventImpl::Invoke (this=0x62f440) at ../src/core/model/event-impl.cc:45
#3  0x00007ffff02ee3a9 in ns3::DefaultSimulatorImpl::ProcessOneEvent (this=0x6d2d00) at ../src/core/model/default-simulator-impl.cc:141
#4  0x00007ffff02ee7ac in ns3::DefaultSimulatorImpl::Run (this=0x6d2d00) at ../src/core/model/default-simulator-impl.cc:194
#5  0x00007ffff02e9ff5 in ns3::Simulator::Run () at ../src/core/model/simulator.cc:161
#6  0x0000000000410640 in main (argc=1, argv=0x7fffffffdc58) at ../scratch/doordi3.cc:188

Не могу понять что происходит, что выдает ошибку. Любая помощь приветствуется.

Спасибо.

Эта функция является местом, откуда возникает ошибка:

// Application Methods
void MpTcpBulkSendApplication::StartApplication (void) // Called at time specified by Start
{
  NS_LOG_FUNCTION (this);
  //NS_LOG_UNCOND(Simulator::Now().GetSeconds() << " StartApplication -> Node-FlowId: {" << GetNode()->GetId() <<"-" << m_flowId<< "} MaxBytes: " << m_maxBytes << " F-Type: " << m_flowType << " S-Time: " << m_simTime);
  // Create the socket if not already
  if (!m_socket)
     { cout<<"Going to Bind"<<endl;
      //m_socket = CreateObject<MpTcpSocketBase>(GetNode()); //m_socket = Socket::CreateSocket (GetNode (), m_tid);
      m_socket = DynamicCast<MpTcpSocketBase>(Socket::CreateSocket (GetNode (), m_tid));
      m_socket->Bind();
      //m_socket->SetMaxSubFlowNumber(m_subflows);
      m_socket->SetFlowType(m_flowType);
      m_socket->SetOutputFileName(m_outputFileName);
      int result = m_socket->Connect(m_peer);
      if (result == 0)
        {
          m_socket->SetFlowId(m_flowId);
          m_socket->SetDupAckThresh(m_dupack);
          m_socket->SetConnectCallback(MakeCallback(&MpTcpBulkSendApplication::ConnectionSucceeded, this),MakeCallback(&MpTcpBulkSendApplication::ConnectionFailed, this));
          m_socket->SetDataSentCallback(MakeCallback(&MpTcpBulkSendApplication::DataSend, this));
          m_socket->SetCloseCallbacks (MakeCallback (&MpTcpBulkSendApplication::HandlePeerClose, this),MakeCallback (&MpTcpBulkSendApplication::HandlePeerError, this));
          //m_socket->SetSendCallback(MakeCallback(&MpTcpBulkSendApplication::DataSend, this));
        }
      else
        {
          NS_LOG_UNCOND("Connection is failed");
        }
    }
  if (m_connected)
    { 
      SendData ();
    }
}

person ferrer    schedule 23.01.2016    source источник
comment
GDB дал вам строку кода ошибки сегментации. Мы не можем дать вам больше без дополнительных подсказок. Если вам нужны подробности, вы можете попробовать использовать Valgrind.   -  person Aracthor    schedule 23.01.2016
comment
Не могли бы вы предоставить весь код, который вы написали?   -  person user2277550    schedule 23.01.2016
comment
@ user2277550 для работы нужен код mptcp с ns3. Так вот, я не стал это публиковать. Было бы полезно?   -  person ferrer    schedule 23.01.2016
comment
Возможно нет. Однако ваш отладчик довольно четко определяет, где создается сегментная ошибка. Просто проверьте способы, которыми привязка сокетов может привести к segfault, и посмотрите, не является ли проблема одной из них.   -  person user2277550    schedule 23.01.2016
comment
У вас все еще есть тот сеанс gdb, в котором программа получила ошибку? В gdb введите print m_socket. Это 0 или какое-то неоправданно большое или малое число?   -  person Mark Plotnick    schedule 23.01.2016
comment
@MarkPlotnick Спасибо за руководство, Марк. Я сделал это и получил: $1 = {m_ptr = 0x0}. Итак, его ноль.   -  person ferrer    schedule 23.01.2016
comment
Кроме того, может ли кто-нибудь объяснить, что такое Config::SetDefault(ns3::TcpL4Protocol::SocketType, TypeIdValue(MpTcpSocketBase::GetTypeId())); эта строка делает в ns3?   -  person ferrer    schedule 23.01.2016
comment
Можете ли вы сказать нам, какую версию ns-3 вы используете, например ns-3.24 или ns-3-dev или чью-то настроенную ветку?   -  person Mark Plotnick    schedule 23.01.2016
comment
@MarkPlotnick Я запускаю эту реализацию: github.com/mkheirkhah/mptcp (ns-3 с моделью MPTCP ). Тот же код используется командой ns-3 для разработки официальной версии Multipath TCP. Спасибо.   -  person ferrer    schedule 23.01.2016


Ответы (1)


В комментариях вы указали, что распечатка значения указателя дает 0. Так что это в значительной степени ваш ответ. Код пытается разыменовать нулевой указатель.

Вы получили этот указатель от какой-то библиотечной функции, целью которой, исходя из контекста, является создание сокета. Если бы вы проверили документацию вашей библиотечной функции, вы бы нашли объяснение, что нулевой указатель возвращается, если по какой-то причине сокет не может быть создан.

Итак, у вас есть два дальнейших плана действий:

1) Выясните, почему не удалось создать сокет.

2) Возьмите это как урок: всякий раз, когда вы вызываете библиотечную функцию, вы должны проверять ее документацию. Если библиотечная функция указывает, что она может потерпеть неудачу в своей миссии, и возвращает значение или какое-либо указание на то, что операция не удалась, ваш код должен проверить это и предпринять соответствующие действия. Вы не можете предполагать, что библиотечная функция всегда будет успешной. В противном случае ваш код каким-то загадочным образом выйдет из строя, и вам придется зайти на какой-нибудь веб-сайт и попросить незнакомцев помочь вам. И вы явно не хотите этого делать. Вы хотите быть в состоянии выяснить все свои ошибки самостоятельно.

person Sam Varshavchik    schedule 23.01.2016