# CKB VM Debug Utils
Utilities aiding CKB VM debug, including the following components:
* gdb remote debugging support
* standard IO components, so you can debug with printf as you wish
# How to use it
While this library contains components to plugin to your CKB VM runtime, we also prepare a bare metal binary showcasing how to use the components. Notice for now this binary only runs simple RISC-V programs, it doesn't support syscalls used in CKB. Later we might combine this with [ckb-standalone-debugger](https://github.com/nervosnetwork/ckb-standalone-debugger) to create a unified debugging experience for CKB.
```bash
$ cat program.c
int power(int, int);
int main() {
int i, result;
for (i = 0; i < 10; i++) {
result += power(2, i);
}
return result;
}
int power(int base, int n) {
int i, p;
p = 1;
for (i = 1; i <= n; i++) p = p * base;
return p;
}
$ git clone https://github.com/nervosnetwork/ckb-vm-debug-utils
$ cd ckb-vm-debug-utils
$ cargo build
$ riscv64-unknown-elf-gcc -g ../program.c -o program
$ ./target/debug/baremetal 0.0.0.0:2000 program
```
Now CKB VM's debug server has been started, in a different terminal, we can launch gdb:
```bash
$ cd ckb-vm-debug-utils
$ gdb program
(gdb) target remote localhost:2000
Remote debugging using localhost:2000
0x00000000000100c8 in _start ()
(gdb) b main
Breakpoint 1 at 0x101ba: file program.c, line 6.
(gdb) c
Continuing.
Breakpoint 1, main () at program.c:6
6 for (i = 0; i < 10; i++) {
(gdb) s
7 result += power(2, i);
(gdb) print i
$1 = 0
(gdb)
```
As we can see, gdb works here.