-
Notifications
You must be signed in to change notification settings - Fork 48
Using KGDB to debug Linux
Please see our documentation site for the latest version of this page.
While user-space programs can be debugged with regular GDB (in combination with gdbserver), this is not the case for debugging the kernel. gdbserver is a user-space program itself and cannot control the kernel. KGDB, Kernel GDB, solves this by acting as a gdbserver that is inside the kernel.
Your kernel configuration needs to have the following options set:
CONFIG_KGDB
CONFIG_KGDB_SERIAL_CONSOLE
Use the kgdboc option on the kernel boot args to tell KGDB which serial port to use. Kernel bootargs can be modified in the DTS file or can be passed via bootloader if it is used.
Examples:
- One serial port, KGDB is shared with console:
console=ttyS0,115200n8 kgdboc=ttyS0,115200
- Two serial ports, one for console, another for KGDB:
console=ttyS0,115200n8 kgdboc=ttyS1,115200
These examples assume you want to attach gdb to the kernel at a later stage. Alternatively, you can add the kgdbwait option to the command line. With kgdbwait, the kernel waits for a debugger to attach at boot time. In the case of two serial ports, the kernel command line looks like the following:
console=ttyS0,115200n8 kgdboc=ttyS1,115200 kgdbwait
After the kernel is set up, you can start the debugging session. To connect to your target using a serial connection, you need to have a development PC with UART that runs GDB and a terminal program.
First, stop the kernel on the target using a SysRq trigger. To do so, send a 'remote break command using your terminal program, followed by the character 'g':
- using minicom:
Ctrl-a, f, g
- using Tera Term:
Alt-b, g
You must also stop the kernel if you have two UARTs, even though one of the two UARTs is dedicated to KGDB.
After stopping the kernel, connect GDB:
$ arc-elf32-gdb vmlinux
(gdb) set remotebaud 115200
(gdb) target remote /dev/ttyUSB0
You are then connected to the target and can use GDB like any other program. For instance, you can set a breakpoint now using b <identifier>
and then continue kernel execution again using c
.