Accès à un pointeur invalide

wella_salwa Messages postés 41 Date d'inscription lundi 31 octobre 2022 Statut Membre Dernière intervention 15 janvier 2025 - 14 janv. 2025 à 08:58
wella_salwa Messages postés 41 Date d'inscription lundi 31 octobre 2022 Statut Membre Dernière intervention 15 janvier 2025 - 15 janv. 2025 à 12:00

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

[Dal] Messages postés 6202 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 14 janvier 2025 1 097
Modifié le 14 janv. 2025 à 11:10

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-programme

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.cpp

0
wella_salwa Messages postés 41 Date d'inscription lundi 31 octobre 2022 Statut Membre Dernière intervention 15 janvier 2025
Modifié le 14 janv. 2025 à 11:18
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.cpp

Oui 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

0
wella_salwa Messages postés 41 Date d'inscription lundi 31 octobre 2022 Statut Membre Dernière intervention 15 janvier 2025
14 janv. 2025 à 11:31

De même s'il s'agit d'une erreur zone mémoire , que puis-je faire.

0
[Dal] Messages postés 6202 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 14 janvier 2025 1 097 > wella_salwa Messages postés 41 Date d'inscription lundi 31 octobre 2022 Statut Membre Dernière intervention 15 janvier 2025
Modifié le 14 janv. 2025 à 14:43

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-programme
0
wella_salwa Messages postés 41 Date d'inscription lundi 31 octobre 2022 Statut Membre Dernière intervention 15 janvier 2025 > [Dal] Messages postés 6202 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 14 janvier 2025
15 janv. 2025 à 12:00

J'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  :

0