【问题标题】:Debug Assertion Fails When Trying to Write to Log4cpp Stream尝试写入 Log4cpp 流时调试断言失败
【发布时间】:2013-04-12 13:22:10
【问题描述】:

我正在尝试通过以下方式使用 log4cpp 启用日志记录。

class Foo
{
    private: 
        log4cpp::Appender* _logAppender;
        log4cpp::Layout* _logAppenderLayout;
}

Foo::Foo()
{
    _logAppender = new log4cpp::FileAppender("foo", "logs/bar.log"));
    _logAppenderLayout = new log4cpp::BasicLayout();
    _logAppender.setLayout(_logAppenderLayout);
    log4cpp::Category::getRoot().setPriority(log4cpp::Priority::DEBUG);
    log4cpp::Category::getRoot().addAppender(_logAppender);

    // Crash on line below.
    log4cpp::Category::getRoot().debugStream() << "test";
}

当我到达尝试将“测试”写入日志的行时,我遇到了一个崩溃,显示“调试断言失败!”断言在 f:\dd\vctools\crt_bld_self_64_amd64\crt\src\write.c 第 67 行。失败的断言是

fh >= 0 && (unsigned)fh < (unsigned)_nhandle

我已经创建了日志目录和 bar.log 文件以确保它存在。我还确认我的应用程序和库都是作为 64 位多线程调试 DLL 构建的。 log4cpp 源中没有 64 位构建,所以我基于 32 位构建配置创建了一个。我正在使用最新版本的 log4cpp。

【问题讨论】:

  • 也许 log4cpp 需要的不仅仅是 64 位版本的配置更改。例如,指针和 HANDLE 大小有很多问题需要担心。
  • 我想可能是这样。我现在正在研究其他日志记录框架,但希望在 64 位应用程序中使用过 log4cpp 的人能看到这一点。
  • 对于遇到此问题的任何人,我都无法使其正常工作。我的解决方案是转到 google-glog code.google.com/p/google-glog。它没有内置的 64 位配置,但很容易创建。

标签: c++ visual-c++ crash log4cpp


【解决方案1】:

这是旧帖子,但我想这个问题的解决方案可能对某人有用。

很可能您只是忘记在您的代码中创建目录“logs”

这是关闭流的问题:记录器不会为您的日志自动创建目录,因此,没有目录 -> 没有文件 -> 打开文件失败 -> 文件处理程序无效 -> 异常。您应该手动创建目录。宏断言和没有更多信息是可悲的。

【讨论】:

  • 我手动创建了日志目录和日志文件以确保,但仍然出现崩溃。 32位没有问题。尽管我发现了我知道可以工作的 64 位 log4cxx 二进制文件,但我很快就会重新讨论这个问题。这意味着我不必弄清楚我的构建出了什么问题。
  • 好的,对不起。可能您的问题有另一个目标,奇怪的是我们有两个相同的错误,原因不同。对不起,但是我建议将“logs/bar.log”替换为“bar.log”以进行测试。
  • 我试过了,没有任何区别。此外,我的方式在 32 位版本上运行良好。
【解决方案2】:

刚刚发现了这个问题并试图得到这个断言。 我已经在 MSVC2010 中构建了 log4cpp (ver 1.1) 库和 user1229080 对 Win32 和 x64 平台的测试,并且没有得到任何断言。

我添加了几行来编译它,并从文件路径中删除了“logs”目录,只是为了摆脱与缺少目录相关的问题:

#include "stdafx.h"

#include <log4cpp/Category.hh>
#include <log4cpp/FileAppender.hh>
#include <log4cpp/OstreamAppender.hh>
#include <log4cpp/BasicLayout.hh>

class Foo
{
    private:
        log4cpp::Appender* _logAppender, *_conAppender;
        log4cpp::Layout* _logAppenderLayout;
    public:
        Foo();
};

Foo::Foo()
{
    _conAppender = new log4cpp::OstreamAppender("con", &std::cout);
    _logAppender = new log4cpp::FileAppender("foo", "bar.log");
    _logAppenderLayout = new log4cpp::BasicLayout();
    _logAppender->setLayout(_logAppenderLayout);

    log4cpp::Category::getRoot().setPriority(log4cpp::Priority::DEBUG);
    log4cpp::Category::getRoot().addAppender(_logAppender);
    log4cpp::Category::getRoot().addAppender(_conAppender);


    // Crash on line below. (but not in msvc2010)
    log4cpp::Category::getRoot().debugStream() << "test" << log4cpp::eol;
}

int main(int argc, char* argv[]) {
    Foo f;

    return 0;
}

您在哪个版本的 Visual c++ 上遇到了断言?

【讨论】:

    猜你喜欢
    • 2011-11-29
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    相关资源
    最近更新 更多