SlideShare a Scribd company logo
리눅스 커널 디버거 KGDB/KDB
2015.08.31
SW Maestro 과정 연수생 한만종
리눅스 커널 디버거
• KGDB (v2.6.26 +)
• KDB (v2.6.35 +)
KGDB란?
• linsyssoft.com에서 진행했던 소스 레벨 리눅스 커널 디버거.
v2.6.26부터 리눅스 메인라인에 포함.
• 타깃보드에 접속해 GDB를 원격으로 사용할 수 있는 환경을 커널
에서 제공.
KGDB를 사용하려면
• 두 대 이상의 머신이 필요 (개발머신과 테스트머신)
• 테스트 머신에서는 v2.6.26 이상의 버전과 KGDB 옵션이 켜진
커널 필요
• 개발 머신에서는 GDB 필요
• 개발 머신과 테스트 머신은 시리얼 또는 이더넷 통신을 사용
KGDB 사용하기
1. 테스트 머신 커널 빌드
CONFIG_DEBUG_INFO=y
# CONFIG_DEBUG_RODATA is not set
CONFIG_FRAME_POINTER=y
CONFIG_KGDB=y
CONFIG_KGDB_SERIAL_CONSOLE=y
KGDB 사용하기
2. 테스트 머신(QEMU) 구동 및 개발 머신과 연결(시리얼)
$ qemu-system-x86_64 -kernel bzImage -append
"kgdboc=ttyS0,115200" -serial pty
KGDB 사용하기
2. 테스트 머신(QEMU) 구동 및 개발 머신과 연결(시리얼)
$ qemu-system-x86_64 -kernel bzImage -append
"kgdboc=ttyS0,115200" -serial pty
리눅스 커널 이미지
앞서 빌드한 커널로 부팅
KGDB 사용하기
2. 테스트 머신(QEMU) 구동 및 개발 머신과 연결(시리얼)
$ qemu-system-x86_64 -kernel bzImage -append
"kgdboc=ttyS0,115200" -serial pty
커널 커맨드 라인 인자 kgdboc 옵션을 이용하여
ttyS0 장치에 115200Bd로 연결
KGDB 사용하기
2. 테스트 머신(QEMU) 구동 및 개발 머신과 연결(시리얼)
$ qemu-system-x86_64 -kernel bzImage -append
"kgdboc=ttyS0,115200" -serial pty
커널 커맨드 라인 인자 kgdboc 옵션을 이용하여
ttyS0 장치에 115200Bd로 연결
?
kgdboc와 kgdboe
• KGDB는 시리얼 및 이더넷 통신 가능
• sysfs 또는 커널 부트 옵션에서 지정 가능
kgdboc
• “KGDB Over Console”
• 시리얼 콘솔 장치를 프라이머리 콘솔로 이용할 경우 사용
• CONFIG_KGDBOC=y
• kgdboc=<tty-device-port>, [baud]
• echo <tty-device-port> > /sys/module/kgdboc/
parameters/kgdboc
kgdboe
• “KGDB Over Ethernet”
• 같은 LAN에 연결되어 있는 테스트 머신에 접속할 경우 사용
• 사용중인 이더넷 장치의 드라이버에 NETPOLL API가 구현되어
있어야 함. 또한, 사용중인 커널이 NETPOLL을 지원해야 함
• kgdboe=[src-port]@<src-ip>/[dev],[tgt-port]@<tgt-ip>/
[tgt-macaddr]
• echo “@/,@10.0.0.2/” > /sys/module/kgdboe/
parameters/kgdboe
KGDB 사용하기
2. 테스트 머신(QEMU) 구동 및 개발 머신과 연결(시리얼)
$ qemu-system-x86_64 -kernel bzImage -append
"kgdboc=ttyS0,115200" -serial pty
시리얼 디바이스
리눅스 가상터미널 장치
pty에 시리얼 연결
KGDB 사용하기
2. 테스트 머신(QEMU) 구동 및 개발 머신과 연결(시리얼)
$ qemu-system-x86_64 -kernel bzImage -append
"kgdboc=ttyS0,115200" -serial pty
KGDB 사용하기
2. 테스트 머신(QEMU) 구동 및 개발 머신과 연결(시리얼)
$ qemu-system-x86_64 -kernel bzImage -append
"kgdboc=ttyS0,115200" -serial pty
KGDB 사용하기
3. 개발머신에서 gdb 실행 및 테스트머신과 연결
$ gdb -q vmlinux
(gdb) set serial baud 115200
(gdb) target remote /dev/pts/24
KGDB는
• GDB를 커널 디버깅에도 사용할 수 있다!
• GDB로 제어권이 넘어오는 시점은?
1. 커널패닉/웁스가 발생했을 경우
2. breakpoint에 도달했을 경우
3. MagicSysrq 키를 눌렀을 경우 (CONFIG_MAGIC_SYSRQ)
KGDB는
• 강제로 GDB로 제어권을 넘기고 싶다면?
MagicSysrq키를 누른다.
(누를 수 없는 상황이라면 다음과 같은 명령어 사용.)
# echo g > /proc/sysrq-trigger
KGDB는
• MagicSysrq키를 누르는 것이 번거롭다면..
다음과 같이 시스템콜 sync()를 이용한다.
1. 우선 다음과 같이 sys_sync에 breakpoint를 걸어둔다.
(gdb) break sys_sync
2. 디버깅이 필요한 경우, 다음과 같이 sync를 실행하여 KGDB로
제어권을 넘긴다.
# sync
KDB란?
• SGI에서 오픈소스 프로젝트로 진행했던 내장 커널 디버거.
v2.6.35부터 리눅스 메인라인에 포함.
• 브레이크포인트 설정, 메모리 및 자료구조 확인 등을 별도의 외부
시스템 없이 단독으로 가능케함.
KDB를 사용하려면
• 원격 시리얼 접속이 가능한 환경
• v2.6.35 이상의 버전과 CONFIG_KGDB_KDB 커널 빌드 옵션
이 켜진 커널 필요
KDB 사용하기
1. KDB의 사용이 가능한 커널 빌드
CONFIG_KGDB_KDB=y
KDB 사용하기
2. 테스트머신(QEMU) 구동 및 KDB 진입
$ qemu-system-x86_64 -kernel bzImage -hda
rootfs.img -serial pty -append “console=ttyS0,115200
kgdboc=ttyS0 root=/dev/sda”
KDB 사용하기
2. 테스트머신(QEMU) 구동 및 KDB 진입
$ qemu-system-x86_64 -kernel bzImage -hda
rootfs.img -serial pty -append “console=ttyS0,115200
kgdboc=ttyS0 root=/dev/sda”
KDB 사용하기
3. 원격 터미널(minicom)로 테스트머신에 접속
$ minicom -p /dev/pts/24 -b 115200
KDB 사용하기
4. 커널 웁스, 폴트가 발생할 때 KDB로 진입할 수 있으며, 커널 빌
드 config 중 하나인 CONFIG_MAGIC_SYSRQ를 켰었다면 다
음과 같이 수동으로 진입할 수도 있다.
# echo g > /proc/sysrq-trigger
KDB는
• “help” 명령어를 통해 더 많은 명령어들을 볼 수 있다.
• 몇 개의 유용한 명령어들은 다음과 같다.
lsmod - 로드된 커널 모듈 리스트
ps - 현재 동작중인 프로세스 목록
ps A - 모든 프로세스 목록
summary - 커널 버전 정보, 메모리 사용량
bt - 현재 프로세스의 backtrace 출력
dmesg - 커널 syslog 버퍼 출력
go - 시스템을 계속 재개
KGDB/KDB 연동하기
1. 테스트머신(QEMU) 구동
$ qemu-system-x86_64 -kernel bzImage -hda
rootfs.img -serial pty -append “console=ttyS0,115200
kgdboc=ttyS0 root=/dev/sda”
KGDB/KDB 연동하기
2. agent-proxy 다운로드하기
$ git clone git://git.kernel.org/pub/scm/utils/kernel/
kgdb/agent-proxy.git
$ cd agent-proxy
$ make
KGDB/KDB 연동하기
3. agent-proxy를 통해 kgdb와 kdb를 모두 연결할 수 있도록 셋
팅하기 (gdb 접속 1234 포트, console 접속 4567 포트)
$ agent-proxy 1234^4567 0 /dev/pts/0,115200
KGDB/KDB 연동하기
4. console에 접속
$ telnet localhost 1234
KGDB/KDB 연동하기
4. 커널 패닉/웁스 발생 시 KDB로 제어 가능
KGDB/KDB 연동하기
5. KDB에서 KGDB로 제어를 넘기려면 <테스트머신에서>
kdb> kgdb
KGDB/KDB 연동하기
5. KDB에서 KGDB로 제어를 넘기려면 <호스트머신에서>
$ gdb -q vmlinux
KGDB/KDB 연동하기
6. gdb에서 monitor 명령을 이용하면 lsmod, ps, dmesg 등과
같이 KDB에서 사용가능한 명령어를 바로 사용할 수 있다.
$ monitor lsmod
KGDB/KDB 연동하기
7. 다음 명령어를 사용하면 다시 KDB로 제어를 넘긴다.
$ maint packet 3
참고문헌
• http://studyfoss.egloos.com/5490783
• http://studyfoss.egloos.com/5491083
• http://studyfoss.egloos.com/5491211
• https://www.kernel.org/pub/linux/kernel/people/jwessel/kdb/index.html
• https://kgdb.wiki.kernel.org/index.php/
Main_Page#The_new_KDB_and_KGDB_documentation_.28kernel_.3E.
3D_2.6.35.29
• http://www.makelinux.net/books/lkd2/ch18lev1sec8
• http://oss.sgi.com/projects/kgdb/
• http://pds11.egloos.com/pds/200811/14/28/linuxdebug3-wankyuk.pdf
감사합니다.

