对日志进行符号化处理

ffx debug symbolize 命令将日志处理为符号化格式(即直观易懂的堆栈轨迹)。

概念

以下示例展示了 Fuchsia 设备中的符号化日志:

$ ffx log --kernel
...
[326.124][klog][klog][I]    #0    0x0000428d2319f74b in abort() ../../zircon/third_party/ulib/musl/src/exit/abort.c:7 <libc.so>+0x6474b sp 0x27c83188f70
[326.124][klog][klog][I]    #1    0x000001cb1faef047 in main() src/hello_world/hello_world.cc:9 <<VMO#113249=blob-30a652b1>>+0x2047 sp 0x27c83188f80
[326.124][klog][klog][I]    #2    0x0000428d2319eef2 in start_main(const start_params*) ../../zircon/third_party/ulib/musl/src/env/__libc_start_main.c:140 <libc.so>+0x63ef2 sp 0x27c83188fa0
[326.124][klog][klog][I]    #3    0x0000428d2319f145 in __libc_start_main(zx_handle_t, int (*)(int, char**, char**)) ../../zircon/third_party/ulib/musl/src/env/__libc_start_main.c:215 <libc.so>+0x64145 sp 0x27c83188ff0
[326.124][klog][klog][I]    #4    0x000001cb1faef011 in _start(zx_handle_t) ../../zircon/system/ulib/c/Scrt1.cc:7 <<VMO#113249=blob-30a652b1>>+0x2011 sp 0x4046d0234fe0
[326.124][klog][klog][I]    #5    0x0000000000000000 is not covered by any module sp 0x4046d0234ff0

借助符号化日志,您可以读取发生错误的源代码(例如 in main() src/hello_world/hello_world.cc:9)的文件名和行号。

默认情况下,当您的环境中注册调试符号时,ffx log 命令会自动输出符号化的日志。(如需关闭此功能,请运行 ffx log -–no-symbols。)ffx debug symbolize 命令(ffx log 在后台使用)接受带有符号化标记的日志作为输入,并生成符号化的日志作为输出。只要在环境中注册了与此类标记对应的调试符号,该流程就可以正常运行(请参阅注册调试符号)。

对来自外部来源的日志进行符号化处理

在开发期间,ffx log 会自动处理已注册的调试符号并输出符号化处理的日志,因此您可能永远无需在您的环境中手动将日志处理为符号化格式。但在某些情况下,您可以从外部来源(例如 Fuchsia 构建器的输出)获取原始日志的副本。如果您想将此类日志处理为符号化格式,可以将日志作为输入传递给 ffx debug symbolize 命令。

如需手动将日志处理为符号化格式,请执行以下操作:

  1. 启动符号化工具:

    ffx debug symbolize
    

    现在,终端会等待输入。

  2. 复制包含符号化标记的原始日志。

  3. 将其粘贴到 ffx debug symbolize 终端中。

    该工具以符号化格式输出日志。