调试QML应用程序#

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

当您使用QML开发应用程序时,有许多方法可以调试可能遇到的问题。下面各节介绍了可用的调试工具及其用法。

控制台API#

特性

描述

日志

使用console.logconsole.debugconsole.infoconsole.warnconsole.error将调试信息打印到控制台。

例如

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

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

断言

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");
    // first part
    console.timeEnd("firstPart");
    // second part
    console.timeEnd("wholeFunction");
}

跟踪

console.trace打印在调用点处的JavaScript执行的堆栈跟踪。此堆栈跟踪信息包含函数名、文件名、行号和列号。堆栈跟踪限制为最后10个堆栈帧。

计数

console.count打印特定代码段运行当前次数以及一条消息。

例如

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

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

分析

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

分析结束

console.profileEnd关闭QML和JavaScript分析器。在调用此函数之前,需要附加分析客户端以接收和存储分析数据。

例如

function f() {
    console.profile();
    //Call some function that needs to be profiled.
    //Ensure that a client is attached before ending
    //the profiling session.
    console.profileEnd();
}

异常

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

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

调试模块导入#

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

例如,对于以下简单的 QML 文件

如果运行 QML 运行时工具 或您的 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 时将自动安装所需的 qmltooling 插件,以便在设备上调试和剖析 QML 应用程序。它们必须部署到设备上才能使调试和剖析功能正常工作。

启用基础设施#

在编译应用程序时,必须显式启用调试基础设施。如果您使用 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_from>[,port_to][,host:<ip address>][,block][,file:<local socket>][,services:<comma-separated list of services to enable>]

其中

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

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

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

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

  • 可选的 services 指定要启用的服务;默认值是找到的所有服务。注意,v4 debug 服务禁用 JIT。

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

QML 调试器: 在端口 <port_number> 等待连接QML 调试器: 正在连接到 套接字 <file>"

连接到应用程序#

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

Qt 提供了一个 qmlprofiler 命令行工具,用于将配置文件数据捕获到文件中。要运行此工具,请输入以下命令

qmlprofiler -p <port> -attach <ip address>

使用 Qt Creator 进行调试#

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