| # 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 "crashsvc" that reports program |
| crashes and prints a backtrace of the crashing thread. |
| |
| Example: |
| |
| ``` |
| $ ffx log |
| ... |
| [10023.913][klog][klog][I] crashsvc: exception received, processing |
| [10023.913][klog][klog][I] <== CRASH: process crasher[1007318] thread initial-thread[1007320] |
| [10023.913][klog][klog][I] <== write not-present page fault (error ZX_ERR_NOT_FOUND) at 0, PC at 0x2f3734f90fc |
| [10023.913][klog][klog][I] CS: 0 RIP: 0x2f3734f90fc EFL: 0x10246 CR2: 0 |
| [10023.913][klog][klog][I] RAX: 0 RBX: 0x43cf4e707f58 RCX: 0 RDX: 0 |
| [10023.913][klog][klog][I] RSI: 0x2f3734de1f1 RDI: 0 RBP: 0x1d7cee8df60 RSP: 0x1d7cee8df60 |
| [10023.913][klog][klog][I] R8: 0xdc1287fe16b1b597 R9: 0 R10: 0xdc1287fe16b1b597 R11: 0xc87a4939e8 |
| [10023.913][klog][klog][I] R12: 0xc87a495fb0 R13: 0xc87a495fa0 R14: 0x4066b869c998 R15: 0xc87a495fc0 |
| [10023.913][klog][klog][I] fs.base: 0x3bc9af38b18 gs.base: 0 |
| [10023.913][klog][klog][I] errc: 0x6 |
| [10023.913][klog][klog][I] bottom of user stack: |
| [10023.913][klog][klog][I] 0x000001d7cee8df60: cee8df90 000001d7 734fa0ca 000002f3 |..........Os....| |
| [10023.913][klog][klog][I] 0x000001d7cee8df70: 7353f000 000002f3 734dc1b1 000002f3 |..Ss......Ms....| |
| [10023.913][klog][klog][I] 0x000001d7cee8df80: 7a495fb0 000000c8 00000001 00000000 |._Iz............| |
| [10023.913][klog][klog][I] 0x000001d7cee8df90: cee8dfe0 000001d7 b82036f1 00004066 |.........6 .f@..| |
| [10023.913][klog][klog][I] 0x000001d7cee8dfa0: 00000000 00000000 00000001 00000000 |................| |
| [10023.913][klog][klog][I] 0x000001d7cee8dfb0: 00000001 00000000 4e707fd0 000043cf |..........pN.C..| |
| [10023.913][klog][klog][I] 0x000001d7cee8dfc0: 0000000b 00000000 4e707f30 000043cf |........0.pN.C..| |
| [10023.913][klog][klog][I] 0x000001d7cee8dfd0: 4e707e90 000043cf 4e707ec0 000043cf |.~pN.C...~pN.C..| |
| [10023.913][klog][klog][I] 0x000001d7cee8dfe0: cee8dff0 000001d7 b820393b 00004066 |........;9 .f@..| |
| [10023.913][klog][klog][I] 0x000001d7cee8dff0: 00000000 00000000 735146f1 000002f3 |.........FQs....| |
| [10023.913][klog][klog][I] memory dump near pc: |
| [10023.913][klog][klog][I] 0x000002f3734f90cc: cc cc cc cc 55 48 89 e5 48 83 ec 10 48 89 7d f8 |....UH..H...H.}. |
| [10023.913][klog][klog][I] 0x000002f3734f90dc: 48 8b 7d f8 e8 9b 41 04 00 48 83 c4 10 5d c3 cc |H.}...A..H...].. |
| [10023.913][klog][klog][I] 0x000002f3734f90ec: cc cc cc cc 55 48 89 e5 48 89 7d f8 48 8b 45 f8 |....UH..H.}.H.E. |
| [10023.913][klog][klog][I] 0x000002f3734f90fc: c7 00 ea 1d ad 0b 31 c0 5d c3 cc cc cc cc cc cc |......1.]....... |
| [10023.913][klog][klog][I] arch: x86_64 |
| [10023.917][klog][klog][I] [[[ELF module #0x0 "<VMO#1007304=/boot/bin/crasher>" BuildID=d2974008fa020a45 0x2f3734d9000]]] |
| [10023.918][klog][klog][I] [[[ELF module #0x1 "libc.so" BuildID=bda30eefb7cce4af 0x4066b819b000]]] |
| [10023.918][klog][klog][I] #0 0x000002f3734f90fc in blind_write(volatile unsigned int*) ../../src/developer/forensics/crasher/cpp/crasher.c:25 <<VMO#1007304=/boot/bin/crasher>>+0x200fc sp 0x1d7cee8df60 |
| [10023.918][klog][klog][I] #1 0x000002f3734fa0ca in main(int, char**) ../../src/developer/forensics/crasher/cpp/crasher.c:352 <<VMO#1007304=/boot/bin/crasher>>+0x210ca sp 0x1d7cee8df70 |
| [10023.918][klog][klog][I] #2 0x00004066b82036f1 in start_main(const start_params*) ../../zircon/third_party/ulib/musl/src/env/__libc_start_main.c:161 <libc.so>+0x686f1 sp 0x1d7cee8dfa0 |
| [10023.918][klog][klog][I] #3 0x00004066b820393b in __libc_start_main(zx_handle_t, int (*)(int, char**, char**)) ../../zircon/third_party/ulib/musl/src/env/__libc_start_main.c:238 <libc.so>+0x6893b sp 0x1d7cee8dff0 |
| [10023.918][klog][klog][I] #4 0x000002f3735146f1 in _start(zx_handle_t) ../../zircon/system/ulib/c/Scrt1.cc:7 <<VMO#1007304=/boot/bin/crasher>>+0x3b6f1 sp 0x43cf4e707fe0 |
| [10023.918][klog][klog][I] #5 0x0000000000000000 is not covered by any module sp 0x43cf4e707ff0 |
| ``` |
| |
| ### Manually requesting backtraces |
| |
| Akin to printf debugging, one can request crashsvc to print a backtrace at a |
| particular point in your code. |
| |
| Include this header from `//src/lib/debug` library, which you must |
| depend on in your target's BUILD.gn rules: |
| |
| ``` |
| #include "src/lib/debug/backtrace-request.h" |
| ``` |
| |
| and then add the following where you want the backtrace printed: |
| |
| ``` |
| void my_function() { |
| ... |
| backtrace_request_all_threads(); |
| |
| // Or the following version for only the current thread. |
| backtrace_request_current_thread(); |
| ... |
| } |
| ``` |
| |
| ### 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/monitoring/fidlcat/README.md). |