本页内容

表达式求值

若要访问“局部变量”视图中不可见的全局数据,或计算算术表达式或函数调用的值,请在“Expressions ”视图中使用表达式求值器。

例如,如果您在源文件中定义了static int staticVar = 42; ,然后将staticVar 作为已求值表达式添加,当调试器在源文件中暂停时,您应该会在视图中看到42

您还可以将表达式评估器用作访问“局部变量树”中深层项的快捷方式。

表达式视图

添加表达式评估器

要添加表达式评估器,请将表达式从代码编辑器拖动到“Expressions ”视图中。

您还可以:

  • 在“Expressions ”或“Locals ”视图中双击。
  • 从上下文菜单中选择“Add New Expression Evaluator ”。

在“New Evaluated Expression ”对话框中输入表达式:

“新求值表达式”对话框

已求值的表达式集合将保存在您的会话中。

每当当前帧发生变化时,表达式求值器都会重新进行求值。表达式中使用的函数每次都会被调用,即使这些函数具有副作用。

注意: 表达式求值速度 较慢,因此使用后请移除表达式求值器。

JavaScript 表达式

QML 调试器可以求值 JavaScript 表达式。

C 和 C++ 表达式

CDB、GDB 和 LLDB 支持对简单的 C 和 C++ 表达式进行求值,例如由简单值和指针组成的算术表达式。

根据后端和具体位置的不同,某些函数调用可以被求值。在这方面,CDB 是限制最多的后端。

函数调用

只有当函数实际编译到被调试的可执行文件或该可执行文件使用的库中时,才能调用这些函数。内联函数(例如大多数标准容器的operator[] 实现)通常不可用

注意:当 表达式中包含函数调用,可能会发生任何情况,包括应用程序状态的损坏,或利用应用程序的权限执行任意操作。

范围语法

当使用 GDB 或 LLDB 作为后端时,您可以使用特殊的范围语法,通过一个表达式显示多个值。形式为foo[a..b] 的子表达式会被拆分为一系列分别求值的表达式foo[a], ..., foo[b]

复合变量

您可以展开 struct 或 class 类型的复合变量以显示其成员。由于同时能看到变量的值和类型,因此可以检查并遍历对象数据的底层布局。

优化构建

GDB 和 LLDB(以及由此派生的Qt Creator 调试器)同样适用于 Linux 和 macOS 上的优化构建。优化可能会导致指令重新排序或某些局部变量被移除,从而导致LocalsExpressions 视图显示出意料之外的数据。

GCC

GCC 生成的调试信息中,关于变量初始化时机的信息不够充分。因此,Qt Creator 无法判断局部变量的内容是真实数据还是初始噪声。如果某个QObject 显示为未初始化,其值将被报告为not in scope 。不过,并非所有未初始化的对象都能被识别出来。

“表达式”视图操作

右键单击“Expressions ”视图以选择以下操作:

  • 添加和移除表达式求值器
  • 更改值显示格式
  • 展开和折叠视图内容
  • 将视图内容或表达式值复制到剪贴板
  • 在编辑器中打开视图内容
  • 打开内存编辑器
  • 设置数据断点
  • 使用调试辅助工具
  • 在调试时显示和隐藏视图中的工具提示
  • 自动解引用指针
  • 按字母顺序对类和结构体的成员进行排序
  • 使用动态对象类型进行显示
  • 设置调试器首选项

另请参阅 《如何:调试》、《调试》和《调试器》。

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.