【问题标题】:How to Qt - Qml debugging and/or profiling?如何 Qt - Qml 调试和/或分析?
【发布时间】:2012-11-02 05:18:52
【问题描述】:

需要在应用程序中编译哪些软件 Qt/QML 片段才能调试/分析 QML?

我当前的应用是使用 cmake 构建的,并在嵌入式设备上运行。此外,我开始使用 Qt 4.8.3(直到现在 4.7.0)。

我想使用这些花哨/酷炫的功能(适用于嵌入式开发人员):

http://doc.qt.digia.com/qtcreator/creator-qml-performance-monitor.html

我已经通过qt-project 搜索以寻求帮助,但我不清楚当您想使用自定义构建环境调试/分析远程应用程序时需要哪些步骤。

所以,我想知道是否需要以下任何步骤,在肯定的情况下,实际上需要的代码是什么。

  • Qt 库./configure 特定选项。
  • QtCreator 特定选项附加/启动到远程应用程序。
  • Cmake 包含最终应用程序可执行文件中所需的库。

欢迎任何帮助、链接等。

【问题讨论】:

    标签: c++ qt embedded cmake qml


    【解决方案1】:

    使用 Qt 4.8,这变得非常容易。所有必需的库现在都是 Qt 本身的一部分,您不必自己为您的 Qt 版本构建调试库。

    我正在开发一个同样使用 CMake 构建的 Qt/QML 桌面应用程序。我必须完成以下步骤才能启用 QML 调试:

    1. 在我的应用程序的启动代码中包含调试启用程序

        #include <QtDeclarative/qdeclarativedebug.h>
      
        /* [...] */
      
        QDeclarativeDebuggingEnabler enabler;
      
    2. QML_DISABLE_OPTIMIZER=1添加到我的应用程序的执行环境

      这可以在项目页面的执行选项卡中的 Qt Creator 中完成。

    3. 勾选执行选项卡中的 QML 调试复选框

      这为 Qt Creator 和嵌入在应用程序中的 QML 调试器组件之间的通信添加了所需的命令行参数

    如果一切正常,应用程序在调试模式下启动时会显示以下输出:

    Qml 调试已启用。只能在安全的环境中使用!
    QDeclarativeDebugServer:正在等待端口 3768 上的连接...
    QDeclarativeDebugServer: 已建立连接

    之后我就可以设置断点和检查变量了。可通过分析页面访问的分析器也正常工作。

    当您开发嵌入式应用程序时,您的情况显然有点复杂。

    Qt creator 不支持在嵌入式平台上部署和执行基于 CMake 的项目。你必须自己做。不要忘记将所需的参数传递给您的应用程序以配置 QML 调试:

    $ your-app -qmljsdebugger=port:3768,block
    

    要将 Qt Creator 附加到远程运行的应用程序以进行分析会话,请使用 Qt Creator 主菜单中“分析”菜单中相应的“外部”条目。在“调试”>“调试”下使用“连接到调试服务器”进行调试的类似选项在哪里。

    【讨论】:

    • 我第一次成功地在 QML profiler 上看到了应用数据。我没有使用第 3 点,我只是点击了 Analyza->QML Profiler。现在,在第一次测试之后,我得到“QDeclarativeDebugServer:另一个客户端已经连接”。这是可以避免的还是我需要重置我的应用程序?
    • 我自己没有看到这条消息,错误似乎你尝试两次调试/分析相同的应用程序实例,现在允许这样做。我无法为您提供帮助,因为我的桌面应用程序不会发生这种情况。
    【解决方案2】:

    我正在使用 Qt 5,它变得更加容易。我只需要这一步来进行 QML 分析:

    #include <QQmlDebuggingEnabler>
    
    ...
    
    QQmlDebuggingEnabler enabler;
    

    【讨论】:

    • 我也使用 QT 5 但我收到“没有这样的文件或目录”的错误可能是什么问题?我应该安装更多东西吗?
    • @MeM:很难说...我建议您针对该问题打开一个新问题以及更多信息...
    • 对我不起作用,出现错误:Could not connect to the in-process QML profiler within 128 s. Do you want to retry and wait 256 s?
    【解决方案3】:

    检查docs 所有给出的答案似乎是不必要的。此外,它在版本中对调试代码进行硬编码。我不知道为什么需要QQmlDebuggingEnabler,但是如果您检查代码herehere,您会发现QQmlDebuggingEnabler 的实例化是不需要 必要的。只需包含 QQmlDebuggingEnabler 并设置 QT_QML_DEBUG 标志,例如像这样(CMake)

    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DQT_QML_DEBUG ")

    不过根据docsQQmlDebuggingEnabler是没有必要的。

    此外:分析未优化的代码毫无意义。

    对我来说,将QT_QML_DEBUG 设置为标志并选中 QML 调试复选框就足够了。

    【讨论】:

      【解决方案4】:

      这是@sebasgo's answer 的“更清洁”替代方案,第 1 项。

      如果你使用 Qt5 和 QtQuick2,你只需要在某些文件中包含 QtQuick 之前定义 QT_QML_DEBUG(不管是什么文件,只要它是可执行文件的一部分)。例如,使用以下行开始 main.cpp 就足够了:

      #define QT_QML_DEBUG
      #include <QtQuick>
      

      如果您改为使用编译器的 -DQT_QML_DEBUG 标志(例如,通过 qmake DEFINES 或 cmake add_definitions 指令)也不会受到伤害,可能仅在调试版本中。

      如果您坚持使用旧版 QtQuick1(在 Qt5 或 Qt4 中),请改用 QT_DECLARATIVE_DEBUG 宏,例如

      #define QT_DECLARATIVE_DEBUG
      #include <QtDeclarative>
      

      对于好奇的人,这里有一个相关的 Qt 源代码,简短且不言自明:

      【讨论】:

        【解决方案5】:

        在 Qt 5.1 中添加了新函数 qInstallMessageHandler。 它可以让您捕获并记录错误和警告,以便您可以随心所欲地处理它们。

        【讨论】:

        • 您的链接和描述表明它是在 QT 5.0 中引入的
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多