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 커널 빌드 옵션
이 켜진 커널 필요
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 - 시스템을 계속 재개