Эта возможность поддерживается во FreeBSD начиная с версии 2.2, и она на самом деле очень удобна.
В GDB уже давно имеется поддержка удаленной отладки. Это делается при помощи весьма простого протокола по последовательному каналу. В отличие от других методов, описанных выше, для этого вам требуется наличие двух машин. Одна из них является хостом, предоставляющим ресурсы для отладки, включая все исходные тексты и копию ядра со всеми символами в нем, а другая является целевой машиной, на которой запущена та же копия того же ядра (но без отладочной информации).
Вы должны настроить исследуемое ядро при помощи команды config -g, включить DDB в конфигурацию и откомпилировать его обычным образом. Это даст большой объем получаемого бинарного файла из-за отладочной информации. Скопируйте это ядро на целевую машину, усеките отладочную информацию командой strip -x и загрузите это ядро с использованием параметра загрузки -d. Подключите последовательный канал целевой машины, имеющий установленные флаги "flags 080" на соответствующем устройстве sio к любому последовательному каналу отладочного хоста. А теперь на отладочной машине перейдите в каталог компиляции целевого ядра и запустите gdb:
% gdb -k kernel GDB is free software and you are welcome to distribute copies of it under certain conditions; type "show copying" to see the conditions. There is absolutely no warranty for GDB; type "show warranty" for details. GDB 4.16 (i386-unknown-freebsd), Copyright 1996 Free Software Foundation, Inc... (kgdb)
Проинициализируйте сеанс удаленной отладки (предполагается, что используется первый последовательный порт) такой командой:
(kgdb) target remote /dev/cuaa0
Теперь на целевом хосте (тот, который перешел в DDB даже до начала процесса обнаружения устройств) наберите:
Debugger("Boot flags requested debugger") Stopped at Debugger+0x35: movb $0, edata+0x51bc db> gdb
DDB ответит следующим:
Next trap will enter GDB remote protocol mode
Каждый раз, когда вы будете набирать gdb, режим будет меняться между удаленным GDB и локальным DDB. Чтобы немедленно вызвать следующее прерывание, просто наберите s (step). Ваш хостирующий GDB получит управление над целевым ядром:
Remote debugging using /dev/cuaa0 Debugger (msg=0xf01b0383 "Boot flags requested debugger") at ../../i386/i386/db_interface.c:257 (kgdb)
Вы можете работать в этом сеансе точно также, как и в любом другом сеансе GDB, включая полный доступ к исходным текстам, запуск его в режиме gud-mode внутри окна Emacs (что дает вам автоматический вывод исходного кода в другом окне Emacs) и тому подобное.