日志记录和调试
日志
应用程序管理器会安装自己的消息处理程序,以整洁地格式化日志输出。如果可用,此消息处理程序将输出传递到 GENIVI 诊断日志和跟踪 (DLT)。
类别
应用程序管理器定义以下日志类别
类别 | DLT 上下文 ID | 描述 |
---|---|---|
am.system | SYS | 通用系统消息 |
am.installer | INST | 安装程序子系统消息 |
am.graphics | GRPH | OpenGL/UI 相关消息 |
am.wayland.debug | WAYL | Wayland 相关消息 |
am.qml | QML | 通用 QML 相关消息 |
am.runtime | RT | 运行时消息 |
am.runtime.qml | QMRT | QML 运行时消息 |
am.qml.ipc | QMIP | QML IPC 消息 |
am.notify | NTFY | 通知子系统消息 |
am.deployment | DPLM | 部署提示 |
am.intent | INTN | 意图子系统消息 |
am.cache | CACH | 缓存子系统消息 |
general | GEN | 仅用于 DLT 记录并默认启用。没有 DLT 上下文 ID 映射的类别默认为 GEN ;这包括未分类的日志。 |
环境变量
这是一个(不完整)的环境变量列表,它们影响运行时的日志输出
变量 | 描述 |
---|---|
AM_STARTUP_TIMER | 如果设置为 1,则会在控制台上打印启动性能分析。除 1 之外的其他值被解释为要使用的文件名,而不是控制台。有关更多信息,请参阅 StartupTimer。 |
AMFORCECOLOROUTPUT | 可以设置为 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调试基础设施。
注意:虽然这些包装器被称为“调试”包装器,但它们不仅限于调试任务。它们还用于涉及通过包装器运行测试应用程序的各种其他任务,如性能分析工具。
使用调试包装器
有三种使用调试包装器启动应用程序的方法 - 所有这些方法都依赖于指定要使用哪个调试包装器的共同方式
- 在您的系统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
- 使用内部使用D-Bus的
appman-controller
,它能够自动找到正确的总线并支持标准的I/O重定向appman-controller debug-application -ioe "valgrind --tool=helgrind" io.qt.app
-i
、-o
和-e
可选参数将分别的I/O流(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
当经常在命令行上使用复杂调试包装器时,建议创建别名或包装器脚本。
©2019年Luxoft瑞典AB。本文档中的文档贡献是各自所有者的版权。本提供的文档根据自由软件基金会发布的GNU自由文档许可证版本1.3的条款进行许可。Qt及其相关标志是芬兰Qt公司及其它国家/地区的商标。所有其他商标都是其各自所有者的财产。