使用GDB进行调试

fer*_*rer 0 c++ gdb tcp ns-3 mptcp

我正在尝试从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
Run Code Online (Sandbox Code Playgroud)

我不明白发生了什么,是什么导致了错误。任何帮助都将受到欢迎。

谢谢。

此函数是发生错误的地方:

// 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 ();
    }
}
Run Code Online (Sandbox Code Playgroud)

Sam*_*hik 5

在注释中,您指出了输出指针的值将产生0。因此,这几乎是您的答案。该代码正在尝试取消引用空指针。

您从某个库函数获得了此指针,该库函数的目的是基于上下文,以创建套接字。如果要检查库函数的文档,则会发现以下解释:如果由于某种原因无法创建套接字,则会返回空指针。

因此,您有两个后续行动过程:

1)研究为什么无法创建套接字。

2)以此作为汲取的教训:每当调用库函数时,都必须检查其文档。如果库函数指示它可能无法执行其任务,并返回一个值,或某种表明该操作已失败的指示,则您的代码必须对其进行检查并采取适当的措施。您不能假定库函数将始终成功。否则,您的代码将以某种神秘的方式失败,并且您将被迫转到某个网站并要求陌生人帮助您。而且您显然不想这样做。您希望能够自己找出所有错误。