使用 GDB 调试
Debugging using 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 ();
}
}
在评论中,您指出打印出指针的值会产生 0。这就是您的答案。该代码正在尝试取消引用空指针。
您从某个库函数获得此指针,根据上下文,该库函数的目的是创建一个套接字。如果您要查看库函数的文档,您会发现如果由于某种原因无法创建套接字,空指针会得到 returned 的解释。
因此,您有两个 follow-up 行动方案:
1) 调查无法创建套接字的原因。
2) 吸取教训:无论何时调用库函数,都必须查看其文档。如果库函数指示它可能在其任务中失败,并且 return 一个值,或者某种操作失败的某种指示,您的代码必须检查它,并采取适当的措施。您不能假设库函数总是会成功。否则你的代码会以某种神秘的方式失败,你将被迫去一些网站并请陌生人帮助你。你显然不想那样做。您希望能够自己找出错误。
我正试图从我的 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 ();
}
}
在评论中,您指出打印出指针的值会产生 0。这就是您的答案。该代码正在尝试取消引用空指针。
您从某个库函数获得此指针,根据上下文,该库函数的目的是创建一个套接字。如果您要查看库函数的文档,您会发现如果由于某种原因无法创建套接字,空指针会得到 returned 的解释。
因此,您有两个 follow-up 行动方案:
1) 调查无法创建套接字的原因。
2) 吸取教训:无论何时调用库函数,都必须查看其文档。如果库函数指示它可能在其任务中失败,并且 return 一个值,或者某种操作失败的某种指示,您的代码必须检查它,并采取适当的措施。您不能假设库函数总是会成功。否则你的代码会以某种神秘的方式失败,你将被迫去一些网站并请陌生人帮助你。你显然不想那样做。您希望能够自己找出错误。