调试 QML 应用

当您使用 QML 开发应用程序时,有很多方法可以帮助调试可能遇到的问题。下文将描述可用的调试工具及其使用方法。

控制台 API

功能描述
日志使用 console.logconsole.debugconsole.infoconsole.warnconsole.error 将调试信息打印到控制台。

例如

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

输出由 C++ 中的 qCDebugqCWarningqCCritical 方法生成,类别为 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 性能分析器。在没有先调用 console.profile 时调用此函数会在控制台上打印警告。在执行此调用之前,需要连接性能分析客户端以接收和存储性能数据。

例如

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 函数的第一个参数传递。有关更多详细信息,请参阅 LoggingCategory

调试模块导入

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

例如,对于一个简单的 QML 文件,如下所示

import QtQuick

Rectangle { width: 100; height: 100 }

如果您在运行 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端口或本地套接字进行应用调试、检查和性能分析的服务。

注意: 用于在设备上调试和性能分析QML应用所需的qmltooling插件在安装Qt时自动安装。它们必须部署到设备上,调试和性能分析才能正常工作。

启用基础设施

编译您的应用程序时,必须显式启用调试基础设施。如果您使用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:<端口号>[,端口号][,host:<IP地址>][,block][,file:<本地套接字>][,services:<以逗号分隔的服务列表以启用>]

其中

  • 强制性的port_from指定了调试端口,或者当指定port_to时,指定了一系列端口的起始端口
  • 可选的ip address指定了应用程序运行的主机的IP地址
  • 可选的block阻止应用程序运行,直到调试客户端连接到服务器
  • 可选的file指定了本地套接字。
  • 可选的services指定了要启用的服务;默认值是找到的所有服务。注意,v4 debug服务禁用了JIT。

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

QML调试器:在端口 <端口号> 等待连接QML调试器:连接到 <文件> 上的套接字

连接到应用程序

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

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

qmlprofiler -p <端口> -attach <IP地址>

使用Qt Creator进行调试

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

© 2024 Qt公司有限公司。本文档中包含的贡献内容均为各自所有者的版权。提供的文档受自由软件基金会发布的GNU自由文档许可协议版本1.3的条款约束。Qt及其相关标志是芬兰及/或其他国家Qt公司有限公司的商标。所有其他商标均为其各自所有者的财产。