我的项目是一个Qt GUI应用程序,其中所有视图都在QML中,而C ++中的模型和业务逻辑。随着项目规模增长到100%的cpp和qml文件,调试变得越来越困难。 在调试模式下,很容易找到C ++代码中产生的崩溃,因为链接到源代码的堆栈跟踪被呈现,但是由于qml代码导致的崩溃产生了所有灰色的堆栈跟踪(即,指向Qt内部等,在哪里你看不到qml文件和产生错误的行。)
你知道吗?
使用: C ++ 11,Qt / QML 5.2.0,Mac上的Qt Creator 3.0(Clang ++,LLDB组合)和Windows(MinGW g ++ 4.8.0)
如果我在qml文件中的任何javascript函数上放置一个断点,那么在调试过程中很容易遇到断点,但问题是当应用程序崩溃时,我无法知道哪个qml文件/行可以已经参与了崩溃,所以我不能预先设置断点 - 它应该显示在堆栈跟踪中但它没有(只显示灰色的堆栈跟踪)
答案 0 :(得分:3)
我不确定它目前是否可行。但是,请参阅开发邮件列表上的Simon发送的this电子邮件:
野兽的本质是我们这里有两种语言环境 它们(并且不能)共享相同的堆栈,因此堆栈跟踪将始终如此 分离。但是,有一些方法可以确定“当前”JavaScript堆栈 并行追踪。请注意,对于Qt 5.1或更早版本,这是不可能的,但是 从Qt 5.2开始,这是可能的。
Friedemann非常友好地为QtQml和QtQ奠定了基础设施 在Qt Creator方面使用它,也可以被KDE使用 drkonqi:
这需要一些分析和与gdb的交互,但我认为 这是可行的。它需要查看gdb报告的框架,如果你看到的话 将QV4 :: ExecutionContext *作为参数的函数,然后就可以了 从gdb输出中提取“地址”,然后调用qt_v4StackTrace 在gdb中的QtQml中运行。它将打印出一个JavaScript堆栈跟踪。 这很有效,Qt Creator 3.1通过上下文菜单提供它 在调试器中,如果您想自己尝试一下。
这种方式在KDE中报告以某种方式涉及Qt JavaScript执行的bug可以 - 并行 - 包括C ++回溯和JS堆栈跟踪。
这为调试QML应用程序的原因提供了一些背景信息。
我认为他指的是创作者中的Load QML Stack选项:
由于通向当前位置的调用堆栈可能源自或经过没有调试信息可用的代码,因此并非所有堆栈帧都具有相应的源位置。没有相应源位置的堆栈帧在堆栈视图中显示为灰色。
如果单击具有已知源位置的框架,文本编辑器将跳转到相应位置并更新“局部和表达式”视图,使其看起来像程序在进入函数之前被中断。
要找出导致Qt Quick 2应用程序崩溃的QML文件,请在“堆栈”视图的上下文菜单中选择“加载QML堆栈”。调试器尝试从已停止的可执行文件中检索JavaScript堆栈,并将帧预先添加到C ++框架中,如果找到的话。您可以单击QML堆栈中的框架以在编辑器中打开QML文件。
它可能没那么有用,但也有console.trace()。该链接还链接到Debugging Qt Quick Projects。