简体   繁体   English

ace log_msg.cpp库文件中的访问冲突错误,用于写入调试日志

[英]Access violation error in ace log_msg.cpp library file for writing debug logs

I have a project that use CORBA/ACE for connection between two distributed module and when I transfered my solution from MSVS2008 to MSVS2015 I faced with access violation error in every use of ACE_DEBUG function for write logs of project and when I followed code I find that the null pointer error is before this part of code: 我有一个使用CORBA / ACE在两个分布式模块之间进行连接的项目,当我将解决方案从MSVS2008转移到MSVS2015时,每次使用ACE_DEBUG函数写入项目日志时都遇到访问冲突错误,当我遵循代码时,我发现空指针错误在这部分代码之前:

if (tracing)
    this->start_tracing ();

this is in Log_Msg.cpp that is a file of ace library. 这在ace库文件Log_Msg.cpp中。 Here is the fuction that error generates in it: 这是错误产生的功能:

    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 used __try/__except and other exception handlers but I can't solve it. 我使用了__try / __ except和其他异常处理程序,但无法解决。 I don't have such error in MSVS2008. 我在MSVS2008中没有这样的错误。 maybe I should set some setting or add new file but I don't know what it is. 也许我应该设置一些设置或添加新文件,但我不知道它是什么。

Please help me :( 请帮我 :(

You explicitly have to initialize the ACE library. 您必须显式初始化ACE库。 When you have a regular main() we have some macros doing that. 当您有一个常规的main()时,我们会有一些宏在执行此操作。 Probably you have some special main, try to call ACE::init(); 可能您有一些特殊的main,尝试调用ACE::init(); at the start of that and ACE::fini(); 在开头和ACE::fini(); at the end. 在末尾。 See ACE_wrappers/tests/ACE_Init_Test.cpp . 参见ACE_wrappers/tests/ACE_Init_Test.cpp

Also you have to compile ACE/TAO with the Visual Studio 2015 compiler. 另外,您还必须使用Visual Studio 2015编译器编译ACE / TAO。 Maybe upgrade directly to Visual Studio 2017, that compiler is supported by ACE/TAO 6.4.3/2.4.3. 也许直接升级到Visual Studio 2017,该编译器受ACE / TAO 6.4.3 / 2.4.3支持。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM