我正在研究ns-3模拟器的模块。对于不熟悉它的人,他们展示了一个定制的共享指针:Ptr<T>
。通常使用CreateObject<T>(…)
函数创建这些对象,该函数基本上调用new T(…)
并将其包装在Ptr<T>
中。
使用在构造函数中创建的其中一项时遇到麻烦:
SatUtHelper::SatUtHelper (SatTypedefs::CarrierBandwidthConverter_t carrierBandwidthConverter,
uint32_t fwdLinkCarrierCount,
Ptr<SatSuperframeSeq> seq,
SatMac::ReadCtrlMsgCallback readCb,
SatMac::ReserveCtrlMsgCallback reserveCb,
SatMac::SendCtrlMsgCallback sendCb,
RandomAccessSettings_s randomAccessSettings)
: m_superframeSeq (seq),
m_llsConf (),
[...snip...]
{
[...snip...]
m_llsConf = CreateObject<SatLowerLayerServiceConf> ();
}
我这样使用:
Ptr<SatRandomAccessConf> randomAccessConf = CreateObject<SatRandomAccessConf> (m_llsConf, m_superframeSeq);
SatRandomAccessConf
构造函数开始如下:
SatRandomAccessConf::SatRandomAccessConf (Ptr<SatLowerLayerServiceConf> llsConf, Ptr<SatSuperframeSeq> superframeSeq)
: m_configurationIdPerAllocationChannel (),
m_slottedAlohaControlRandomizationIntervalInMilliSeconds (),
m_allocationChannelCount (llsConf->GetRaServiceCount ()),
m_crdsaSignalingOverheadInBytes (5),
m_slottedAlohaSignalingOverheadInBytes (3)
{
NS_LOG_FUNCTION (this);
if (m_allocationChannelCount < 1)
{
NS_FATAL_ERROR ("SatRandomAccessConf::SatRandomAccessConf - No random access allocation channel");
}
m_slottedAlohaControlRandomizationIntervalInMilliSeconds = (llsConf->GetDefaultControlRandomizationInterval ()).GetMilliSeconds ();
DoSlottedAlohaVariableSanityCheck ();
并包含一些超出该点的检查,由于llsConf
处于非相干状态,炸毁了该点。
我已经使用GDB来检查llsConf
对象的状态:
DoSlottedAlohaVariableSanityCheck ()
上设置了一个断点; llsConf
上调用了确实返回垃圾值的方法; m_allocationChannelCount
方法中的返回值不同的m_slottedAlohaControlRandomizationIntervalInMilliSeconds
和llsConf
值; m_llsConf
上的预期值; llsConf
的内容中有大量可疑属性设置为0
。GDB会话的相关部分:
(gdb) bt
#0 ns3::SatRandomAccessConf::DoSlottedAlohaVariableSanityCheck (this=0x55555a160a00) at ../contrib/satellite/model/satellite-random-access-container-conf.cc:146
#1 0x00007ffff76fe0e1 in ns3::SatRandomAccessConf::SatRandomAccessConf (this=0x55555a160a00, llsConf=..., superframeSeq=...) at ../contrib/satellite/model/satellite-random-access-container-conf.cc:75
#2 0x00007ffff781fa26 in ns3::CreateObject<ns3::SatRandomAccessConf, ns3::Ptr<ns3::SatLowerLayerServiceConf>, ns3::Ptr<ns3::SatSuperframeSeq> > (a1=..., a2=...) at ./ns3/object.h:557
#3 0x00007ffff781d494 in ns3::SatUtHelper::Install (this=0x555555841990, n=..., beamId=10, fCh=..., rCh=..., gwNd=..., ncc=..., cbChannel=..., cbRouting=...) at ../contrib/satellite/helper/satellite-ut-helper.cc:425
#4 0x00007ffff781b307 in ns3::SatUtHelper::Install (this=0x555555841990, c=..., beamId=10, fCh=..., rCh=..., gwNd=..., ncc=..., cbChannel=..., cbRouting=...) at ../contrib/satellite/helper/satellite-ut-helper.cc:231
#5 0x00007ffff77b03bc in ns3::SatBeamHelper::Install (this=0x5555557ecb20, ut=..., gwNode=..., gwId=3, beamId=10, ulFreqId=3, flFreqId=1, routingCallback=...) at ../contrib/satellite/helper/satellite-beam-helper.cc:475
#6 0x00007ffff77f0262 in ns3::SatHelper::DoCreateScenario (this=0x5555557ec810, beamInfos=std::map with 0 elements, gwUsers=1) at ../contrib/satellite/helper/satellite-helper.cc:566
#7 0x00007ffff77ee873 in ns3::SatHelper::CreateUserDefinedScenario (this=0x5555557ec810, infos=std::map with 0 elements) at ../contrib/satellite/helper/satellite-helper.cc:389
#8 0x00007ffff7844e0b in ns3::SimulationHelper::CreateSatScenario (this=0x5555557ec5a0, scenario=ns3::SatHelper::NONE, mobileUtsFolder="contrib/satellite/data/utpositions/mobiles/")
at ../contrib/satellite/helper/simulation-helper.cc:1170
#9 0x00007ffff784a1dc in ns3::SimulationHelper::ConfigureAttributesFromFile (this=0x5555557ec5a0, filePath="/tmp/sns-3-qs4ebg47/parameters.xml", overrideManualConfiguration=true) at ../contrib/satellite/helper/simulation-helper.cc:1555
#10 0x0000555555557225 in main (argc=3, argv=0x7fffffffe798) at ../contrib/satellite/examples/sat-generic-launcher.cc:60
(gdb) p llsConf->GetRaServiceCount()
$1 = 0 '\000'
(gdb) p llsConf->GetDefaultControlRandomizationInterval()
$2 = {static g_markingTimes = 0x7ffff39447a0 <ns3::Time::StaticInit()::markingTimes>, m_data = 93824994540112}
(gdb) p llsConf->GetDefaultControlRandomizationInterval().GetMilliSeconds()
$3 = 93824994
(gdb) p m_allocationChannelCount
$4 = 1
(gdb) p m_slottedAlohaControlRandomizationIntervalInMilliSeconds
$5 = 100
(gdb) p llsConf
$6 = {m_ptr = 0x7fffffffd718}
(gdb) p *(llsConf.m_ptr)
$7 = {<ns3::Object> = {<ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter>> = {<ns3::ObjectBase> = {_vptr.ObjectBase = 0x5555557af810}, m_count = 1434627024}, m_tid = {m_tid = 21845}, m_disposed = false,
m_initialized = false, m_aggregates = 0x91c8f8cb8ee26900, m_getObjectCount = 0}, static m_minDaServiceEntries = 2 '\002', static m_minRaServiceEntries = 1 '\001', static m_maxDaServiceEntries = 4 '\004',
static m_maxRaServiceEntries = 3 '\003', m_dynamicRatePersistence = 0 '\000', m_volumeBacklogPersistence = 0 '\000', m_defaultControlRandomizationInterval = {
static g_markingTimes = 0x7ffff39447a0 <ns3::Time::StaticInit()::markingTimes>, m_data = 93824994540112}, m_daServiceEntryCount = 102 'f', m_daServiceEntries = {{m_constantAssignmentProvided = false, m_rbdcAllowed = false,
m_volumeAllowed = false, m_constantServiceRateStream = {m_ptr = 0x7fffffffdb50}, m_maximumServiceRateKbps = 54420, m_minimumServiceRateKbps = 63361, m_maximumBacklogInKbytes = 32767}, {m_constantAssignmentProvided = 54,
m_rbdcAllowed = 62, m_volumeAllowed = 103, m_constantServiceRateStream = {m_ptr = 0x0}, m_maximumServiceRateKbps = 51468, m_minimumServiceRateKbps = 63349, m_maximumBacklogInKbytes = 32767}, {m_constantAssignmentProvided = false,
m_rbdcAllowed = false, m_volumeAllowed = false, m_constantServiceRateStream = {m_ptr = 0x7ffff7710ce6 <ns3::SatRequestManager::AssignedDaResources(unsigned char, unsigned int)>}, m_maximumServiceRateKbps = 0,
m_minimumServiceRateKbps = 0, m_maximumBacklogInKbytes = 0}, {m_constantAssignmentProvided = 192, m_rbdcAllowed = 189, m_volumeAllowed = 112, m_constantServiceRateStream = {m_ptr = 0x0}, m_maximumServiceRateKbps = 65,
m_minimumServiceRateKbps = 0, m_maximumBacklogInKbytes = 0}}, m_raServiceIndexDefault = 0 '\000', m_raServiceEntryCount = 0 '\000', m_raServiceEntries = {{m_maxUniquePayloadPerBlock = 118 'v',
m_maxConsecutiveBlockAccessed = 130 '\202', m_minimumIdleBlock = 112 'p', m_backOffTimeInMilliSeconds = 32767, m_highLoadBackOffTimeInMilliSeconds = 0, m_backOffProbability = 0, m_highLoadBackOffProbability = 0,
m_numberOfInstances = 0 '\000', m_averageNormalizedOfferedLoadThreshold = 6.9533487051292957e-310, m_isCrdsaAllowed = false, m_isSlottedAlohaAllowed = false}, {m_maxUniquePayloadPerBlock = 54 '6',
m_maxConsecutiveBlockAccessed = 62 '>', m_minimumIdleBlock = 103 'g', m_backOffTimeInMilliSeconds = 32767, m_highLoadBackOffTimeInMilliSeconds = 0, m_backOffProbability = 0, m_highLoadBackOffProbability = 0,
m_numberOfInstances = 0 '\000', m_averageNormalizedOfferedLoadThreshold = 7.5592043813710721e-322, m_isCrdsaAllowed = false, m_isSlottedAlohaAllowed = false}, {m_maxUniquePayloadPerBlock = 113 'q',
m_maxConsecutiveBlockAccessed = 0 '\000', m_minimumIdleBlock = 0 '\000', m_backOffTimeInMilliSeconds = 0, m_highLoadBackOffTimeInMilliSeconds = 0, m_backOffProbability = 0, m_highLoadBackOffProbability = 0,
m_numberOfInstances = 0 '\000', m_averageNormalizedOfferedLoadThreshold = 6.9533487349484301e-310, m_isCrdsaAllowed = false, m_isSlottedAlohaAllowed = false}}}
(gdb) up
#2 0x00007ffff781fa26 in ns3::CreateObject<ns3::SatRandomAccessConf, ns3::Ptr<ns3::SatLowerLayerServiceConf>, ns3::Ptr<ns3::SatSuperframeSeq> > (a1=..., a2=...) at ./ns3/object.h:557
557 return CompleteConstruct (new T (a1,a2));
(gdb) up
#3 0x00007ffff781d494 in ns3::SatUtHelper::Install (this=0x555555841990, n=..., beamId=10, fCh=..., rCh=..., gwNd=..., ncc=..., cbChannel=..., cbRouting=...) at ../contrib/satellite/helper/satellite-ut-helper.cc:425
425 Ptr<SatRandomAccessConf> randomAccessConf = CreateObject<SatRandomAccessConf> (m_llsConf, m_superframeSeq);
(gdb) p m_llsConf->GetRaServiceCount()
$8 = 1 '\001'
(gdb) p m_llsConf->GetDefaultControlRandomizationInterval().GetMilliSeconds()
$9 = 100
(gdb) p m_llsConf
$10 = {m_ptr = 0x5555557af810}
(gdb) p *(m_llsConf.m_ptr)
$11 = {<ns3::Object> = {<ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter>> = {<ns3::ObjectBase> = {_vptr.ObjectBase = 0x7ffff7d93850 <vtable for ns3::SatLowerLayerServiceConf+16>}, m_count = 6}, m_tid = {
m_tid = 406}, m_disposed = false, m_initialized = false, m_aggregates = 0x5555564d2540, m_getObjectCount = 0}, static m_minDaServiceEntries = 2 '\002', static m_minRaServiceEntries = 1 '\001',
static m_maxDaServiceEntries = 4 '\004', static m_maxRaServiceEntries = 3 '\003', m_dynamicRatePersistence = 5 '\005', m_volumeBacklogPersistence = 7 '\a', m_defaultControlRandomizationInterval = {
static g_markingTimes = 0x7ffff39447a0 <ns3::Time::StaticInit()::markingTimes>, m_data = 100000000}, m_daServiceEntryCount = 4 '\004', m_daServiceEntries = {{m_constantAssignmentProvided = false, m_rbdcAllowed = false,
m_volumeAllowed = false, m_constantServiceRateStream = {m_ptr = 0x5555561d07d0}, m_maximumServiceRateKbps = 9216, m_minimumServiceRateKbps = 10, m_maximumBacklogInKbytes = 384}, {m_constantAssignmentProvided = false,
m_rbdcAllowed = false, m_volumeAllowed = false, m_constantServiceRateStream = {m_ptr = 0x555555e48b20}, m_maximumServiceRateKbps = 9216, m_minimumServiceRateKbps = 10, m_maximumBacklogInKbytes = 384}, {
m_constantAssignmentProvided = false, m_rbdcAllowed = false, m_volumeAllowed = false, m_constantServiceRateStream = {m_ptr = 0x55555581d600}, m_maximumServiceRateKbps = 9216, m_minimumServiceRateKbps = 10,
m_maximumBacklogInKbytes = 384}, {m_constantAssignmentProvided = false, m_rbdcAllowed = false, m_volumeAllowed = false, m_constantServiceRateStream = {m_ptr = 0x5555557a95f0}, m_maximumServiceRateKbps = 9216,
m_minimumServiceRateKbps = 16, m_maximumBacklogInKbytes = 384}}, m_raServiceIndexDefault = 0 '\000', m_raServiceEntryCount = 1 '\001', m_raServiceEntries = {{m_maxUniquePayloadPerBlock = 1 '\001',
m_maxConsecutiveBlockAccessed = 6 '\006', m_minimumIdleBlock = 0 '\000', m_backOffTimeInMilliSeconds = 150, m_highLoadBackOffTimeInMilliSeconds = 500, m_backOffProbability = 1, m_highLoadBackOffProbability = 1,
m_numberOfInstances = 3 '\003', m_averageNormalizedOfferedLoadThreshold = 0.98999999999999999, m_isCrdsaAllowed = true, m_isSlottedAlohaAllowed = true}, {m_maxUniquePayloadPerBlock = 3 '\003',
m_maxConsecutiveBlockAccessed = 4 '\004', m_minimumIdleBlock = 2 '\002', m_backOffTimeInMilliSeconds = 250, m_highLoadBackOffTimeInMilliSeconds = 500, m_backOffProbability = 10000, m_highLoadBackOffProbability = 30000,
m_numberOfInstances = 2 '\002', m_averageNormalizedOfferedLoadThreshold = 0.5, m_isCrdsaAllowed = true, m_isSlottedAlohaAllowed = true}, {m_maxUniquePayloadPerBlock = 3 '\003', m_maxConsecutiveBlockAccessed = 4 '\004',
m_minimumIdleBlock = 2 '\002', m_backOffTimeInMilliSeconds = 250, m_highLoadBackOffTimeInMilliSeconds = 500, m_backOffProbability = 10000, m_highLoadBackOffProbability = 30000, m_numberOfInstances = 5 '\005',
m_averageNormalizedOfferedLoadThreshold = 0.5, m_isCrdsaAllowed = true, m_isSlottedAlohaAllowed = true}}}
现在,如果我在断点之前添加行Ptr<SatLowerLayerServiceConf> uglyHack = llsConf;
,实际上我可以看到它们是相等的:
(gdb) p uglyHack
$1 = {m_ptr = 0x5555557af810}
(gdb) p llsConf
$2 = {m_ptr = 0x7fffffffd718}
(gdb) up
#2 0x00007ffff781fa56 in ns3::CreateObject<ns3::SatRandomAccessConf, ns3::Ptr<ns3::SatLowerLayerServiceConf>, ns3::Ptr<ns3::SatSuperframeSeq> > (a1=..., a2=...) at ./ns3/object.h:557
557 return CompleteConstruct (new T (a1,a2));
(gdb)
#3 0x00007ffff781d4c4 in ns3::SatUtHelper::Install (this=0x555555841990, n=..., beamId=10, fCh=..., rCh=..., gwNd=..., ncc=..., cbChannel=..., cbRouting=...) at ../contrib/satellite/helper/satellite-ut-helper.cc:425
425 Ptr<SatRandomAccessConf> randomAccessConf = CreateObject<SatRandomAccessConf> (m_llsConf, m_superframeSeq);
(gdb) p m_llsConf
$3 = {m_ptr = 0x5555557af810}
有人知道参数传递和副本分配如何允许这种行为吗?