【问题标题】:Logger::getInstance causing bad_alloc exception in log4cplusLogger::getInstance 在 log4cplus 中导致 bad_alloc 异常
【发布时间】:2018-04-16 02:09:32
【问题描述】:

我正在尝试使用 log4cplus 在 C++ 应用程序中实现日志记录。我能够成功构建/链接(我将 log4cplus.lib 添加到我的其他库中并将 log4cplus.dll 复制到构建/outdir)

当我运行我的应用程序时,当它执行我的 Logger::getInstance 调用时出现以下异常:

LogTesterConsole.exe 中 0x75cad36f 处的未处理异常:Microsoft C++ 异常:内存位置 0x0013ed8c 处的 std::bad_alloc..

我尝试将调用放在我的 main() 例程之外以及内部,并得到相同的结果。

有什么想法吗?

代码:-

 #include "stdafx.h"
 #include <log4cplus/logger.h>
 #include <log4cplus/loggingmacros.h>
 #include <log4cplus/configurator.h>
 using namespace log4cplus;
 int _tmain(int argc, _TCHAR* argv[])
 { 
   BasicConfigurator config;
   config.configure();
   Logger logger = Logger::getInstance(LOG4CPLUS_TEXT("main"));
   LOG4CPLUS_WARN(logger, LOG4CPLUS_TEXT("Hello, World!"));
   return 0;
 }

【问题讨论】:

  • 头文件路径中不要使用反斜杠,而是使用斜杠
  • @Josh:我是 log4cplus 的维护者。请尝试在调试器下的 Visual Studio 中运行它,看看哪里抛出了异常。
  • @wilx:跟踪到 PropertyConfigurator::doConfigure 调用,它看起来像是在 PropertyConfigurator 构造函数中向南走(带有 'const tstring& propertyFile' arg 签名的那个)看起来它发生在 std: :basic_string::assign。从构造函数看propertyFile arg的值,好像是乱码。
  • 仅供参考:我在 Win7 上,使用 VS2010。我从 VS 解决方案构建了 log4cplus,没有修改任何项目设置。
  • 我能够从 log4cplus 解决方案成功地运行调试测试(虽然我得到了“无法打开文件 log4cplus.properties”的错误,这是我的预期)我一直在梳理差异和还没有发现任何感兴趣的东西。

标签: c++ windows runtime-error log4cplus


【解决方案1】:

如果您在调试中构建应用程序,请务必链接到 lib4CplusD.lib 和 lib4CplusD.dll。同样,发布应用程序应该链接 aginst lib4cplus.lib 和 lib4cplus.dll 我遇到了相同的运行时错误,当我将调试应用程序与调试库链接时,问题得到了解决。

【讨论】:

    【解决方案2】:

    尝试:-

    int _tmain(int argc, _TCHAR* argv[])
     { 
       PropertyConfigurator::doConfigure(LOG4CPLUS_TEXT("log4cplus.properties"));
       Logger root = Logger::getRoot();
       try{
       Logger logger = Logger::getInstance(LOG4CPLUS_TEXT("main"));
        }
       catch(...) {
            cout << "Exception..." << endl;
            LOG4CPLUS_FATAL(root, "Exception occured...");
        }
       LOG4CPLUS_WARN(logger, LOG4CPLUS_TEXT("Hello, World!"));
       return 0;
     }
    

    【讨论】:

    • 我尝试了你建议的代码(有一个轻微的 mod,在 TRY 块之外声明'logger'),现在是 doConfigure 行失败了,它是同样的错误 (bad_alloc)
    • 我的调试工作文件夹中有一个 log4cplus.properties 文件作为参考。
    • 另一个仅供参考:无论使用 log4cplus-1.1.0-rc8 还是 log4cplus-1.0.4.1,我都会得到相同的行为
    • 你试过调试???...可能还有其他问题...不过我建议添加。#include &lt;log4cplus/helpers/loglog.h&gt; #include &lt;log4cplus/helpers/stringhelper.h&gt;
    • 我正在从调试器运行,是的。很难想象添加额外的头文件会改变运行时行为。
    【解决方案3】:

    我知道这篇文章有点老了,但是当我昨天开始尝试 log4cplus v2.0.0 时遇到了完全相同的问题。

    简短的回答:这是一个调试/发布构建问题。

    现在为任何人提供更长的答案:

    • 我下载了log4cplus最新稳定版(v2.0.0)here
    • 我使用 VS2017 在./log4cplus-2.0.0/msvc14 中打开了 Visual Studio Soultuin,并制作了log4cplus-Project(Windows SDK v10.0.16299.0;平台工具集 v141)的发布版本(unicode)。一切正常。
    • 我制作了一个新的示例 C++-Solution 来试用之前构建的 log4cplus。
    • 使用 log4cplus 的设置:
      • log4cplusU.lib 添加为链接器的附加依赖项
      • log4cplusU.dll添加到输出目录
      • ./log4cplus-2.0.0/include 中的所有内容添加到其他包含中
    • 对示例解决方案进行调试构建 (x86)。一切正常。
    • 构建解决方案后,我点击“运行”查看是否一切正常。

    现在,我遇到了与@Josh 在他最初的帖子中描述的完全相同的问题。现在实际的问题是,我制作了 log4cplus 的发布版本,但在我自己的应用程序的调试版本中使用了这个发布版本。

    考虑到这一点,我制作了自己的应用程序的发布版本,一切都像魅力一样运行!

    我将完整的 VS2017 解决方案推送到我的 GitHub-repo,因此您可以“动手”重现问题。只需将此解决方案的配置更改为“调试”(x86)并观察它在运行时产生异常。将其更改为“Release”(x86)并观察它是否按预期工作!

    【讨论】:

      猜你喜欢
      • 2012-02-13
      • 1970-01-01
      • 1970-01-01
      • 2017-05-23
      • 1970-01-01
      • 1970-01-01
      • 2020-04-09
      • 2019-06-22
      • 1970-01-01
      相关资源
      最近更新 更多