本页内容

调试 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 方法生成的,具体使用qml 或js 类别,取决于执行日志记录的文件类型。

另请参阅《调试技巧》。

Assertconsole.assert 用于测试表达式是否为真。若不为真,则向控制台写入一条可选消息并打印堆栈跟踪。

例如:

function f() {
  var x = 12
  console.assert(x == 12, "This will pass");
  console.assert(x > 12, "This will fail");
}
Timerconsole.time 和console.timeEnd 会记录两次调用之间所花费的时间(以毫秒为单位)。这两个方法都接受一个字符串参数,用于标识该测量项。

例如:

function f() {
    console.time("wholeFunction");
    console.time("firstPart");
    // first part
    console.timeEnd("firstPart");
    // second part
    console.timeEnd("wholeFunction");
}
Traceconsole.trace 会打印调用该函数时 JavaScript 执行的堆栈跟踪。此堆栈跟踪信息包含函数名、文件名、行号和列号。堆栈跟踪仅显示最后 10 个堆栈帧。
Countconsole.count 会打印特定代码段的当前执行次数,并附带一条消息。

例如:

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

每当运行f() 时,上面的代码示例就会输出f called: 1 、f called: 2 ……等内容。

Profileconsole.profile 会启用 QML Profiler 和 JavaScript 性能分析器。该方法不支持嵌套调用,并会在控制台输出警告信息。
ProfileEndconsole.profileEnd 用于关闭 QML Profiler 和 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();
}
Exceptionconsole.exception 会输出一条错误消息。其工作原理与console.error 类似,但至少需要一个参数,并且还会输出调用该函数时 JavaScript 执行的堆栈跟踪信息。

此外,也可以将logging category 作为第一个参数传递给任何一个console 函数。更多详细信息请参见LoggingCategory 。

调试模块导入

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

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

import QtQuick

Rectangle { width: 100; height: 100 }

如果您在运行“QML Runtime ”工具或 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安装过程中自动安装。必须将这些插件 部署到设备上,调试和分析功能才能正常工作。

启用基础架构

在编译应用程序时,必须显式启用调试基础设施。

如果使用 CMake,可以在命令行上将 `-DCMAKE_CXX_FLAGS_INIT=-DQT_QML_DEBUG ` 作为参数传递给 `cmake `,以此仅针对特定构建启用该功能。您也可以在 `CMakeLists.txt` 文件中添加以下代码片段,将其永久启用:

qt_add_executable(MyApp
...
)

target_compile_definitions(MyApp PRIVATE QT_QML_DEBUG)

如果您使用 qmake,可以在项目的.pro 文件中添加CONFIG+=qml_debug 配置参数,或将其作为命令行参数传递。

如果您使用其他构建系统,则需要通过该构建系统的机制将QT_QML_DEBUG 定义传递给编译器。

注意:启用 调试基础设施可能会危及应用程序和系统的完整性,因此,您应仅在受控环境中启用它。当该基础设施启用时,应用程序会显示以下警告:
QML debugging is enabled. Only use this in a safe environment.

启动应用程序

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

-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 Debugger: Waiting for connection on port <port_number>

或

QML Debugger: Connecting to socket at <file>

连接到应用程序

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

使用Qt Creator

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

使用Qt Extension for Visual Studio Code

Qt Extension for Visual Studio Code 提供了用于调试 JavaScript 以及分析 QML 引擎活动性能的集成客户端。有关更多信息,请参阅Qt Extension for Visual Studio Code :调试Qt Quick 应用程序。

© 2026 The Qt Company Ltd. 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.