【问题标题】:QML stack trace during crash崩溃期间的 QML 堆栈跟踪
【发布时间】:2014-05-17 08:19:59
【问题描述】:

我的项目是一个 Qt GUI 应用程序,其中所有视图都使用 QML,模型和业务逻辑使用 C++。随着项目规模增长到数百个 cpp 和 qml 文件,调试变得越来越困难。 在调试模式下,在 C++ 代码中产生的崩溃很容易找到,因为显示了链接到源代码的堆栈跟踪,但是由于 qml 代码导致的崩溃会产生所有变灰的堆栈跟踪(即,指向 Qt 内部等你看不到的地方qml 文件和产生错误的行)。

你知道怎么做吗?

使用: Mac 上的 C++11、Qt/QML 5.2.0、Qt Creator 3.0(Clang++、LLDB 组合)和 Windows(MinGW g++ 4.8.0)

如果我在 qml 文件中的任何 javascript 函数上设置断点,那么在调试过程中很容易遇到断点,但问题是当应用程序崩溃时,我无法知道哪个 qml 文件/行可以参与了崩溃,所以我不能预先设置断点 - 它应该显示在堆栈跟踪中但它没有(只显示灰色的堆栈跟踪)

【问题讨论】:

    标签: qt qml lldb


    【解决方案1】:

    我不确定目前是否可行。但是,请参阅开发邮件列表中来自 Simon 的 this 电子邮件:

    野兽的本质是我们这里有两种语言环境, 他们确实(并且不能)共享同一个堆栈,因此堆栈跟踪将始终是 分离。然而,有一些方法可以确定“当前”的 JavaScript 堆栈 并行跟踪。请注意,这对于 Qt 5.1 或更早版本是不可能的,但是 从 Qt 5.2 开始是可能的。

    Friedemann 非常友好地在 QtQml 中为它奠定了基础设施,并且 在 Qt Creator 端使用它,KDE 也可以使用它 drkonqi:

    这将需要一点点分析和与 gdb 的交互,但我认为 这是可行的。它需要查看 gdb 报告的帧,如果您看到 以 QV4::ExecutionContext * 作为参数的函数,那么您可以 从 gdb 输出中提取“地址”,然后调用 qt_v4StackTrace 在 gdb 中的 QtQml 中的函数。它将打印出 JavaScript 堆栈跟踪。 这工作得很好,Qt Creator 3.1 通过上下文菜单提供它 在调试器中,如果您想自己尝试一下。

    这种方式在 KDE 中以某种方式涉及 Qt JavaScript 执行的错误报告可以 - 并行 - 包括 C++ 回溯和 JS 堆栈跟踪。

    这提供了一些关于为什么调试 QML 应用程序的上下文。

    我认为他指的是 Creator 中的 Load QML Stack 选项:

    由于导致当前位置的调用堆栈可能源自或通过没有可用调试信息的代码,因此并非所有堆栈帧都有相应的源位置。没有对应源位置的堆栈帧在堆栈视图中显示为灰色。

    如果您单击具有已知源位置的框架,文本编辑器会跳转到相应的位置并更新 Locals 和 Expressions 视图,使程序看起来像是在进入函数之前被中断了。

    要找出导致 Qt Quick 2 应用程序崩溃的 QML 文件,请在 Stack 视图的上下文菜单中选择 Load QML Stack。调试器尝试从停止的可执行文件中检索 JavaScript 堆栈,并将帧添加到 C++ 帧(如果找到的话)。您可以单击 QML 堆栈中的框架以在编辑器中打开 QML 文件。

    它可能没那么有用,但也有console.trace()。该链接还链接到Debugging Qt Quick Projects

    【讨论】:

    • 好的,那么 Qt Creator 3.1 应该这样做吗?你在那里试过吗?我目前正在使用 Creator 3.0。
    • 我已经更新了我的答案以指向我认为正确的功能。
    • 是的,我有 Qt Creator 3.1.1 的“加载 QML 堆栈”功能。
    猜你喜欢
    • 1970-01-01
    • 2019-01-03
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多