Back to Blog home

调试Qt Quick 2 – 控制台API

Published on 星期四 三月 08, 2012 by Zhen Zeng in Qt Quick Performance Qt Creator qt-labs-chinese | 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频道联系我们。

Subscribe to Our Blog

Stay up to date with the latest marketing, sales and service tips and news.