0

我正在调试 C++ 代码,偶然发现 spdlog 的一个奇怪行为,其中跳过了一些调试和跟踪语句(我没有尝试过其他日志级别,但我怀疑它们会遇到同样的问题)。

这是有问题的代码片段:

spdlog::debug("About to go through all ({}) product keys", m_product_keys.size());
for(const auto& product_key : m_product_keys) {
    std::cerr << "aaaaaa" << std::endl;
    spdlog::trace("AAAAA");
    auto product_id = DataStoreImpl::buildProductID(descriptor, product_key);
    std::cerr << "bbbbb" << std::endl;
    spdlog::trace("BBBBB");
    product_ids.push_back(product_id);
    std::cerr << "ccccc" << std::endl;
    spdlog::trace("CCCCC");
    auto key_size = product_id.m_key.size();
    std::cerr << "dddd" << std::endl;
    spdlog::trace("DDDDD");
    packed_product_ids.resize(offset + key_size);
    std::cerr << "eeeeee" << std::endl;
    spdlog::trace("EEEEE");
    std::memcpy(const_cast<char*>(packed_product_ids.data() + offset),
                product_id.m_key.data(),
                 key_size);
    std::cerr << "fffff" << std::endl;
    spdlog::trace("FFFFF");
    spdlog::debug("Packing product id {}", product_id.m_key);
    offset += key_size;
    packed_product_id_sizes.push_back(key_size);
    std::cerr << "ggggg" << std::endl;
    spdlog::trace("GGGGG");
    count += 1;
}

我没有使用任何自定义 spdlog 接收器。spdlog 的唯一初始化是我调用它spdlog::set_patternspdlog::set_level在程序开始时进行的,所以一切都将输出到标准输出。

使用上面的代码,所有的行都会std::cerr正确打印到 stderr。但是spdlog::trace("DDDDD");会被跳过并且不会出现在日志中的任何位置。这是一个输出示例:

[000000|1] [11:22:49.790076386] [] [debug] About to go through all (1) product keys
aaaaaa
[000000|1] [11:22:49.790263651] [] [trace] AAAAA
bbbbb
[000000|1] [11:22:49.790292578] [] [trace] BBBBB
ccccc
[000000|1] [11:22:49.790381865] [] [trace] CCCCC
dddd
eeeeee
[000000|1] [11:22:49.790426474] [] [trace] EEEEE
fffff
[000000|1] [11:22:49.790616818] [] [trace] FFFFF
[000000|1] [11:22:49.790641377] [] [debug] Packing product id rec_hdr
ggggg
[000000|1] [11:22:49.790658171] [] [trace] GGGGG

如果我在打印循环之前删除打印到std::cerr, only BBBBB, CCCCC,EEEEE和 debug 语句。其他的都没有打印出来。输出示例:

[000000|1] [11:34:11.003675603] [] [debug] About to go through all (1) product keys
[000000|1] [11:34:11.003709340] [] [trace] BBBBB
[000000|1] [11:34:11.003712066] [] [trace] CCCCC
[000000|1] [11:34:11.003713430] [] [trace] EEEEE

我的程序是多线程的,但是这个代码部分是在一个线程中执行的,它是唯一调用 spdlog 的线程。

什么可能导致这样的 spdlog 语句被跳过?

我在 Debian 上使用 g++ 8.3.0 和 spdlog 1.8.1。

4

0 回答 0