Files
agv-control-slam/docs/fixes/FIX_SUMMARY.md
CaiXiang af65c2425d initial
2025-11-14 16:09:58 +08:00

3.9 KiB
Raw Blame History

CSV加载闪退问题修复总结

修复完成时间

2025-11-14

问题描述

"Load from CSV" 功能在加载CSV文件时导致程序闪退

根本原因分析

经过详细代码审查,发现以下问题:

  1. Windows路径编码问题(主要原因)

    • examples/qt_gui_demo.cpp 中使用 QString::toStdString() 转换文件路径
    • 在Windows MINGW环境下当文件路径包含中文或特殊字符时这种转换会产生错误的编码
    • 导致文件无法正确打开或程序崩溃
  2. 单点路径处理不完整

    • src/path_curve.cppsetPathPoints 函数中单点情况下theta和kappa未明确处理
    • 虽然不会直接导致崩溃,但可能引发后续问题
  3. 异常信息不够详细

    • CSV解析异常信息不够详细难以定位问题

已应用的修复

修复1: Windows路径编码问题

文件: examples/qt_gui_demo.cpp

  • 第309行: 将 filename.toStdString() 改为 filename.toLocal8Bit().constData()
  • 第326行: 将 filename.toStdString() 改为 filename.toLocal8Bit().constData()
  • 效果: 正确处理Windows路径包括中文路径和特殊字符

修复2: 改进单点路径处理

文件: src/path_curve.cpp

  • 第133行: 添加注释说明单点情况的处理逻辑
  • 效果: 明确单点情况下保持原有theta和kappa值避免越界访问

修复3: 改进异常处理

文件: src/path_curve_custom.cpp

  • 第49行: 将 catch (const std::exception&) 改为 catch (const std::exception& e)
  • 第50行: 错误消息中添加 e.what() 以显示详细异常信息
  • 效果: 提供更详细的错误诊断信息

修改的文件列表

  1. examples/qt_gui_demo.cpp - 修复路径编码问题
  2. src/path_curve.cpp - 改进单点处理
  3. src/path_curve_custom.cpp - 改进异常处理

备份文件

所有修改前的文件已备份:

  • examples/qt_gui_demo.cpp.backup
  • src/path_curve.cpp.backup
  • src/path_curve_custom.cpp.backup

下一步操作

需要重新编译项目以应用这些修复:

cd build
# 清理旧的构建(可选)
cmake --build . --target clean

# 重新构建Release版本
cmake --build . --config Release

# 或者构建Debug版本用于调试
cmake --build . --config Debug

测试建议

修复后建议测试以下场景:

  1. ✓ 加载包含中文路径的CSV文件
  2. ✓ 加载纯英文路径的CSV文件
  3. ✓ 加载只有2列x, y的CSV文件
  4. ✓ 加载完整4列x, y, theta, kappa的CSV文件
  5. ✓ 加载只有1个数据点的CSV文件
  6. ✓ 加载空的CSV文件只有header
  7. ✓ 加载格式错误的CSV文件测试错误处理

技术细节

QString::toLocal8Bit() vs toStdString()

  • toStdString(): 使用系统默认编码在Windows上可能导致编码问题
  • toLocal8Bit(): 使用本地8位编码Windows上是ANSI/GBK更适合处理文件路径
  • .constData(): 返回const char*指针可以直接用于std::string构造

修复的关键代码对比

修复前:

if (custom_path_.loadFromCSV(filename.toStdString(), true)) {

修复后:

// 修复: 使用toLocal8Bit以正确处理Windows路径包括中文路径
if (custom_path_.loadFromCSV(filename.toLocal8Bit().constData(), true)) {

预期效果

修复后,程序应该能够:

  1. 正确加载包含中文路径的CSV文件
  2. 正确处理各种格式的CSV文件2列、3列、4列
  3. 在遇到错误时显示详细的错误信息而不是直接崩溃
  4. 提供更好的用户体验和错误提示

附加说明

如果问题仍然存在,可以检查以下内容:

  1. CSV文件编码是否为UTF-8建议使用UTF-8 without BOM
  2. CSV文件格式是否正确逗号分隔每行至少2个数值
  3. 查看控制台输出的详细错误信息
  4. 检查是否有其他程序占用文件