日志与调试

日志

应用管理器安装自己的消息处理程序以整洁地格式化日志输出。如果可用的QtDltLogging模块,则消息处理程序将输出传递给GENIVI诊断日志和跟踪(DLT)。

类别

应用管理器定义以下日志类别

类别DLT上下文ID描述
am.systemSYS一般系统消息
am.installerINST安装子系统的消息
am.graphicsGRPHOpenGL/UI相关消息
am.wayland.debugWAYLWayland相关消息
am.qmlQML应用管理器生成的QML消息
am.runtimeRT运行时消息
am.quicklaunchQL快速启动器消息
am.runtime.qmlQMRT应用管理器的运行时的QML消息
am.notifyNTFY通知子系统的消息
am.deploymentDPLM部署提示
am.intentINTN意图子系统的消息
am.cacheCACH缓存子系统的消息
generalGEN仅用于DLT日志,默认启用。在DLT中没有上下文ID映射的类别默认为GEN,包括未分类的日志。

注意: am.qml*类别仅用于报告应用管理器中QML引擎的问题。通过console对象输出的正常QML输出将像其他任何Qt应用程序一样处理。

环境变量

这是影响运行时日志输出的(不完整)环境变量列表

变量描述
AM_NO_CUSTOM_LOGGING如果设置为1,则调试输出不会被重定向到DLT,不会着色或格式化。
AM_NO_DLT_LOGGING如果设置为1,则调试输出不会重定向到DLT。
AM_STARTUP_TIMER如果设置为1,则启动性能分析输出到控制台。除了1之外的其他任何值都解释为要使用的文件名,而不是控制台。有关更多信息,请参阅StartupTimer
AM_FORCE_COLOR_OUTPUT可以设置为on以强制将着色输出到控制台或设置为off以禁用它。任何其他值都启用默认的自动检测行为。
AM_TIMEOUT_FACTOR一个整数因子,它使应用管理器中所有计时等待语句变慢。如果在例如Valgrind这样的慢封装器中运行,则非常有用。默认值是1
QT_MESSAGE_PATTERN设置此变量具有与《调试技术》中描述相同的效果,并覆盖了默认应用管理器消息处理程序。如果可用,仍然支持并行 DLT 记录。

调试

简介

在调试应用管理器时,系统 UI 和应用依赖于应用管理器运行的模式。

  • 单进程模式下,您可以使用任何调试工具直接启动 appman 二进制文件,例如,gdb --args appman -c config.yaml。由于所有内容都在一个进程中运行,因此您无法单独调试应用。相反,所有启动的应用都加载到一个进程中,因此您只能同时调试整个进程;不能独立地调试每个应用。
  • 多进程模式下,您需要区分调试应用管理器本身或系统 UI 与调试单个应用:应用管理器和系统 UI 可以与上面的单进程设置以相同的方式进行调试。对于应用而言,调试稍微有点复杂,因为它们必须由应用管理器启动。您可以通过运行一个带有用于描述使用您最喜欢的调试工具启动应用的方式的调试包装器来完成此操作。

要在应用管理器或应用中启用 QML 调试或 QML 性能分析,请使用 --qml-debug 参数启动它。有关更多信息,请参阅QML 调试基础设施

注意:虽然这些包装器被称为“调试”包装器,但它们不仅限于调试任务。它们还适用于涉及通过包装器运行测试应用的各种其他任务,如性能工具。

如果您要通过 gdbgdbserver 进行调试,您可能还想查看 QtCreator 手册中的调试文档

如果您需要使用 gdbserver(在多进程模式下调试应用或调试 appman 进程本身),请查看关于远程调试的章节

环境变量

这是一个(不完整)的环境变量列表,这些变量会影响运行时调试

变量描述
AM_NO_CRASH_HANDLER如果设置为 1,则不安装崩溃处理程序。如果您要使用应用管理器的崩溃处理程序与您使用的其他调试工具冲突,可以使用此设置。

使用调试包装器

有三种使用调试包装器启动应用的方法 - 它们都依赖于指定哪个调试包装器使用的一种共同方式

  • 在您的系统 UI 中,使用 debugApplication 启动应用,而不是使用 startApplication
    ApplicationManager.debugApplication("io.qt.app", "/usr/bin/strace -f")
  • 通过 D-Bus 调用 debugApplication 方法
    qdbus io.qt.ApplicationManager /ApplicationManager debugApplication "gdbserver :5555" io.qt.app
  • 使用 appman-controller,它使用 D-Bus 内部,但能够自动找到正确的总线,并支持标准-IO 重定向
    appman-controller debug-application -ioe "valgrind --tool=helgrind" io.qt.app

    可选的 -i-o-e 参数将相应的 IO 流(《stdin》、《stdout》和《stderr》)重定向到调用终端。

注意:要使用 D-Bus 选项,应用管理器必须连接到会话总线或系统总线;不要使用 --dbus none 运行。

调试包装器规范必须是一个单一参数字符串,该字符串被解释为命令行。如果该字符串包含 %program% 子字符串,则将其替换为应用程序可执行文件的完整路径(或 QML 应用程序的 appman-launcher-qml 可执行文件)。对于 %arguments% 也是如此,它将被替换为应用程序潜在的可命令行参数。如果您没有指定 %program%%arguments%,它们将附加到最终的命令行。

这意味着所有这些调试包装器在本质上都是相同的

appman-controller debug-application "gdbserver :5555 %program% %arguments%" io.qt.music
appman-controller debug-application "gdbserver :5555 %program%" io.qt.music
appman-controller debug-application "gdbserver :5555" io.qt.music

如果“包装器”工作方式不同,显式的 %program% 参数很重要。例如,通过在阻塞模式下使用端口 1234 启用 JavaScript 调试器来启动应用程序

appman-controller debug-application "%program% -qmljsdebugger=port:1234,block %arguments%" io.qt.browser

您也可以指定调试包装器的环境变量,就像在命令行上一样。该命令通过 strace 运行您的应用程序,同时设置 WAYLAND_DEBUG 环境变量为 1

appman-controller debug-application "WAYLAND_DEBUG=1 strace -f" io.qt.browser

为了更方便,您甚至可以仅设置环境变量,而不使用实际的调试包装器,以调试 QML 应用程序中的导入和插件加载

appman-controller debug-application "QT_DEBUG_PLUGINS=1 QML_IMPORT_TRACE=1" io.qt.browser

如果在命令行上经常使用复杂的调试包装器,建议创建别名或包装器脚本。

© 2024 Qt 公司有限公司。此处包含的文档贡献属于其各自的版权所有者。此处提供的文档根据自由软件基金会发布的 GNU 自由文档许可证版本 1.3 的条款进行许可。Qt 以及相应的徽标是芬兰和/或世界其他地区的 Qt 公司的商标。所有其他商标均为其各自的产权。