如需一般偵錯資訊,請參閱 Fuchsia 偵錯工作流程。
正在產生偵錯資訊
有幾個 GN 建構引數可用於控制偵錯資訊的產生方式。
symbol_level
symbol_level
會指定要產生的偵錯資訊層級。預設值為 -g3
。symbol_level = 1
是實用的值,有助於在反向追蹤中取得較少用到的偵錯資訊。
BOOTFS 偵錯模組
BOOTFS_DEBUG_INFO_FILES 可讓您指定哪些模組 (應用程式、libs、測試) 會在啟動映像檔中加入其相關聯的偵錯資訊。
這個值是以逗號分隔的「模組簡稱」清單,通常為 parent_directory/module_directory
。例如:ulib/launchpad,utest/debugger
可使用風格圖案 (%),例如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 有許多與核心和偵錯相關的殼層指令,可透過 k
指令存取。如要進一步瞭解,請前往 k help
。