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

4.9 KiB
Raw Permalink Blame History

CSV加载闪退问题 - 完整修复报告

问题诊断

问题现象: "Load from CSV" 功能在加载CSV文件时导致程序闪退

环境: Windows 10, MINGW64, Qt GUI应用

根本原因

经过深入分析代码,确定主要原因为:

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

位置: examples/qt_gui_demo.cpp 第309行和第326行

问题:

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

在Windows MINGW环境下QString::toStdString() 对包含中文或特殊字符的路径转换不正确,导致:

  • 文件无法打开
  • 路径字符串损坏
  • 程序崩溃

解决方案:

// 使用toLocal8Bit()替代toStdString()
std::string filepath = filename.toLocal8Bit().constData();
custom_path_.loadFromCSV(filepath, true)

2. 单点路径处理不明确

位置: src/path_curve.cpp 第106-134行

问题: 当CSV文件只包含1个数据点时该点的theta和kappa未被明确处理

解决方案: 添加注释说明单点情况保持原值,避免混淆

3. 异常信息不够详细

位置: src/path_curve_custom.cpp 第48-52行

问题: 异常捕获时未记录详细错误信息

解决方案: 输出异常的what()内容以便诊断

已应用的修复

修复清单

文件1: examples/qt_gui_demo.cpp

  • 第309行: 使用 toLocal8Bit().constData() 替代 toStdString()
  • 第326行: 同上
  • 添加了解释性注释

文件2: src/path_curve.cpp

  • 第133行: 添加单点处理说明注释

文件3: src/path_curve_custom.cpp

  • 第49行: 捕获异常时获取详细信息
  • 第50行: 输出异常的 what() 内容

备份文件

所有原始文件已备份:

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

代码对比

修复前后对比

qt_gui_demo.cpp (第309行)

修复前:

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

修复后:

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

path_curve_custom.cpp (第49-50行)

修复前:

} catch (const std::exception&) {
    std::cerr << "Error parsing line " << line_num << ": " << line << std::endl;

修复后:

} catch (const std::exception& e) {
    std::cerr << "Error parsing line " << line_num << ": " << line << " (" << e.what() << ")" << std::endl;

下一步操作

⚠️ 重要:重新编译

注意: 当前 agv_qt_gui.exe 正在运行PID: 2996需要先关闭程序才能重新编译。

步骤1: 关闭程序

  • 方法A: 在任务管理器中结束 agv_qt_gui.exe 进程
  • 方法B: 在Windows命令提示符中运行: taskkill /F /IM agv_qt_gui.exe

步骤2: 重新编译

cd build
cmake --build . --config Release

步骤3: 测试修复

运行新编译的程序:

./build/Release/agv_qt_gui.exe

测试建议

修复后请测试以下场景(按优先级排序):

高优先级测试

  1. ✓ 加载包含中文路径的CSV文件最重要
  2. ✓ 加载存放在中文文件夹中的CSV文件
  3. ✓ 加载包含空格的路径

常规测试

  1. ✓ 加载只有2列x, y的CSV文件
  2. ✓ 加载完整4列x, y, theta, kappa的CSV文件
  3. ✓ 加载只有1个数据点的CSV文件

错误处理测试

  1. ✓ 加载空CSV文件只有header
  2. ✓ 加载格式错误的CSV文件
  3. ✓ 加载不存在的文件

技术说明

QString编码转换对比

方法 Windows行为 适用场景 问题
toStdString() 使用系统默认编码 纯ASCII路径 中文路径乱码或崩溃
toLocal8Bit().constData() 使用本地编码(GBK/ANSI) Windows文件路径 ✓ 正确处理中文
toUtf8().constData() 使用UTF-8编码 跨平台文本 Windows路径可能有问题

结论: 在Windows上处理文件路径时应使用 toLocal8Bit()

预期效果

修复后,程序应该:

  • ✓ 不再因路径问题而崩溃
  • ✓ 正确处理中文路径和特殊字符
  • ✓ 提供详细的错误信息如果CSV格式有问题
  • ✓ 更稳定的用户体验

文档索引

相关文档:

  1. FIX_SUMMARY.md - 详细修复总结
  2. CSV_LOAD_FIX.md - 修复方案详解
  3. BUILD_INSTRUCTIONS.md - 编译说明

技术支持

如果问题仍然存在,请检查:

  1. 是否已重新编译(非常重要!)
  2. CSV文件编码建议UTF-8 without BOM
  3. CSV格式是否正确逗号分隔至少2列数值
  4. 控制台是否有详细错误信息
  5. 文件是否被其他程序占用

修复日期: 2025-11-14 修复状态: 代码已修复,等待重新编译和测试 影响范围: CSV文件加载功能 风险评估: 低风险(仅修改字符串转换方式和添加注释)