调试器故障排除

本节列出了一些可能遇到的典型问题和相应的解决方案。

无法启动调试器

一些防病毒应用程序不允许调试器检索数据。例如,在 Windows 上,如果开发计算机上安装了 Avira AntiVir,则启动调试器可能会失败,并显示以下消息:下级停止,因为操作系统发送了信号。信号名称:?信号含义:未知信号。

Avira AntiVir 桌面产品的一些版本在包括 Qt Creator 在内的各种开发环境中存在已知问题。为了解决这个问题,Avira 指令您更新到版本 avipbb.sys 10.0.22.22。有关更多信息,请参阅 自 2010-12-08 以来 IDE/调试器的受限可用性

在某些设备上,例如 Wacom 平板,运行进程可能会阻止调试器启动。停止所有正在运行的进程,然后重新启动调试器。

调试器没有触发断点

您可能创建了一个没有调试信息的产品构建版本。GNU 编译器集合(GCC)的调试构建在编译器命令行上具有 -g 选项。请检查 编译输出 中是否包含此选项。如果没有,请调整 项目 模式下的构建设置。

调试器功能不正常

如果调试器工作不正常,请尝试以下方法

  1. 确保您使用的是至少 Qt Creator 3.0.1
  2. 选择 )(运行)按钮,以验证 构建和运行工具箱选择器 选择了一个可运行的目标,并且您可以运行应用程序。
  3. 确保调试器已正确设置。设置
  4. 调试 模式下,前往 视图 > 视图 > 调试器日志 以打开 调试器日志 视图。浏览右侧窗口的内容,以找出错误所在。始终将窗口内容附加到与调试器相关的 Qt Creator 邮件列表([email protected])或粘贴到 代码粘贴服务,然后再在 IRC(在 Libera.Chat 的 #qt-creator 频道)中提问。

    注意:错误 135 通常意味着无法找到依赖的 DLL。

指针变量成员直接未显示

当您使用 局部变量表达式 视图来检查指针变量并展开变量树项时,将显示另一个树项级别。要直接显示指针变量的成员,请在 局部变量表达式 视图中的上下文菜单中选择 自动解引用指针

如果您根本无法查看变量,请检查是否已选择 调试 构建设置。

结构成员未按结构布局排序

默认情况下,结构成员按字母顺序显示。要检查内存中的实际布局,请在 局部变量表达式 视图中的上下文菜单中取消选择 按字母顺序排序类和结构体成员

内置调试器在启动和运行时很慢

与加载调试信息相关的缓慢很难避免。以下部分描述了一些可能的解决方案。

缓存 GDB 符号索引

当使用 GDB 作为后端时,您可以将它在磁盘上的缓存中自动保存一个符号索引的副本,并在将来加载相同的二进制文件时从这里检索它。前往 首选项 > 调试器 > GDB > 使用自动符号缓存

{GDB preferences}

最小化断点数量

一些调试缓慢来自维护调试器内的断点(在一些情况下,需要为每次步骤插入和删除所有断点)以及在每次步骤之后评估表达式。我们建议您最小化断点和监视表达式的数量。

清除构建

如果过时的 .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 中 在终端中运行 选项的尝试。

这种情况的原因在 KernelHardening 中有描述。

然而,这项安全措施的实用性似乎值得怀疑,因为此功能可以轻易地被禁用。使用root权限,您可以暂时通过将0写入/proc/sys/kernel/yama/ptrace_scope来禁用此功能,或者通过更改/etc/sysctl.d/10-ptrace.conf中的值永久禁用。即使没有提升的权限,您也可以通过添加调用prctl(0x59616d61, getppid(), 0, 0, 0);的库,例如$QTCREATORDIR/lib/libptracepreload.so,到LD_PRELOAD环境来稍后禁用该功能。

另见 如何:调试调试调试器调试程序

©本文档由2024 The Qt Company Ltd.编写,其中包含的文档贡献的版权属于各自的拥有者。所提供的文档受Free Software Foundation发布并受GNU自由文档许可协议版本1.3的条款约束。Qt及其相关标志是芬兰和/或其他国家/地区的The Qt Company Ltd的商标。所有其他商标均为其各自所有者的财产。