리눅스 커널 디버거 kgdb/kdb

38
리눅스 커널 디버거 KGDB/KDB 2015.08.31 SW Maestro 과정 연수생 한만종

Upload: manjong-han

Post on 11-Apr-2017

1.580 views

Category:

Software


8 download

TRANSCRIPT

Page 1: 리눅스 커널 디버거 KGDB/KDB

리눅스 커널 디버거 KGDB/KDB2015.08.31

SW Maestro 과정 연수생 한만종

Page 2: 리눅스 커널 디버거 KGDB/KDB

리눅스 커널 디버거

• KGDB (v2.6.26 +)

• KDB (v2.6.35 +)

Page 3: 리눅스 커널 디버거 KGDB/KDB

KGDB란?• linsyssoft.com에서 진행했던 소스 레벨 리눅스 커널 디버거.

v2.6.26부터 리눅스 메인라인에 포함.

• 타깃보드에 접속해 GDB를 원격으로 사용할 수 있는 환경을 커널에서 제공.

Page 4: 리눅스 커널 디버거 KGDB/KDB

KGDB를 사용하려면

• 두 대 이상의 머신이 필요 (개발머신과 테스트머신)

• 테스트 머신에서는 v2.6.26 이상의 버전과 KGDB 옵션이 켜진 커널 필요

• 개발 머신에서는 GDB 필요

• 개발 머신과 테스트 머신은 시리얼 또는 이더넷 통신을 사용

Page 5: 리눅스 커널 디버거 KGDB/KDB

KGDB 사용하기1. 테스트 머신 커널 빌드

CONFIG_DEBUG_INFO=y # CONFIG_DEBUG_RODATA is not set CONFIG_FRAME_POINTER=y CONFIG_KGDB=y CONFIG_KGDB_SERIAL_CONSOLE=y

Page 6: 리눅스 커널 디버거 KGDB/KDB

KGDB 사용하기2. 테스트 머신(QEMU) 구동 및 개발 머신과 연결(시리얼)

$ qemu-system-x86_64 -kernel bzImage -append "kgdboc=ttyS0,115200" -serial pty

Page 7: 리눅스 커널 디버거 KGDB/KDB

KGDB 사용하기2. 테스트 머신(QEMU) 구동 및 개발 머신과 연결(시리얼)

$ qemu-system-x86_64 -kernel bzImage -append "kgdboc=ttyS0,115200" -serial pty

리눅스 커널 이미지

앞서 빌드한 커널로 부팅

Page 8: 리눅스 커널 디버거 KGDB/KDB

KGDB 사용하기2. 테스트 머신(QEMU) 구동 및 개발 머신과 연결(시리얼)

$ qemu-system-x86_64 -kernel bzImage -append "kgdboc=ttyS0,115200" -serial pty커널 커맨드 라인 인자 kgdboc 옵션을 이용하여

ttyS0 장치에 115200Bd로 연결

Page 9: 리눅스 커널 디버거 KGDB/KDB

KGDB 사용하기2. 테스트 머신(QEMU) 구동 및 개발 머신과 연결(시리얼)

$ qemu-system-x86_64 -kernel bzImage -append "kgdboc=ttyS0,115200" -serial pty커널 커맨드 라인 인자 kgdboc 옵션을 이용하여

ttyS0 장치에 115200Bd로 연결?

Page 10: 리눅스 커널 디버거 KGDB/KDB

kgdboc와 kgdboe

• KGDB는 시리얼 및 이더넷 통신 가능

• sysfs 또는 커널 부트 옵션에서 지정 가능

Page 11: 리눅스 커널 디버거 KGDB/KDB

kgdboc• “KGDB Over Console”

• 시리얼 콘솔 장치를 프라이머리 콘솔로 이용할 경우 사용

• CONFIG_KGDBOC=y

• kgdboc=<tty-device-port>, [baud]

• echo <tty-device-port> > /sys/module/kgdboc/parameters/kgdboc

Page 12: 리눅스 커널 디버거 KGDB/KDB

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

Page 13: 리눅스 커널 디버거 KGDB/KDB

KGDB 사용하기2. 테스트 머신(QEMU) 구동 및 개발 머신과 연결(시리얼)

$ qemu-system-x86_64 -kernel bzImage -append "kgdboc=ttyS0,115200" -serial pty

시리얼 디바이스리눅스 가상터미널 장치

pty에 시리얼 연결

Page 14: 리눅스 커널 디버거 KGDB/KDB

KGDB 사용하기2. 테스트 머신(QEMU) 구동 및 개발 머신과 연결(시리얼)

$ qemu-system-x86_64 -kernel bzImage -append "kgdboc=ttyS0,115200" -serial pty

Page 15: 리눅스 커널 디버거 KGDB/KDB

KGDB 사용하기2. 테스트 머신(QEMU) 구동 및 개발 머신과 연결(시리얼)

$ qemu-system-x86_64 -kernel bzImage -append "kgdboc=ttyS0,115200" -serial pty

Page 16: 리눅스 커널 디버거 KGDB/KDB

KGDB 사용하기3. 개발머신에서 gdb 실행 및 테스트머신과 연결

$ gdb -q vmlinux (gdb) set serial baud 115200 (gdb) target remote /dev/pts/24

Page 17: 리눅스 커널 디버거 KGDB/KDB

KGDB는• GDB를 커널 디버깅에도 사용할 수 있다!

• GDB로 제어권이 넘어오는 시점은? 1. 커널패닉/웁스가 발생했을 경우 2. breakpoint에 도달했을 경우 3. MagicSysrq 키를 눌렀을 경우 (CONFIG_MAGIC_SYSRQ)

Page 18: 리눅스 커널 디버거 KGDB/KDB

