커널 디버거인 KDB 를 이용해서 원격으로 커널 레벨 디버깅을 하는 방법에 대해 다룬다.
앞서 설명했던 KGDB 와 이름도 비슷하다. 커널 디버거 사용하기 - 1.KGDB 에서 설명한 KGDB 와 어떤 다른점이 있을까?
가장 큰 차이라고 한다면, 소스레벨 디버깅이 불가능하다는 것이다. 하지만, KGDB 에 비해 간편한 설정과 개인적으로 좀더 커널패닉시 유용하게 사용될 수 있을 것 같다는 생각을 한다. 또한 모든 커널 버전을 지원하기 때문에 커널버전에 관계없이 사용할 수 있다. 끝으로 호스트와 타겟을 분리하지 않고, 타겟에서 바로 실행이 가능하다. 정확한 이유는 마지막에 가면, 자연스럽게 이해하게 될 것이다.
KDB 역시, 기본커널에 KDB 패치를 가한 후에 사용하는 방법을 취하고 있다.
준비 운동하기
ftp://oss.sgi.com/projects/kdb/download/ 에서 다운로드 받을 수 있다. 앞에서도 언급했듯이 모든 리눅스 커널에 관계없이 사용이 가능하다.
여기서는 kdb-v4.4-2.6.8-rc4-common-1.bz2, kdb-v4.4-2.6.8-rc4-i386-1.bz2 를 다운로드 받았다.
테스트 환경은 다음과 같다.
타겟(=호스트) | |
아키텍처 | X86 |
OS | Debian(stable) |
커널 | 2.6.8 |
KDB 패치 및 커널 컴파일
앞에서 받은 KDB 의 압축을 풀고, 커널에 패치를 가한다.
#cd /home/fat81 #bzip2 -d kdb-v4.4-2.6.8-rc4-common-1.bz2 #bzip2 -d kdb-v4.4-2.6.8-rc4-i386-1.bz2 #tar xzf linux-2.6.8.tar.gz #mv linux /usr/src/linux-2.6.8 #cd /usr/src #ln -s linux-2.6.8 linux #cd linux #patch -p1 < /home/fat81/kdb-v4.4-2.6.8-rc4-common-1 #patch -p1 < /home/fat81/kdb-v4.4-2.6.8-rc4-i386-1 #make menuconfig
KDB 역시 새롭게 추가된 커널 옵션이 보일 것이다.
'Kernel hacking → Built-in Kernel Debugger support' 가 그것이다.
커널 옵션에 추가해야할 것들은 다음과 같다.
[*]Built-in Kernel Debugger support [*]KDB modules [*]Compile the kernel with frame pointer
나머지 다른 옵션들은 기본설정으로 한다. 이제 커널 컴파일을 할 차례다.
#make-kpkg binary-arch
KDB 사용하기
컴파일 후에 생성된 두개의 .deb 파일을 설치하고, 재부팅 한다.
이때 새로 컴파일한 커널로 부팅한다.
부팅 후에, 키보드에 있는 'Pause' 키를 누른다. 그러면 KDB 가 실행되면서,
kdb>
상태로 빠진다. 여기서 여러가지 명령어를 이용해서 디버깅할 수 있다. 빠져 나오려면, 'go' 명령어를 치면 된다.
원래 KDB 는 웁스나 커널 패닉이 발생하면, 자동으로 실행된다. 하지만, 그렇지 않은 경우에는 'Pause' 키를 사용해서 강제로 실행시킬 수 있다.