调试QML应用程序

提供有关如何使用QML调试工具的信息。

当你使用QML开发应用程序时,有许多方法可以调试你可能遇到的问题。以下部分描述了可用的调试工具以及如何使用它们。

控制台 API

特性

描述

日志

使用 console.log, console.debug, console.info, console.warn, 或 console.error 将调试信息打印到控制台。

例如:

function f(a, b) {
  console.log("a is ", a, "b is ", b);
}

输出是使用 C++ 中的 qCDebug、qCWarning 或 qCCritical 方法生成的,类别为 qmljs,具体取决于执行日志记录的文件类型。另请参阅 调试技术

Assert

console.assert 测试一个表达式是否为真。如果不是,它会将一个可选的消息写入控制台并打印堆栈跟踪。

例如:

function f() {
  var x = 12
  console.assert(x == 12, "This will pass");
  console.assert(x > 12, "This will fail");
}

计时器

console.timeconsole.timeEnd 记录调用之间所花费的时间(以毫秒为单位)。两者都接受一个字符串参数来标识测量。

例如:

function f() {
    console.time("wholeFunction");
    console.time("firstPart");
    // 第一部分
    console.timeEnd("firstPart");
    // 第二部分
    console.timeEnd("wholeFunction");
}

追踪

console.trace 打印出在调用时JavaScript执行的堆栈跟踪。这个堆栈跟踪信息包含函数名、文件名、行号和列号。堆栈跟踪仅限于最后10个堆栈帧。

计数

console.count 打印当前特定代码段运行的次数,并附带一条消息。

例如:

function f() {
  console.count("f called");
}

上面的代码示例在每次运行 f() 时打印 f called: 1, f called: 2

配置文件

console.profile 开启QML和JavaScript的性能分析器。不支持嵌套调用,并在控制台中打印警告。

ProfileEnd

console.profileEnd 关闭 QML 和 JavaScript 分析器。在没有先调用 console.profile 的情况下调用此函数会在控制台中打印警告。在此调用之前需要附加一个分析客户端以接收和存储分析数据。

例如:

function f() {
    console.profile();
    //调用一些需要进行分析的函数。
    //确保在结束分析会话之前附加了客户端。
    console.profileEnd();
}

异常

console.exception 打印错误信息以及调用时JavaScript执行的堆栈跟踪。

或者,可以将日志类别作为第一个参数传递给任何这些console函数。有关更多详细信息,请参阅LoggingCategory。

调试模块导入

设置 QML_IMPORT_TRACE 环境变量以启用 QML 导入加载机制的调试输出。

例如,对于一个像这样的简单QML文件:

如果你在运行QML Runtime Tool或你的QML C++应用程序之前设置了QML_IMPORT_TRACE=1,你将会看到类似以下的输出:

QQmlImportDatabase::addImportPath "/qt-sdk/imports"
QQmlImportDatabase::addImportPath "/qt-sdk/bin/QMLViewer.app/Contents/MacOS"
QQmlImportDatabase::addToImport 0x106237370 "." -1.-1 File as ""
QQmlImportDatabase::addToImport 0x106237370 "Qt" 4.7 Library as ""
QQmlImportDatabase::resolveType "Rectangle" = "QDeclarativeRectangle"

QML调试基础设施

Qt Qml 模块通过 TCP 端口或本地套接字提供调试、检查和性能分析应用程序的服务。

注意

在Qt安装过程中,会自动安装用于在设备上调试和分析QML应用程序所需的qmltooling插件。必须将这些插件部署到设备上,才能使调试和分析功能正常工作。

启用基础设施

当你编译你的应用程序时,你必须明确启用调试基础设施。如果你使用qmake,你可以将配置参数添加到项目的.pro文件中:

  • Qt Quick 1: CONFIG+=declarative_debug

  • Qt Quick 2: CONFIG+=qml_debug

如果您使用其他构建系统,可以将以下定义传递给编译器:

  • Qt Quick 1: QT_DECLARATIVE_DEBUG

  • Qt Quick 2: QT_QML_DEBUG

注意

启用调试基础设施可能会损害您的应用程序和系统的完整性,因此,您应仅在受控环境中启用它。当基础设施启用时,应用程序会显示以下警告:

QML 调试 已启用。 仅在安全环境中使用此功能。

启动应用程序

要启用调试——无论是从一开始还是稍后附加调试器——请使用以下参数启动应用程序:

-qmljsdebugger=port:[,port_to][,host: address>][,block][,file: socket>][,services: list of services to enable>]

其中:

  • 强制性的 port_from 指定调试端口或当指定 port_to 时的端口范围的起始端口

  • 可选的 ip address 指定了应用程序运行的主机的IP地址

  • 可选的 block 防止应用程序在调试客户端连接到服务器之前运行

  • 可选的 file 指定本地套接字。

  • 可选的 services 指定要启用的服务;默认情况下会启用所有找到的服务。请注意,v4 debug 服务会禁用 JIT。

应用程序成功启动后,显示以下消息:

QML 调试器: 正在等待 连接 端口 QML 调试器: 正在连接 套接字 "

连接到应用程序

当应用程序运行时,实现二进制协议的IDE或工具可以连接到开放的端口。

Qt 提供了一个 qmlprofiler 命令行工具来捕获分析数据到文件中。要运行此工具,请输入以下命令:

qmlprofiler -p -attach address>

使用Qt Creator进行调试

Qt Creator 使用调试基础设施来调试、检查和分析桌面以及远程设备上的 Qt Quick 应用程序。Qt Creator 提供了集成的客户端,用于调试 JavaScript、检查对象树以及分析 QML 引擎的活动。更多信息,请参见 Qt Creator: Debugging Qt Quick Projects