Skip to main content

调试Qt Quick 2 – 控制台API

Comments

原文链接 Christiaan JanssenQML Profiler update

Qt Quick带来了许多灵活快速的开发方式。传统的方式需要不停的进行“编译、打包、部署、运行”的循环,而现在,使用Qt Quick,就算是在运行时您也可以对源码做出增量修改!在Qt Creator的一个又一个版本中,我们努力更好的释放Qt Quick的能量。然而,任何编程语言都有其缺点。QML中脚本的编译错误与运行时错误,有时您总是在QtDeclarative的绑定循环上绕圈子,以及JavaScript的那些您不想被卷入的阴暗角落等等……所有的这些潜在的陷阱意味着您真心希望能有一把称手的调试、分析、检查的武器:)

本篇博客的重点是调试与那些最简洁的调试技术:控制台API。很有可能您已经在您最初的helloworld.qml文件中使用过它了:console.log()是调试技术的一部分。最近我们用FireBug控制台API(事实上的网络浏览器标准)中的一些最有用的方法更新了Qt 5。

日志

从Qt Quick 1.0起我们已经支持了console.log和console.debug。QtScript里的print()函数仍然有效,但是在网络浏览器中执行JavaScript代码时它有略微不同的含义,所以尽量别用它。我们给Qt 5多添加了几个日志函数。所有这些调用都会被转发给它们在Qt中对应的部分:

JavaScript函数 Qt/C++副本
console.log() qDebug()
console.debug() qDebug()
console.info() qDebug()
console.warn() qWarning()
console.error() qCritical()

是的,眼下console.log()、console.debug()以及console.info()具有相同的功能!因为它们是最常用的方法并且被无数JS代码片段使用,所以我们选择了支持他们。也许我们应该进一步考虑在qlogging.h中添加额外的日志等级;)

分析

想要知道一段特定代码的执行需要多少时间?在您的onCompleted方法中写个逻辑例子。

Component.onCompleted() {
console.time("onCompleted");
// ...
console.timeEnd("onCompleted");
}

会以毫秒输出耗时。字符串参数既是特定测量(也可以是交叉测量)的识别码,也是输出的前缀:

onCompleted: 401ms

如果需要深入点的分析,可以使用console.profile()、console.profileEnd()。

Component.onCompleted() {
console.profile();
}
Component.onDestruction() {
console.profileEnd();
}

这一对API分析了QDeclarativeEngine的状态与V8的方法调用。然而为了取回数据,你必须在调用console.profileEnd()之前将QML分析工具连接到您的程序否则会丢失分析数据。Christiaan Janssen已经在之前的博文中描述了Qt Creator中的QML分析工具。在Qt 5中会有一个独立的分析工具把分析数据存入文件之中。之后我们就可以使用Qt Creator来读取这种文件。

再说几句……

我们还引入了如下这些API:

console.assert() : 测试一个表达式,可选地输出信息并且当表达式评估为否的时候输出JavaScript执行的堆栈跟踪。

console.exception(): 输出错误信息以及JavaScript执行的堆栈跟踪。

console.trace(): 输出在调用点的JavaScript执行的堆栈跟踪。

console.count(): 附在用户提供的信息之后输出当前函数被调用的次数。

脚本控制台 – 新的化身

早在Qt Creator 2.1中就引入了QML控制台。然而它是个受限于只能评估简单表达式的简化控制台。我们认为Qt Quick2的开发人员需要一个更先进的控制台来释放QML的潜力。

我们郑重向您介绍QML控制台的新化身——脚本控制台。

QML Console

Qt Creator的脚本控制台

除了评估表达式之外,脚本控制台以更漂亮的方式显示了调试输出,包括Qt调试信息和JavaScript控制台信息。;)您可以使用位于右上角的过滤按钮来查看您需要的记录。如果您只想查看错误(Error),那么请取消信息(Info)和警告(Warning)的选中,瞧!调试输出同样显示了文件与行数信息,在其上点击会在编辑器中打开对应文件同时光标移到对应的行数。不用再在调试信息里面添加上下文信息来在原文件中定位了!您也可以时刻用Find工具栏在控制台中搜索文字。

JavaScript对象与数组在控制台中以可展开树的方式表示。用来评估表达式的当前上下文显示在状态栏上。脚本控制台甚至可以在非调试断点处使用,检查、评估QML元素与表达式。脚本控制台支持多行输入;还能够记忆之前的输入,这样就不用再去输入那些真的很长的表达式了。

最棒的就是无需等待太长时间,脚本控制台作为Qt Creator 2.5的一部分发布!

少了点什么?

目前我们还没有实现处理控制台的方法,是因为如果您的控制台只是命令行的话实现这些方法没太大的意义。比如,很难以一种可移植的方式实现console.clear()。;) 基于类似的原因我们也排除了console.group()、console.groupCollapsed()、console.groupEnd()、console.table()、console.dir()、console.dirXml()。

Qt Creator中的脚本控制台仍在在开发当中。目前,QML对象与数组没有在树中显示。控制台仍然需要好好打磨,并在之后的版本中提供能多的功能。

我们迫切地想知道你对于控制台所希望的功能列表以及使用经验。您可以通过qtcreator邮件列表或者IRC freenode服务器上的#qt-creator频道联系我们。

Comments

Subscribe to our blog

Try Qt 6.11 Now!

Download the latest release here: www.qt.io/download

Qt 6.11 is now available, with new features and improvements for application developers and device creators.

We're Hiring

Check out all our open positions here and follow us on Instagram to see what it's like to be #QtPeople.