调试提示

如需了解一般调试信息,请参阅 Fuchsia 调试工作流

正在生成调试信息

有多个 GN build 参数用于控制调试信息的生成。

symbol_level

symbol_level 指定要生成的调试信息的级别。 默认值为 -g3。 一个实用值是 symbol_level = 1,有助于减少回溯中可用的调试信息。

BOOTFS_DEBUG_MODULES

BOOTFS_DEBUG_INFO_FILES 可用于指定在启动映像中包含哪些模块(应用、库、测试)的关联调试信息。

该值是以英文逗号分隔的“模块简称”列表,通常为 parent_directory/module_directory。例如,ulib/launchpad,utest/debugger 允许使用 Make 样式模式 (%),例如ulib/%,utest/debugger

默认值为空(表示无)。

将调试信息添加到启动映像

默认情况下,启动映像不包含调试信息,因为它可能需要大量的额外空间。以原生方式使用调试程序等工具时,添加调试信息非常有用。请注意,这不适用于交叉调试(调试程序在单独的机器上运行)。当您在 zircon 上运行调试工具时,可以将调试信息添加到启动映像。

示例:

$ gn gen build-zircon --args='BOOTFS_DEBUG_MODULES=ulib/%,utest/debugger symbol_level = 1'

此示例将包含在所有共享库和“调试程序”测试计划的启动映像调试信息文件中。为了减少调试信息量,使其仅包含可在回溯中使用的调试信息,系统会传递 symbol_level = 1

使用 QEMU+GDB 调试内核。

有关使用 QEMU+GDB 调试 zircon 的文档,请参阅 QEMU 中的“使用 GDB 调试内核”部分。

对回溯进行符号化处理

如需在运行 zircon 时自动对回溯进行符号化解析,请通过符号生成器传递日志,如下所示:

fx set bringup.x64 --variant asan  # or bringup.arm64
fx build
fx ffx emu start --console | ffx debug symbolize
...
> crasher
...
[00021.715] 01044.01212> devmgr: crash_analyzer_listener: analyzing exception type 0x108
[00021.721] 01102.01116> <== fatal exception: process crasher[2853] thread initial-thread[2867]
[00021.721] 01102.01116> <== fatal page fault, PC at 0x38ed815cdbd7
[00021.721] 01102.01116>  CS:                   0 RIP:     0x38ed815cdbd7 EFL:              0x246 CR2:                  0
[00021.721] 01102.01116>  RAX:                  0 RBX:                0x1 RCX:                0x1 RDX:     0x75dec26db264
[00021.722] 01102.01116>  RSI:                  0 RDI:                  0 RBP:      0x5663cdc3f90 RSP:      0x5663cdc3f80
[00021.722] 01102.01116>   R8:                  0  R9:                  0 R10:                  0 R11:              0x206
[00021.722] 01102.01116>  R12:     0x6a3f40970d70 R13:     0x6a3f40970db0 R14:               0x16 R15:         0x7986f4ef
[00021.722] 01102.01116>  errc:               0x6
[00021.722] 01102.01116> bottom of user stack:
[00021.723] 01102.01116> 0x000005663cdc3f80: 40970d70 00006a3f 9af1eb38 00006fea |p..@?j..8....o..|
[00021.724] 01102.01116> 0x000005663cdc3f90: 3cdc3fd0 00000566 815cdba7 000038ed |.?.<f.....\..8..|
[00021.724] 01102.01116> 0x000005663cdc3fa0: 00000008 00000000 9af1eb38 00006fea |........8....o..|
[00021.724] 01102.01116> 0x000005663cdc3fb0: 40970f70 00006a3f 40970f70 00006a3f |p..@?j..p..@?j..|
[00021.724] 01102.01116> 0x000005663cdc3fc0: c26db570 000075de 40970db0 00006a3f |p.m..u.....@?j..|
[00021.724] 01102.01116> 0x000005663cdc3fd0: 3cdc3ff0 00000566 c261cdef 000075de |.?.<f.....a..u..|
[00021.724] 01102.01116> 0x000005663cdc3fe0: 00000054 00000000 40970f70 00006a3f |T.......p..@?j..|
[00021.724] 01102.01116> 0x000005663cdc3ff0: 40970fe0 00006a3f 00000000 00000000 |...@?j..........|
[00021.724] 01102.01116> arch: x86_64
[00021.728] 01102.01116> dso: id=31c12edecfd596b0be787e782f896efadf23e3da base=0x75dec2603000 name=libc.so
[00021.728] 01102.01116> dso: id=b4f9333e0d1bb7e79370905f90299d1da94e4271 base=0x51d5c67da000 name=<vDSO>
[00021.728] 01102.01116> dso: id=a0106c6ceae6a63d35eb7e8923ebc1a62a8df3e8 base=0x38ed815cd000 name=app:crasher
[00021.728] 01102.01116> dso: id=881704361e6af74805ab9e2a236ccf2962cdecc9 base=0x2ce98f7b2000 name=libfdio.so
[00021.738] 01102.01116> bt#01: pc 0x38ed815cdbd7 sp 0x5663cdc3f80 (app:crasher,0xbd7)
[00021.746] 01102.01116> bt#02: pc 0x38ed815cdba7 sp 0x5663cdc3fa0 (app:crasher,0xba7)
[00021.747] 01102.01116> bt#03: pc 0x75dec261cdef sp 0x5663cdc3fe0 (libc.so,0x19def)
[00021.749] 01102.01116> bt#04: pc 0 sp 0x5663cdc4000
[00021.749] 01102.01116> bt#05: end

start of symbolized stack:
#01: blind_write at ./system/uapp/crasher/crasher.c:21
#02: main at ./system/uapp/crasher/crasher.c:137
#03: start_main at ./third_party/ulib/musl/src/env/__libc_start_main.c:49
#04: unknown, can't find pc, sp or app/library in line
end of symbolized stack

内核命令

Zircon 有若干与内核和调试相关的 shell 命令,可通过 k 命令进行访问。如需了解详情,请访问 k help