| # Debugging workflow |
| |
| ## Native code debugging |
| |
| Fuchsia has a debugger for native code (C++ and Rust) called zxdb. |
| |
| Please see the [zxdb documentation](/docs/development/debugger/README.md) for more details. |
| |
| ## Backtraces |
| |
| ### Automagic backtraces |
| |
| Fuchsia starts a program at boot called "crashanalyzer" that reports |
| program crashes and prints a backtrace of the crashing thread. |
| |
| Example: |
| |
| ``` |
| $ crasher |
| [11156.652165][1048][1187][klog] INFO: devmgr: crash_analyzer_listener: analyzing exception type 0x108 |
| [11156.652215][1107][1121][klog] INFO: <== fatal exception: process crasher[42410] thread initial-thread[42424] |
| [11156.652218][1107][1121][klog] INFO: <== fatal page fault, PC at 0x1e1888dbbbd7 |
| [11156.652223][1107][1121][klog] INFO: CS: 0 RIP: 0x1e1888dbbbd7 EFL: 0x10246 CR2: 0 |
| [11156.652226][1107][1121][klog] INFO: RAX: 0 RBX: 0x1 RCX: 0x721ad98697c6 RDX: 0x77accb36f264 |
| [11156.652229][1107][1121][klog] INFO: RSI: 0 RDI: 0 RBP: 0x2781c4816f90 RSP: 0x2781c4816f80 |
| [11156.652232][1107][1121][klog] INFO: R8: 0 R9: 0 R10: 0 R11: 0x246 |
| [11156.652235][1107][1121][klog] INFO: R12: 0x773bf11dcda0 R13: 0x773bf11dcdd0 R14: 0x16 R15: 0x78050d69 |
| [11156.652236][1107][1121][klog] INFO: errc: 0x6 |
| [11156.652237][1107][1121][klog] INFO: bottom of user stack: |
| [11156.652244][1107][1121][klog] INFO: 0x00002781c4816f80: f11dcda0 0000773b 9ccd2b38 000039b2 |....;w..8+...9..| |
| [11156.652248][1107][1121][klog] INFO: 0x00002781c4816f90: c4816fd0 00002781 88dbbba7 00001e18 |.o...'..........| |
| [11156.652252][1107][1121][klog] INFO: 0x00002781c4816fa0: 00000008 00000000 9ccd2b38 000039b2 |........8+...9..| |
| [11156.652255][1107][1121][klog] INFO: 0x00002781c4816fb0: f11dcf70 0000773b f11dcf70 0000773b |p...;w..p...;w..| |
| [11156.652260][1107][1121][klog] INFO: 0x00002781c4816fc0: cb36f570 000077ac f11dcdd0 0000773b |p.6..w......;w..| |
| [11156.652270][1107][1121][klog] INFO: 0x00002781c4816fd0: c4816ff0 00002781 cb2b0d0f 000077ac |.o...'....+..w..| |
| [11156.652277][1107][1121][klog] INFO: 0x00002781c4816fe0: 00000054 00000000 f11dcf70 0000773b |T.......p...;w..| |
| [11156.652281][1107][1121][klog] INFO: 0x00002781c4816ff0: f11dcfe0 0000773b 00000000 00000000 |....;w..........| |
| [11156.652282][1107][1121][klog] INFO: arch: x86_64 |
| [11156.652550][1107][1121][klog] INFO: dso: id=a94c78564173530d51670b6586b1aa471e004f06 base=0x7d3506a49000 name=libfdio.so |
| [11156.652553][1107][1121][klog] INFO: dso: id=a61961ba9776a67a00fb322af9ebbdcfd1ce3f62 base=0x77accb297000 name=libc.so |
| [11156.652554][1107][1121][klog] INFO: dso: id=760f1e6e47d3dd8b6a19150aa47241279ec75a9c base=0x721ad9863000 name=<vDSO> |
| [11156.652558][1107][1121][klog] INFO: dso: id=b18462140c6784a53736105bbf3021852eeda68c base=0x1e1888dbb000 name=app:crasher |
| [11156.652637][1107][1121][klog] INFO: bt#01: pc 0x1e1888dbbbd7 sp 0x2781c4816f80 (app:crasher,0xbd7) |
| [11156.652750][1107][1121][klog] INFO: bt#02: pc 0x1e1888dbbba7 sp 0x2781c4816fa0 (app:crasher,0xba7) |
| [11156.652847][1107][1121][klog] INFO: bt#03: pc 0x77accb2b0d0f sp 0x2781c4816fe0 (libc.so,0x19d0f) |
| [11156.652978][1107][1121][klog] INFO: bt#04: pc 0 sp 0x2781c4817000 |
| [11156.653027][1107][1121][klog] INFO: bt#05: end |
| ``` |
| |
| Since debug information is currently not available on the target, |
| a program (`symbolize`) must be run on the development host to |
| translate the raw addresses in the backtrace to symbolic form. |
| Any easy way to capture this output from the target is by running |
| the `loglistener` program on your development host. |
| |
| ``` |
| $ fx syslog | fx symbolize |
| [11156.652165][1048][1187][klog] INFO: devmgr: crash_analyzer_listener: analyzing exception type 0x108 |
| ... same output as "raw" backtrace ... |
| start of symbolized stack: |
| #01: blind_write at ../../zircon/system/uapp/crasher/crasher.c:21 |
| #02: main at ../../zircon/system/uapp/crasher/crasher.c:137 |
| #03: start_main at ../../zircon/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 |
| ``` |
| |
| |
| ### Manually requesting backtraces |
| |
| Akin to printf debugging, one can request crashlogger print a |
| backtrace at a particular point in your code. |
| |
| Include this header from zircon's backtrace-request library, which you |
| must depend on in your target's BUILD.gn rules: |
| |
| ``` |
| #include <lib/backtrace-request/backtrace-request.h> |
| ``` |
| |
| and then add the following where you want the backtrace printed: |
| |
| ``` |
| void my_function() { |
| ... |
| backtrace_request(); |
| ... |
| } |
| ``` |
| |
| ### Inspecting FIDL messages |
| |
| Fuchsia has a tool for viewing FIDL messages as they are sent and received. See |
| details at [the doc page for fidl inspection](/docs/development/monitor/fidlcat/README.md). |
| |