FreeBSD 핸드북 : 커널 디버깅 : 원격 GDB를 이용한 온라인 커널 디버깅
Previous: DDB를 이용한 온라인 커널 디버깅
Next: 콘솔 드라이버의 디버깅

22.4. 원격 GDB를 이용한 온라인 커널 디버깅

이 기능은 FreeBSD 2.2 부터 지원해온 것이며, 매우 새로운 기능입니다.

GDB는 이미 오랫동안 *원격 디버깅*을 지원했습니다. 디버깅은 시리얼 라인을 통해 매우 간단한 프로토콜을 사용하여 이루어집니다. 위에서 언급했던 다른 방법들과 달리, 이 작업을 위해서는 두 대의 시스템이 필요합니다. 하나는 모든 소스와 모든 디버깅 심볼이 담긴 커널 바이너리의 복사판을 포함하는 디버깅 환경을 제공하는 호스트이고, 다른 한대는 디버깅 정보를 떼어낸 같은 커널이 실행되고 있는 디버깅 하고자 하는 호스트입니다.

커널 설정 파일에 DDB 를 포함하여 config -g 을 실행하고, 일반적인 방법으로 커널을 컴파일합니다. 그 결과 디버깅 정보로 인하여 큰 크기의 바이너리 파일을 제공합니다. 이 커널을 타겟 머신으로 복사하고, strip -x 명령으로 디버깅 심볼을 떼어낸 다음 -d 부팅 옵션을 사용하여 부팅합니다. 타겟 머신의 첫번째 시리얼 라인을 디버깅 호스트의 임의의 시리얼 라인에 연결합니다. 디버깅 머신 상에서 컴파일 디렉토리로 가서 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) 

이 세션은 다른 어떤 세션들에서도 사용할 수 있습니다. 예로서 Emacs 내에서 (또 다른 Emacs 창에 자동으로 소스 코드를 출력하는) GUD 모드로 동작함으로써 전체 소스를 억세스 할 수도 있습니다.

또한, 원격 GDB는 LKM들을 디버깅할 때에도 사용할 수 있습니다. 첫번째로, LKM이 디버깅 심볼을 포함하도록 빌드합니다.

# cd /usr/src/lkm/linux
# make clean; make COPTS=-g

그 후에 이 모듈을 타겟 머신에 인스톨 하고, 로딩한 다음 어느 부분에 로딩했는지 파악하기 위해 modstat을 사용합니다.

# linux
# modstat
Type     Id Off Loadaddr Size Info     Rev Module Name
EXEC      0   4 f5109000 001c f510f010   1 linux_mod

모듈의 로딩 어드레스를 취하여 0x20(a.out 헤더의 크기를 고려합니다)를 더합니다. 이 계산으로 나오는 주소는 모듈 코드가 재위치된 주소가 됩니다. 디버거에게 해당 모듈에 대해 알려주기 위해 GDB에서 add-symbol-file 명령을 사용합니다.

(kgdb) add-symbol-file /usr/src/lkm/linux/linux_mod.o 0xf5109020
add symbol table from file "/usr/src/lkm/linux/linux_mod.o" at
text_addr = 0xf5109020?
(y or n) y
(kgdb)

이후로는 LKM 내의 모든 심볼들을 억세스 할 수 있게 됩니다.


FreeBSD 핸드북 : 커널 디버깅 : 원격 GDB를 이용한 온라인 커널 디버깅
Previous: DDB를 이용한 온라인 커널 디버깅
Next: 콘솔 드라이버의 디버깅