我正在调试 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_pattern
并spdlog::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。