Remote debugging the kernel
FreeBSD supports remote debugging using a serial interface. Since most virtual solutions support serial interfaces it can be quite convenient to deploy a kernel and start a debug session on another machine.
The setup assumes two (virtual) machines with a serial (rs232) connection in between.
Configure and build a kernel
Use our toolchain described in detail here and add the following options
to your SMP file in /usr/tools/config/[VERSION]/SMP
#nomakeoptions DEBUG
options GDB # Support remote GDB.
makeoptions DEBUG=-g
Next clean and build a kernel
make clean-obj,kernel kernel
Install the kernel on test vm
With the build finished, we should have a kernel package on the build machine available at the following location:
/usr/local/opnsense/build/[Version]/[Architecture]/sets/kernel*.txz
Copy this package to the test vm and install it using our opnsense-update command:
opnsense-update -ikfr [version] -l /location/from/
Where [version] is the version part of the kernel package, such as 19.1.2
Configure the test vm
To be able to connect to the test machine using kgdb, you need to make sure some settings are set.
Edit /boot/device.hints and change or add hint.uart.0.flags to the following:
hint.uart.0.flags="0xc0"
Also /boot/loader.conf.local should have a baud-rate configured for the serial device:
comconsole_speed="115200"
Test your setup
Login to the test machine and force a debug session in gdb, using the following commands:
# sysctl debug.kdb.current=gdb
# sysctl debug.kdb.enter=1
db> gdb
Step to enter the remote GDB backend.
db> c (continue)
Then go to the build machine, make sure gdb is installed (pkg install gdb) and go to the directory where
the debug symbols are and start a session, ask a backtrace bt and continue normal operation c:
