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
- Accès à un pointeur invalide
- Acces rapide - Guide
- Accès refusé - Guide
- Je n'ai plus acces a ma boite mail gmail - Guide
- Pointeur souris - Guide
- Trousseau d'accès iphone - Guide
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-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
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
De même s'il s'agit d'une erreur zone mémoire , que puis-je faire.
Dal a écrit :
J'ai un problème avec la simulation avec valgrind. Ca ne marche pas !
Même la simulation normale voit des ruptures, comme ca :