项目

一般

简介

错误 #5335

logWriter 删除超出序号之外的文件挂死

席 振斌大约 8 小时 之前添加. 更新于 大约 7 小时 之前.

状态:
进行中
优先级:
一般
指派给:
开始日期:
2026-05-27
计划完成日期:
% 完成:

0%

预期时间:
问题归属:
LogWriter
发现问题版本:
Rel_3.3.2
目标解决问题版本:
Rel_3.3.2

历史记录

#1

席 振斌 更新于 大约 8 小时 之前

  • 状态新建 变更为 进行中
#2

席 振斌 更新于 大约 7 小时 之前

【问题原因】
代码逻辑有问题,当要删除的文件集合的map中的文件都被删除时,当 map 变空时,logFiles.rbegin() 返回的迭代器等同于 rend(),此时 while 条件中的 rit->first 会解引用一个无效的迭代器,导致未定义行为
std::map<uint16_t, std::string>::reverse_iterator rit = logFiles.rbegin();
while (rit->first > MAX_LOG_FILE_ID) {
if (std::remove(rit->second.c_str()) != 0) {
LOG_ERROR2("Deleting file failed, file: ", rit->second.c_str());
}
logFiles.erase(rit->first);
rit = logFiles.rbegin();
}
【修改方案】
进入while循环的判决条件修改为非空,如果列表为空时不进行删除;
while (!logFiles.empty()) {
std::map<uint16_t, std::string>::reverse_iterator rit = logFiles.rbegin();
if (rit->first <= MAX_LOG_FILE_ID) {
break;
}

if (std::remove(rit->second.c_str()) != 0)
    {
LOG_ERROR2("Deleting file failed, file: ", rit->second.c_str());
}
logFiles.erase(rit->first);
}

【回归方法和注意事项】
可以将某个模块的日志文件的序号手动改为>999的,后续此文件被删除,但是logwriter无挂死即可

合入版本:Rel_3.2.1_Pre3T2_20260527和下一个3.2.2版本

导出 Atom PDF