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 :(
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? –
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é !!! –
Avez-vous recompilé ACE/TAO en utilisant msvc2015? –