KGDB는• 강제로 GDB로 제어권을 넘기고 싶다면?

MagicSysrq키를 누른다.

(누를 수 없는 상황이라면 다음과 같은 명령어 사용.) # echo g > /proc/sysrq-trigger

Page 19: 리눅스 커널 디버거 KGDB/KDB

KGDB는• MagicSysrq키를 누르는 것이 번거롭다면..

다음과 같이 시스템콜 sync()를 이용한다.

1. 우선 다음과 같이 sys_sync에 breakpoint를 걸어둔다. (gdb) break sys_sync

2. 디버깅이 필요한 경우, 다음과 같이 sync를 실행하여 KGDB로 제어권을 넘긴다. # sync

Page 20: 리눅스 커널 디버거 KGDB/KDB

KDB란?• SGI에서 오픈소스 프로젝트로 진행했던 내장 커널 디버거.

v2.6.35부터 리눅스 메인라인에 포함.

• 브레이크포인트 설정, 메모리 및 자료구조 확인 등을 별도의 외부 시스템 없이 단독으로 가능케함.

Page 21: 리눅스 커널 디버거 KGDB/KDB

KDB를 사용하려면

• 원격 시리얼 접속이 가능한 환경

• v2.6.35 이상의 버전과 CONFIG_KGDB_KDB 커널 빌드 옵션이 켜진 커널 필요

Page 22: 리눅스 커널 디버거 KGDB/KDB

KDB 사용하기1. KDB의 사용이 가능한 커널 빌드

CONFIG_KGDB_KDB=y

Page 23: 리눅스 커널 디버거 KGDB/KDB

KDB 사용하기2. 테스트머신(QEMU) 구동 및 KDB 진입

$ qemu-system-x86_64 -kernel bzImage -hda rootfs.img -serial pty -append “console=ttyS0,115200 kgdboc=ttyS0 root=/dev/sda”

Page 24: 리눅스 커널 디버거 KGDB/KDB

KDB 사용하기2. 테스트머신(QEMU) 구동 및 KDB 진입

$ qemu-system-x86_64 -kernel bzImage -hda rootfs.img -serial pty -append “console=ttyS0,115200 kgdboc=ttyS0 root=/dev/sda”

Page 25: 리눅스 커널 디버거 KGDB/KDB

KDB 사용하기3. 원격 터미널(minicom)로 테스트머신에 접속

$ minicom -p /dev/pts/24 -b 115200

Page 26: 리눅스 커널 디버거 KGDB/KDB

KDB 사용하기4. 커널 웁스, 폴트가 발생할 때 KDB로 진입할 수 있으며, 커널 빌드 config 중 하나인 CONFIG_MAGIC_SYSRQ를 켰었다면 다음과 같이 수동으로 진입할 수도 있다.

# echo g > /proc/sysrq-trigger

Page 27: 리눅스 커널 디버거 KGDB/KDB

KDB는• “help” 명령어를 통해 더 많은 명령어들을 볼 수 있다.

• 몇 개의 유용한 명령어들은 다음과 같다.

lsmod - 로드된 커널 모듈 리스트 ps - 현재 동작중인 프로세스 목록 ps A - 모든 프로세스 목록 summary - 커널 버전 정보, 메모리 사용량 bt - 현재 프로세스의 backtrace 출력 dmesg - 커널 syslog 버퍼 출력 go - 시스템을 계속 재개

Page 28: 리눅스 커널 디버거 KGDB/KDB

KGDB/KDB 연동하기1. 테스트머신(QEMU) 구동

$ qemu-system-x86_64 -kernel bzImage -hda rootfs.img -serial pty -append “console=ttyS0,115200 kgdboc=ttyS0 root=/dev/sda”

Page 29: 리눅스 커널 디버거 KGDB/KDB

KGDB/KDB 연동하기2. agent-proxy 다운로드하기

$ git clone git://git.kernel.org/pub/scm/utils/kernel/kgdb/agent-proxy.git

$ cd agent-proxy

$ make

Page 30: 리눅스 커널 디버거 KGDB/KDB

KGDB/KDB 연동하기3. agent-proxy를 통해 kgdb와 kdb를 모두 연결할 수 있도록 셋팅하기 (gdb 접속 1234 포트, console 접속 4567 포트)

$ agent-proxy 1234^4567 0 /dev/pts/0,115200

Page 31: 리눅스 커널 디버거 KGDB/KDB

KGDB/KDB 연동하기4. console에 접속

$ telnet localhost 1234

Page 32: 리눅스 커널 디버거 KGDB/KDB

KGDB/KDB 연동하기4. 커널 패닉/웁스 발생 시 KDB로 제어 가능

Page 33: 리눅스 커널 디버거 KGDB/KDB

KGDB/KDB 연동하기5. KDB에서 KGDB로 제어를 넘기려면 <테스트머신에서>

kdb> kgdb

Page 34: 리눅스 커널 디버거 KGDB/KDB

KGDB/KDB 연동하기5. KDB에서 KGDB로 제어를 넘기려면 <호스트머신에서>

$ gdb -q vmlinux

Page 35: 리눅스 커널 디버거 KGDB/KDB

KGDB/KDB 연동하기6. gdb에서 monitor 명령을 이용하면 lsmod, ps, dmesg 등과 같이 KDB에서 사용가능한 명령어를 바로 사용할 수 있다.

$ monitor lsmod

Page 36: 리눅스 커널 디버거 KGDB/KDB

KGDB/KDB 연동하기7. 다음 명령어를 사용하면 다시 KDB로 제어를 넘긴다.

$ maint packet 3

Page 37: 리눅스 커널 디버거 KGDB/KDB

참고문헌

• 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

Page 38: 리눅스 커널 디버거 KGDB/KDB

감사합니다.