Attempting to use the kernel debugger over the serial port not working (well)

Patrick Mahan PMahan at
Fri Sep 24 21:02:31 UTC 2010


Cannot seem to find anything on the net to collaborate my experience
with remote KGDB over a serial port.

Here is my setup -

                |                          |                         |
               bce0                      eth1                       bce0
                |                          |                         |
    +-----------+--------------+   +-------+--------+    +-----------+-----------+
    |   HP Proliant GL360 G5   |   | Cyclades ACS32 |    | HP Proliant GL360 G5  |
    +-------------------+------+   +----+-----------+    +-----------------------+
                        |               |
                  ttyu0(uart0)        port 28
                        |               |

The Cyclades is a 32 port terminal server that has serial port 28 connected
to the DB9 locate on the back of the HP server.  I am running KGDB inside
of an emacs session on the Sony Vaio.

The HP's are running in 64-bit (amd64) FreeBSD 8.0.

The uart0 on the target is configured as (from dmesg.boot):

uart0: <16550 or compatible> port 0x3f8-0x3ff irq 4 flags 0x90 on acpi0
uart0: [FILTER]
uart0: console (9600,n,8,1)

The Cyclades port is configured the same.

My kernel is built with the following options:

options KDB
options DDB
options GDB

The kernel is built with -O2 -g

In /boot/loader.conf I have the following lines:

console="comconsole vidconsole"

I invoke the kernel debugger on the target using:

  'sysctl debug.kdb.enter=1'

Which gets me to the DB> prompt where I enter the following:

Step to enter the gdb debugger

I am invoking KGDB inside of emacs on the build server in the 'obj' tree
where the kernel build is located.

    kgdb -fullname kernel.debug

Once I have the gdb prompt, I enter the following target command:

   target remote

Where is the address of the Cyclades and port 7028 connects
me to serial port 28 on the Cyclades.

This brings up the kernel with the break point.  I then set my break
point(s) and enter 'c' to continue.

Sometimes the break points fire, sometimes they don't.  However, in some
indeterminant time (seconds) I start seeing the following on the
Video console (not the serial one).

Fatal double fault
rip = 0xffffffff8055bdc4
rsp = 0xffffff8078405000
rbp = 0xffffff8078405000
cpuid = 1; apic id = 01
panic: double fault
cpuid = 1
KDB: stack backtrace:
db_trace_self_wrapper() at db_trace_self_wrapper+0x2a
kdb_backtrace() at kdb_backtrace+0x32
mi_switch() at mi_switch+0x70
sched_bind() at sched_bind+0x60
boot() at boot+0x45
panic() at panic+0x1f2
dblfault_handler() at dblfault_handler+0xab
Xdblfault() at Xdblfault+0xac
--- trap 0x17, rip = 0xffffffff8055bdc4, rsp = 0xffffff8000017ff0, rbp = 0xffffff8078405000 ---
_thread_lock_flags() at _thread_lock_flags+0x4
critical_exit() at critical_exit+0x5d
spinlock_exit() at spinlock_exit+0x17
mi_switch() at mi_switch+0x6b

Then it repeats over and over again, the box becomes unresponsive and I am unable
to proceed.

My googling turned up this issue only in relation to lock order reversals, but I am not
seeing that issue here and I don't have the kernel compiled with 'options WITNESS'.

Any pointers would be appreciated.



More information about the freebsd-questions mailing list