2017-06-20 2 views
0

J'ai un projet qui utilise CORBA/ACE pour la connexion entre deux modules distribués et quand j'ai transféré ma solution de MSVS2008 à MSVS2015 j'ai rencontré une erreur de violation d'accès dans chaque utilisation de ACE_DEBUG fonction pour les journaux d'écriture de projet et quand je suivais le code, je trouve que l'erreur de pointeur nULL est avant cette partie du code:Erreur de violation d'accès dans le fichier de bibliothèque ace log_msg.cpp pour l'écriture des journaux de débogage

if (tracing) 
    this->start_tracing(); 

c'est Log_Msg.cpp qui est un fichier de bibliothèque ace . Voici le auj génère cette erreur en elle:

ssize_t 
ACE_Log_Msg::log (ACE_Log_Record &log_record, 
        int suppress_stderr) 
{ 
    ssize_t result = 0; 

    // Format the message and print it to stderr and/or ship it off to 
    // the log_client daemon, and/or print it to the ostream. Of 
    // course, only print the message if "SILENT" mode is disabled. 
    if (ACE_BIT_DISABLED (ACE_Log_Msg::flags_, 
         ACE_Log_Msg::SILENT)) 
    { 
     bool tracing = this->tracing_enabled(); 
     this->stop_tracing(); 

#if !defined (ACE_WIN32) 
     // Make this block signal-safe. 
     ACE_Log_Msg_Sig_Guard sb; 
#endif /* !ACE_WIN32 */ 

     // Do the callback, if needed, before acquiring the lock 
     // to avoid holding the lock during the callback so we don't 
     // have deadlock if the callback uses the logger. 
     if (ACE_BIT_ENABLED (ACE_Log_Msg::flags_, 
          ACE_Log_Msg::MSG_CALLBACK) 
      && this->msg_callback() != 0) 
     this->msg_callback()->log (log_record); 

     // Make sure that the lock is held during all this. 
     ACE_MT (ACE_GUARD_RETURN (ACE_Recursive_Thread_Mutex, ace_mon, 
           *ACE_Log_Msg_Manager::get_lock(), 
           -1)); 

     if (ACE_BIT_ENABLED (ACE_Log_Msg::flags_, 
          ACE_Log_Msg::STDERR) 
      && !suppress_stderr) // This is taken care of by our caller. 
     log_record.print (ACE_Log_Msg::local_host_, 
          ACE_Log_Msg::flags_, 
          stderr); 

     if (ACE_BIT_ENABLED (ACE_Log_Msg::flags_, ACE_Log_Msg::CUSTOM) || 
      ACE_BIT_ENABLED (ACE_Log_Msg::flags_, ACE_Log_Msg::SYSLOG) || 
      ACE_BIT_ENABLED (ACE_Log_Msg::flags_, ACE_Log_Msg::LOGGER)) 
     { 
      // Be sure that there is a message_queue_, with multiple threads. 
      ACE_MT (ACE_Log_Msg_Manager::init_backend()); 
     } 


     if (ACE_BIT_ENABLED (ACE_Log_Msg::flags_, ACE_Log_Msg::LOGGER) || 
      ACE_BIT_ENABLED (ACE_Log_Msg::flags_, ACE_Log_Msg::SYSLOG)) 
     { 
      result = 
      ACE_Log_Msg_Manager::log_backend_->log (log_record); 
     } 

     if (ACE_BIT_ENABLED (ACE_Log_Msg::flags_, ACE_Log_Msg::CUSTOM) && 
      ACE_Log_Msg_Manager::custom_backend_ != 0) 
     { 
      result = 
      ACE_Log_Msg_Manager::custom_backend_->log (log_record); 
     } 

     // This must come last, after the other two print operations 
     // (see the <ACE_Log_Record::print> method for details). 
     if (ACE_BIT_ENABLED (ACE_Log_Msg::flags_, 
          ACE_Log_Msg::OSTREAM) 
      && this->msg_ostream() != 0) 
     log_record.print (ACE_Log_Msg::local_host_, 
          ACE_Log_Msg::flags_, 
#if defined (ACE_LACKS_IOSTREAM_TOTALLY) 
          static_cast<FILE *> (this->msg_ostream()) 
#else /* ! ACE_LACKS_IOSTREAM_TOTALLY */ 
          *this->msg_ostream() 
#endif /* ! ACE_LACKS_IOSTREAM_TOTALLY */ 
         ); 

     if (tracing) 
     this->start_tracing(); 
    } 

    return result; 
} 

I utilisé __try/__ sauf et autres gestionnaires d'exception, mais je ne peux pas le résoudre. Je n'ai pas une telle erreur dans MSVS2008. peut-être que je devrais définir un paramètre ou ajouter un nouveau fichier mais je ne sais pas ce que c'est.

S'il vous plaît aidez-moi :(

Répondre

0

Vous avez explicitement initialiser la bibliothèque ACE. Lorsque vous avez un principal régulier() nous avons quelques macros faire. Vous avez probablement une principale spéciale, essayez d'appeler ACE::init(); au début de cela et ACE::fini(); à la fin. Voir ACE_wrappers/tests/ACE_Init_Test.cpp.

aussi, vous devez compiler ACE/TAO avec le compilateur Visual studio 2015. Peut-être mise à jour directement à Visual studio 2017, ce compilateur est pris en charge par ACE/TAO 6.4.3 /2.4.3.

+0

Merci pour votre réponse, mais ACE :: init() déjà ajouté à INITIALISA Une partie du projet que j'ai testée pour l'ajouter à d'autres endroits pour l'initialisation mais il y a encore le même problème. Est-il nécessaire d'ajouter ACE :: init() à d'autres parties? –

+0

J'ai dit dans ma question que nous n'avons pas une telle erreur pour MSVS2008 et depuis que nous avons transféré le projet à 2015, le problème a commencé !!! –

+0

Avez-vous recompilé ACE/TAO en utilisant msvc2015? –