이 기능은 FreeBSD 2.2부터 지원된 기능이며, 상당히 기막힌 기능입니다.
GDB는 이미 오래 전부터 *원격 디버깅*을 지원했습니다. 디버깅은 시리얼 라인을 통해 매우 간단한 프로토콜을 사용하여 이루어집니다. 위에서 언급했던 다른 방법들과 달리, 이 작업을 위해서는 두 대의 시스템이 필요합니다. 한 대는 모든 소스들과, 디버깅용 심볼을 포함한 커널 바이너리들의 복사본들을 포함한 디버깅 환경을 제공하는 호스트가 되고, 다른 한 대는 동일한 커널이 동작하고 있는 타겟 머신이 됩니다(디버깅 정보가 제거된 커널).
설정 파일에 DDB 옵션을 포함하고, config -g 명령으로 커널 설정을 한 다음에 일반적인 방법으로 커널을 컴파일 합니다. 그 결과 디버깅 정보로 인한 매우 큰 크기의 바이너리 파일이 생성됩니다. strip -x 명령으로 디버깅용 심볼을 제거하여 타겟 시스템에 복사하고, -d 부팅 옵션으로 부팅합니다. 자신의 sio 장치에 "flags 080"을 설정한 타겟 시스템의 시리얼 라인을 디버깅 호스트의 임의의 시리얼 라인에 연결합니다. 이제 디버깅 호스트 상에서 타겟 커널의 컴파일 디렉토리로 이동한 다음 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> gdbDDB는 다음과 같이 응답할 것입니다.
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)이 세션은 gud 모드로 동작하는 Emacs 창(다른 Emacs 창에 자동으로 소스 코드를 출력하는) 내에서의 소스에 대한 전체 억세스 등을 포함하여, 다른 GDB 세션들 처럼 사용할 수 있습니다.