调试器故障排除
本节列出了调试时可能遇到的一些典型问题及其解决方案。
无法启动调试器
某些反病毒应用程序不允许调试器检索数据。例如,在 Windows 上,如果开发计算机上安装了 Avira AntiVir,启动调试器可能会失败,并显示以下消息:调试进程因收到来自操作系统的信号而停止。信号名称:?未知信号。
某些版本的 Avira AntiVir 桌面产品在各种开发环境中存在已知问题,包括Qt Creator 。要解决该问题,Avira 建议您更新至avipbb.sys 10.0.22.22
版本。有关详细信息,请参阅自 2010-12-08 起 IDE/调试器的可用性受限。
在某些设备(如 Wacom 平板电脑)上,正在运行的进程可能会阻止调试器启动。请停止所有正在运行的进程,然后重新启动调试器。
调试器未命中断点
您可能创建了一个没有调试信息的发行版。GNU 编译器集 (GCC) 调试构建在编译器命令行上有-g
选项。检查编译输出中是否有该选项。如果没有,请在Projects 模式下调整编译设置。
调试器不工作
如果调试器无法正常工作,请尝试以下方法:
- 确保至少使用Qt Creator 3.0.1
- 选择
(Run),检查构建和运行工具包选择器是否选中了一个可运行的目标,并且可以运行应用程序。
- 确保调试器设置正确。
- 在Debug 模式下,转到View >Views >Debugger Log 打开调试器日志视图。浏览右侧窗格的内容,找出出错的原因。在 IRC(Libera.Chat 上的 #Qt Creator 频道)提问前,请务必将窗格内容附加到调试器相关问题的Qt Creator 邮件列表 (qt-creator@qt-project.org) 或粘贴到代码粘贴服务。
注意: 错误 135 通常意味着找不到依赖的 DLL。
无法直接显示指针变量成员
使用Locals 和Expressions 视图检查指针变量并展开变量树项时,会显示另一个树项层。要直接显示指针变量的成员,请在Locals 和Expressions 视图的上下文菜单中选择Dereference Pointers Automatically 。
如果根本无法查看变量,请检查是否选择了调试构建配置。
结构成员未按结构布局排序
默认情况下,结构成员按字母顺序显示。要检查内存中的真实布局,请在Locals 和Expressions 视图的上下文菜单中清除Sort Members of Classes and Structs Alphabetically 。
内置调试器在启动和运行时速度很慢
与加载调试信息有关的慢很难避免。下文将介绍一些可能的解决方案。
缓存 GDB 符号索引
使用 GDB 作为后端时,可以自动将其符号索引的副本保存在磁盘缓存中,并在将来加载相同二进制文件时从中检索。请转至首选项>Debugger >GDB >Use automatic symbol cache 。
尽量减少断点数量
有些调试速度较慢的原因是在调试器内维护断点(在某些情况下,每一步都需要插入和移除所有断点)以及每一步后对表达式进行评估。我们建议尽量减少断点和观察表达式的数量。
清理编译
如果过时的 .pdb 文件导致调试速度变慢,请尝试清理构建。
禁用增量链接
增量链接会影响调试。如果调试器日志视图显示 "无法验证模块的校验和"信息,请禁用增量链接。
使用 CMake 作为联编系统时,在项目 CMakeLists.txt 文件中添加以下一行:
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /INCREMENTAL:NO" )
使用 qmake 作为联编系统时,在项目 .pro 文件中添加以下一行:
QMAKE_LFLAGS_DEBUG += /INCREMENTAL:NO
调试器无法连接到 Linux 上运行的进程
GDB 使用ptrace
来连接运行中的进程。某些 Linux 发行版不允许这样做,这就阻止了所有直接附加到现有进程或使用Qt Creator 中的Run in terminal 选项的尝试。
内核加固(KernelHardening)中描述了这样做的原因。
不过,这一安全措施的实用性似乎值得怀疑,因为这一功能很容易被禁用。使用 root 权限,可以通过将0
写入/proc/sys/kernel/yama/ptrace_scope
来临时禁用该功能,或者通过更改/etc/sysctl.d/10-ptrace.conf
中的值来永久禁用该功能。即使权限不高,以后也可以通过在 LD_PRELOAD 环境中添加一个调用prctl(0x59616d61, getppid(), 0, 0, 0);
的库,如$QTCREATORDIR/lib/libptracepreload.so
中的库,来禁用该功能。
Copyright © The Qt Company Ltd. and other contributors. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.