More Related Content

리눅스 커널 디버거 KGDB/KDB

  • 1. 리눅스 커널 디버거 KGDB/KDB 2015.08.31 SW Maestro 과정 연수생 한만종
  • 2. 리눅스 커널 디버거 • KGDB (v2.6.26 +) • KDB (v2.6.35 +)
  • 3. KGDB란? • linsyssoft.com에서 진행했던 소스 레벨 리눅스 커널 디버거. v2.6.26부터 리눅스 메인라인에 포함. • 타깃보드에 접속해 GDB를 원격으로 사용할 수 있는 환경을 커널 에서 제공.
  • 4. KGDB를 사용하려면 • 두 대 이상의 머신이 필요 (개발머신과 테스트머신) • 테스트 머신에서는 v2.6.26 이상의 버전과 KGDB 옵션이 켜진 커널 필요 • ��발 머신에서는 GDB 필요 • 개발 머신과 테스트 머신은 시리얼 또는 이더넷 통신을 사용
  • 5. KGDB 사용하기 1. 테스트 머신 커널 빌드 CONFIG_DEBUG_INFO=y # CONFIG_DEBUG_RODATA is not set CONFIG_FRAME_POINTER=y CONFIG_KGDB=y CONFIG_KGDB_SERIAL_CONSOLE=y
  • 6. KGDB 사용하기 2. 테스트 머신(QEMU) 구동 및 개발 머신과 연결(시리얼) $ qemu-system-x86_64 -kernel bzImage -append "kgdboc=ttyS0,115200" -serial pty
  • 7. KGDB 사용하기 2. 테스트 머신(QEMU) 구동 및 개발 머신과 연결(시리얼) $ qemu-system-x86_64 -kernel bzImage -append "kgdboc=ttyS0,115200" -serial pty 리눅스 커널 이미지 앞서 빌드한 커널로 부팅
  • 8. KGDB 사용하기 2. 테스트 머신(QEMU) 구동 및 개발 머신과 연결(시리얼) $ qemu-system-x86_64 -kernel bzImage -append "kgdboc=ttyS0,115200" -serial pty 커널 커맨드 라인 인자 kgdboc 옵션을 이용하여 ttyS0 장치에 115200Bd로 연결
  • 9. KGDB 사용하기 2. 테스트 머신(QEMU) 구동 및 개발 머신과 연결(시리얼) $ qemu-system-x86_64 -kernel bzImage -append "kgdboc=ttyS0,115200" -serial pty 커널 커맨드 라인 인자 kgdboc 옵션을 이용하여 ttyS0 장치에 115200Bd로 연결 ?
  • 10. kgdboc와 kgdboe • KGDB는 시리얼 및 이더넷 통신 가능 • sysfs 또는 커널 부트 옵션에서 지정 가능
  • 11. kgdboc • “KGDB Over Console” • 시리얼 콘솔 장치를 프라이머리 콘솔로 이용할 경우 사용 • CONFIG_KGDBOC=y • kgdboc=<tty-device-port>, [baud] • echo <tty-device-port> > /sys/module/kgdboc/ parameters/kgdboc
  • 12. kgdboe • “KGDB Over Ethernet” • 같은 LAN에 연결되어 있는 테스트 머신에 접속할 경우 사용 • 사용중인 이더넷 장치의 드라이버에 NETPOLL API가 구현되어 있어야 함. 또한, 사용중인 커널이 NETPOLL을 지원해야 함 • kgdboe=[src-port]@<src-ip>/[dev],[tgt-port]@<tgt-ip>/ [tgt-macaddr] • echo “@/,@10.0.0.2/” > /sys/module/kgdboe/ parameters/kgdboe
  • 13. KGDB 사용하기 2. 테스트 머신(QEMU) 구동 및 개발 머신과 연결(시리얼) $ qemu-system-x86_64 -kernel bzImage -append "kgdboc=ttyS0,115200" -serial pty 시리얼 디바이스 리눅스 가상터미널 장치 pty에 시리얼 연결
  • 14. KGDB 사용하기 2. 테스트 머신(QEMU) 구동 및 개발 머신과 연결(시리얼) $ qemu-system-x86_64 -kernel bzImage -append "kgdboc=ttyS0,115200" -serial pty
  • 15. KGDB 사용하기 2. 테스트 머신(QEMU) 구동 및 개발 머신과 연결(시리얼) $ qemu-system-x86_64 -kernel bzImage -append "kgdboc=ttyS0,115200" -serial pty
  • 16. KGDB 사용하기 3. 개발머신에서 gdb 실행 및 테스트머신과 연결 $ gdb -q vmlinux (gdb) set serial baud 115200 (gdb) target remote /dev/pts/24
  • 17. KGDB는 • GDB를 커널 디버깅에도 사용할 수 있다! • GDB로 제어권이 넘어오는 시점은? 1. 커널패닉/웁스가 발생했을 경우 2. breakpoint에 도달했을 경우 3. MagicSysrq 키를 눌렀을 경우 (CONFIG_MAGIC_SYSRQ)
  • 18. KGDB는 • 강제로 GDB로 제어권을 넘기고 싶다면? MagicSysrq키를 누른다. (누를 수 없는 상황이라면 다음과 같은 명령어 사용.) # echo g > /proc/sysrq-trigger
  • 19. KGDB는 • MagicSysrq키를 누르는 것이 번거롭다면.. 다음과 같이 시스템콜 sync()를 이용한다. 1. 우선 다음과 같이 sys_sync에 breakpoint를 걸어둔다. (gdb) break sys_sync 2. 디버깅이 필요한 경우, 다음과 같��� sync를 실행하여 KGDB로 제어권을 넘긴다. # sync
  • 20. KDB란? • SGI에서 오픈소스 프로젝트로 진행했던 내장 커널 디버거. v2.6.35부터 리눅스 메인라인에 포함. • 브레이크포인트 설정, 메모리 및 자료구조 확인 등을 별도의 외부 시스템 없이 단독으로 가능케함.
  • 21. KDB를 사용하려면 • 원격 시리얼 접속이 가능한 환경 • v2.6.35 이상의 버전과 CONFIG_KGDB_KDB 커널 빌드 옵션 이 켜진 커널 필요
  • 22. KDB 사용하기 1. KDB의 사용이 가능한 커널 빌드 CONFIG_KGDB_KDB=y
  • 23. KDB 사용하기 2. 테스트머신(QEMU) 구동 및 KDB 진입 $ qemu-system-x86_64 -kernel bzImage -hda rootfs.img -serial pty -append “console=ttyS0,115200 kgdboc=ttyS0 root=/dev/sda”
  • 24. KDB 사용하기 2. 테스트머신(QEMU) 구동 및 KDB 진입 $ qemu-system-x86_64 -kernel bzImage -hda rootfs.img -serial pty -append “console=ttyS0,115200 kgdboc=ttyS0 root=/dev/sda”
  • 25. KDB 사용하기 3. 원격 터미널(minicom)로 테스트머신에 접속 $ minicom -p /dev/pts/24 -b 115200
  • 26. KDB 사용하기 4. 커널 웁스, 폴트가 발생할 때 KDB로 진입할 수 있으며, 커널 빌 드 config 중 하나인 CONFIG_MAGIC_SYSRQ를 켰었다면 다 음과 같이 수동으로 진입할 수도 있다. # echo g > /proc/sysrq-trigger
  • 27. KDB는 • “help” 명령어를 통해 더 많은 명령어들을 볼 수 있다. • 몇 개의 유용한 명령어들은 다음과 같다. lsmod - 로드된 커널 모듈 리스트 ps - 현재 동작중인 프로세스 목록 ps A - 모든 프로세스 목록 summary - 커널 버전 정보, 메모리 사용량 bt - 현재 프로세스의 backtrace 출력 dmesg - 커널 syslog 버퍼 출력 go - 시스템을 계속 재개
  • 28. KGDB/KDB 연동하기 1. 테스트머신(QEMU) 구동 $ qemu-system-x86_64 -kernel bzImage -hda rootfs.img -serial pty -append “console=ttyS0,115200 kgdboc=ttyS0 root=/dev/sda”
  • 29. KGDB/KDB 연동하기 2. agent-proxy 다운로드하기 $ git clone git://git.kernel.org/pub/scm/utils/kernel/ kgdb/agent-proxy.git $ cd agent-proxy $ make
  • 30. KGDB/KDB 연동하기 3. agent-proxy를 통해 kgdb와 kdb를 모두 연결할 수 있도록 셋 팅하기 (gdb 접속 1234 포트, console 접속 4567 포트) $ agent-proxy 1234^4567 0 /dev/pts/0,115200
  • 31. KGDB/KDB 연동하기 4. console에 접속 $ telnet localhost 1234
  • 32. KGDB/KDB 연동하기 4. 커널 패닉/웁스 발생 시 KDB로 제어 가능
  • 33. KGDB/KDB 연동하기 5. KDB에서 KGDB로 제어를 넘기려면 <테스트머신에서> kdb> kgdb
  • 34. KGDB/KDB 연동하기 5. KDB에서 KGDB로 제어를 넘기려면 <호스트머신에서> $ gdb -q vmlinux
  • 35. KGDB/KDB 연동하기 6. gdb에서 monitor 명령을 이용하면 lsmod, ps, dmesg 등과 같이 KDB에서 사용가능한 명령어를 바로 사용할 수 있다. $ monitor lsmod
  • 36. KGDB/KDB 연동하기 7. 다음 명령어를 사용하면 다시 KDB로 제어를 넘긴다. $ maint packet 3
  • 37. 참고문헌 • http://studyfoss.egloos.com/5490783 • http://studyfoss.egloos.com/5491083 • http://studyfoss.egloos.com/5491211 • https://www.kernel.org/pub/linux/kernel/people/jwessel/kdb/index.html • https://kgdb.wiki.kernel.org/index.php/ Main_Page#The_new_KDB_and_KGDB_documentation_.28kernel_.3E. 3D_2.6.35.29 • http://www.makelinux.net/books/lkd2/ch18lev1sec8 • http://oss.sgi.com/projects/kgdb/ • http://pds11.egloos.com/pds/200811/14/28/linuxdebug3-wankyuk.pdf