Qt Creator调试器展开this变量卡顿及LLDB调试报错问题
this变量卡顿+LLDB调试信息报错的解决方案 你在Qt Creator里调试时展开this变量要等30秒才能恢复控制,同时LLDB日志里抛出DWARF类型解析错误,这个问题我之前也碰到过。结合你的环境(Qt 5.9.2/5.10.0调试版、Qt Creator 4.5.0、OSX 10.12.6),核心原因是调试信息不完整,导致LLDB在解析this包含的复杂类型(比如QObject相关成员)时需要跨模块耗时搜索,同时触发类型定义不完整的报错。
先看日志里的关键错误提示:
eERROR: Lldb stderr: error: PlaybackDevice.o DWARF DW_TAG_array_type DIE at 0x0000db86 has a class/union/struct element type DIE 0x0000db92 that is a forward declaration, not a complete definition. Try compiling the source file with -fno-limit-debug-info or disable -gmodule
这是Clang编译器默认的-gmodule选项限制了调试信息生成,导致LLDB无法获取完整的类型定义,进而引发卡顿和报错。下面是具体的解决步骤:
1. 添加-fno-limit-debug-info编译选项
打开Qt Creator的项目构建设置:
- 切换到"项目"面板,选择当前Debug模式的构建套件
- 找到"编译器"->"C++"->"附加参数",在输入框里添加
-fno-limit-debug-info - 如果项目包含C代码,同样在"C"->"附加参数"里也添加这个选项
这个选项会让编译器生成完整的调试信息,避免LLDB因为类型缺失而进行耗时的跨模块搜索。
2. 显式禁用-gmodule选项
很多Qt项目默认会启用-gmodule来优化调试信息大小,但这会导致类型定义不完整。你需要在项目构建配置里禁用它:
- 如果是QMake项目(
.pro文件),添加以下代码:QMAKE_CXXFLAGS -= -gmodule QMAKE_CFLAGS -= -gmodule - 如果是CMake项目(
CMakeLists.txt),添加:set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -gno-module") set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -gno-module")
3. 清理并重新全量构建项目
修改编译选项后,一定要先清理旧的构建产物:
- 在Qt Creator里点击"构建"->"清理项目"
- 然后点击"构建"->"构建项目"
旧的.o文件和调试信息不会自动更新,必须清理后重新生成,才能让新的编译选项生效。
4. 可选:调整调试器的显示设置
如果卡顿问题还有残留,可以试试调整Qt Creator的调试器设置:
- 打开"工具"->"选项"->"调试器"->"LLDB"
- 可以关闭"自动解引用指针"(不过你的日志里已经设置了
autoderef":1,关闭后可能减少一些解析工作) - 或者适当降低"字符串截断长度",减少调试器需要处理的文本量
另外你提到切换到Qt 5.10.0调试版后报错只是地址变化,本质问题还是调试信息不完整,所以上面的步骤对两个Qt版本都适用。
内容的提问来源于stack exchange,提问作者Martin Delille




