리눅스 커널 디버거 KGDB/KDB
- 1. 리눅스 커널 디버거 KGDB/KDB
2015.08.31
SW Maestro 과정 연수생 한만종
- 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로 연결
?
- 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 커널 빌드 옵션
이 켜진 커널 필요
- 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”
- 30. KGDB/KDB 연동하기
3. agent-proxy를 통해 kgdb와 kdb를 모두 연결할 수 있도록 셋
팅하기 (gdb 접속 1234 포트, console 접속 4567 포트)
$ agent-proxy 1234^4567 0 /dev/pts/0,115200
- 35. KGDB/KDB 연동하기
6. gdb에서 monitor 명령을 이용하면 lsmod, ps, dmesg 등과
같이 KDB에서 사용가능한 명령어를 바로 사용할 수 있다.
$ monitor lsmod
- 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