Accès à un pointeur invalide
wella_salwa Messages postés 41 Date d'inscription Statut Membre Dernière intervention -
Bonjour ,
Je suis entrain de simuler un exemple qui traite la QoS, dans le projet :
https://github.com/nsol-nmsu/NFD-QoS/tree/38b7a27af36aa63e2ec17846332762adf9abd7d1
Une erreur apparaît dans le fichier suivant :
void
QosStrategy::prioritySend()
{
if(!driverConnected){
setUp();
driverConnected = true;
}
ns3::Ptr<ns3::Node> node= ns3::NodeContainer::GetGlobal().Get( ns3::Simulator::GetContext() );
Interest interest;
Data data;
lp::Nack nack;
double TOKEN_REQUIRED = 1;
bool tokenwait = false;
std::unordered_map<uint32_t,NdnPriorityTxQueue >::iterator itt = m_tx_queue.begin();
while( itt != m_tx_queue.end() ) {
Forwarder& fwdr = *(node->GetObject<ns3::ndn::L3Protocol>()->getForwarder());
const Face& outFace = *(fwdr.getFaceTable().get(itt->first));
ns3::ndn::NetDeviceTransport* device = dynamic_cast<ns3::ndn::NetDeviceTransport*>( outFace.getTransport());
uint32_t rate =25;
if(device != NULL){
rate = ns3::DynamicCast<ns3::QueueBase>(ns3::DynamicCast<ns3::PointToPointNetDevice>( device->GetNetDevice())->GetQueue())->GetNPackets() ;
}
while (!m_tx_queue[itt->first].IsEmpty() && !tokenwait && rate <25) {
int size = CT.drivers[node->GetId()]->getSize();
std::vector<TokenBucket*> buckets;
std::vector<double> tokens;
for (int i = 0; i < size; i++){
buckets.push_back(CT.drivers[node->GetId()]->getBucket(i));
tokens.push_back(buckets[i]->m_capacity);
if( buckets[i]->m_tokens.find( itt->first ) != buckets[i]->m_tokens.end() )
tokens[i] = buckets[i]->m_tokens[itt->first];
//std::cout<<tokens[i]<<" ";
}
//std::cout<<std::endl;
int choice = m_tx_queue[itt->first].SelectQueueToSend( tokens );
if( choice != -1 ) {
TokenBucket *sender = buckets[choice];
sender->hasFaces = true;
sender->consumeToken( TOKEN_REQUIRED, itt->first );
sender->m_need[itt->first] = 0;
// Dequeue the packet
struct QueueItem item = m_tx_queue[itt->first].DoDequeue( choice );
const shared_ptr<pit::Entry>* PE = &( item.pitEntry );
rate++;
switch( item.packetType ) {
case INTEREST:
interest.wireDecode( item.wireEncode );
prioritySendInterest( *( PE ), *( item.inface ), interest, ( *item.outface ) );
break;
case DATA:
//std::cout<<"prioritySend( DATA )\n";
data.wireDecode( item.wireEncode );
prioritySendData( *( PE ), *( item.inface ), data, ( *item.outface ) );
break;
case NACK:
//std::cout<<"prioritySend( NACK )\n";
interest.wireDecode( item.wireEncode );
nack = lp::Nack( interest );
prioritySendNack( *( PE ), *( item.inface ), nack );
break;
default:
//std::cout<<"prioritySend( Invalid Type )\n";
break;
}
}
else {
for (int i = 0; i < size; i++){
buckets[i]->m_need[itt->first] = m_tx_queue[itt->first].tokenReq(i);
}
tokenwait = true;
}
}
itt++;
}
}
L'erreur indiqué est :
Program received signal SIGSEGV, Segmentation fault. 0x00007ffff75178d9 in nfd::fw::QosStrategy::prioritySend (this=0x55555574ebd0) at ../src/ndnSIM/NFD/daemon/fw/qos-strategy.cpp:395 395 double token1 = CT.sender1[node->GetId()]->m_capacity;
Comment je dois le corriger
Merci
1 réponse
-
Bonjour,
Ton erreur vient probablement de la façon dont ton code utilise l'objet QosStrategy::prioritySend plutôt que du code de cet objet. Elle signifie que le programme tente d'accéder à une zone mémoire qui n'est pas allouée au programme.
Compile avec les informations de débogage (option -g avec gcc) et si tu es sous Linux, lance ton programme avec valgrind pour tracer l'erreur mémoire et remonter à son origine.
valgrind --leak-check=full --track-origins=yes --show-reachable=yes ./mon-programmeNote aussi que le code mentionné par le message d'erreur "double token1 = CT.sender1[node->GetId()]->m_capacity;" n'est pas ligne 395 de ce fichier https://github.com/nsol-nmsu/NFD-QoS/blob/38b7a27af36aa63e2ec17846332762adf9abd7d1/daemon/fw/qos-strategy.cpp
-
Note aussi que le code mentionné par le message d'erreur "double token1 = CT.sender1[node->GetId()]->m_capacity;" n'est pas ligne 395 de ce fichier https://github.com/nsol-nmsu/NFD-QoS/blob/38b7a27af36aa63e2ec17846332762adf9abd7d1/daemon/fw/qos-strategy.cppOui exactement ,c'est ca le bizarre, le fichier "qos-strategy.cpp" que je trouve suite à l'installation de projet , est différent de celui sur github.
Merci
-
Dal a écrit :
Ton erreur vient probablement de la façon dont ton code utilise l'objet QosStrategy::prioritySend plutôt que du code de cet objet. Elle signifie que le programme tente d'accéder à une zone mémoire qui n'est pas allouée au programme.
Compile avec les informations de débogage (option -g avec gcc) et si tu es sous Linux, lance ton programme avec valgrind pour tracer l'erreur mémoire et remonter à son origine.
valgrind --leak-check=full --track-origins=yes --show-reachable=yes ./mon-programmeJ'ai un problème avec la simulation avec valgrind. Ca ne marche pas !
Waf: Entering directory `/home/sa/NDN_QoS/ns-3/build' Waf: Leaving directory `/home/sa/NDN_QoS/ns-3/build' Build commands will be stored in build/compile_commands.json 'build' finished successfully (1m3.591s) +0.000000000s 0 ndn.Consumer:Consumer() +0.000000000s 7 ndn.Producer:Producer() +0.000000000s 0 ndn.Consumer:StartApplication() +0.000000000s 1 ndn.Consumer:Consumer() +0.000000000s 0 ndn.Consumer:SendPacket() +0.000000000s 0 ndn.Consumer:SendPacket(): [INFO ] > Interest for 0 +0.000000000s 0 ndn.Consumer:WillSendOutInterest(): [DEBUG] Trying to add 0 with +0.0ns. already 0 items terminate called after throwing an instance of 'std::invalid_argument' what(): stoi Command ['/NDN_QoS/ns-3/build/src/ndnSIM/examples/ns3-dev-ndn-congestion-alt-topo-plugin-debug'] terminated with signal SIGIOT. Run it under a debugger to get more information (./waf --run <program> --command-template="gdb --args %s <args>").Même la simulation normale voit des ruptures, comme ca :
-