用于写入调试日志的 ace log_msg.cpp 库文件中的访问冲突错误
Access violation error in ace log_msg.cpp library file for writing debug logs
我有一个项目使用 CORBA/ACE 连接两个分布式模块,当我将我的解决方案从 MSVS2008 转移到 MSVS2015 时,我在每次使用 [=25 时都遇到访问冲突错误=] 用于写入项目日志的函数,当我按照代码进行操作时,我发现空指针错误在这部分代码之前:
if (tracing)
this->start_tracing ();
这个在Log_Msg.cpp里面,是ace库的一个文件。这是错误在其中生成的功能:
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;
}
我用了__try/__except和其他异常处理程序,但我无法解决它。我在 MSVS2008 中没有这样的错误。也许我应该设置一些设置或添加新文件,但我不知道它是什么。
请帮帮我:(
您必须明确初始化 ACE 库。当你有一个常规的 main() 时,我们有一些宏可以做到这一点。可能你有一些特殊的 main,尝试在开始时调用 ACE::init();
,在结束时调用 ACE::fini();
。参见 ACE_wrappers/tests/ACE_Init_Test.cpp
。
您还必须使用 Visual Studio 2015 编译器编译 ACE/TAO。也许直接升级到 Visual Studio 2017,ACE/TAO 6.4.3/2.4.3.
支持该编译器
我有一个项目使用 CORBA/ACE 连接两个分布式模块,当我将我的解决方案从 MSVS2008 转移到 MSVS2015 时,我在每次使用 [=25 时都遇到访问冲突错误=] 用于写入项目日志的函数,当我按照代码进行操作时,我发现空指针错误在这部分代码之前:
if (tracing)
this->start_tracing ();
这个在Log_Msg.cpp里面,是ace库的一个文件。这是错误在其中生成的功能:
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;
}
我用了__try/__except和其他异常处理程序,但我无法解决它。我在 MSVS2008 中没有这样的错误。也许我应该设置一些设置或添加新文件,但我不知道它是什么。
请帮帮我:(
您必须明确初始化 ACE 库。当你有一个常规的 main() 时,我们有一些宏可以做到这一点。可能你有一些特殊的 main,尝试在开始时调用 ACE::init();
,在结束时调用 ACE::fini();
。参见 ACE_wrappers/tests/ACE_Init_Test.cpp
。
您还必须使用 Visual Studio 2015 编译器编译 ACE/TAO。也许直接升级到 Visual Studio 2017,ACE/TAO 6.4.3/2.4.3.
支持该编译器