Egloos | Log-in
F/OSS study
F/OSS study
[Linux] 커널 디버거 사용법 (2) - kdb
Linux: 2.6.38-rc6
arch: x86_64
qemu: 0.12.3
minicom: 2.4

이전 글 보기:

이제 kdb에 대해서도 살펴보기로 하자.
kdb는 내부적으로 kgdb와 동일한 루틴들을 이용하므로 상호연동이 가능하며
kdb를 이용하기 위해서는 커널 설정 시 다음과 같은 옵션을 더 추가해야 한다.
  • CONFIG_KGDB_KDB=y

기본적으로 kdb는 serial console을 그대로 이용하므로 장치/보드에 하나의 serial port 만 있어도
kdb를 이용할 수 있다. 먼저 이러한 환경을 구성하기 위해 다음과 같이 qemu를 실행한다.

$ qemu-system-x86_64 -kernel vmlinuz-2.6.38-rc6 -hda rootfs.img -serial pty \
-append "console=ttyS0,115200 kgdboc=ttyS0 root=/dev/sda"

커널 부트 옵션 (-append 부분)에 console이 추가된 것과 kgdboc에 동일한 터미널을 지정한 점,
kgdbwait 옵션이 사라진 것에 주의하자.

이제 qemu가 알려준 가상 터미널 장치 (여기서는 /dev/pts/3 이라 가정할 것이다.)에
minicom 프로그램을 이용하여 다음과 같이 접속한다.

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

이는 정상적인 콘솔 연결이므로 printk 메시지를 살피거나 명령을 실행할 수 있으며
kdb로 제어가 넘어오게되면 다음과 같은 내용을 출력하며 kdb 프롬프트가 나타난다.
앞서와 같이 magic sysrq 키를 이용하는 경우라면 다음과 같을 것이다.

minicom# echo g > /proc/sysrq-trigger
[ 1150.545343] SysRq : DEBUG

Entering kdb (current=0xffff8800069413a0, pid 51) on processor 0 due to Keyboard Entry
[0]kdb>

(minicom# 이라는 프롬프트는 이 명령을 minicom 상에서 root 권한으로 실행해야 함을 나타낸다.
Jason Wessel님의 문서에는 minicom의 "send break" 기능을 이용하여 magic sysrq와 같은 효과를
낼 수 있다고 했지만 내 환경에서는 동작하지 않았다. 원인을 아시는 분이 있으면 알려주면 감사하겠다.)

여기서 [0]kdb> 부분이 kdb 프롬프트이며 kdb 명령을 입력할 수 있다.
(숫자 0은 cpu 번호이며 SMP 커널이 아닌 경우라면 단순히 kdb> 라고만 나타날 것이다.)

우선 help를 입력하며 사용 가능한 명령어의 목록과 간단한 설명을 볼 수 있다.

[0]kdb> help
Command         Usage                Description
----------------------------------------------------------
md              <vaddr>              Display Memory Contents, also mdWcN, e.g. md8c1
mdr             <vaddr> <bytes>      Display Raw Memory
mdp             <paddr> <bytes>      Display Physical Memory
mds             <vaddr>              Display Memory Symbolically
mm              <vaddr> <contents>   Modify Memory Contents
go              [<vaddr>]            Continue Execution
rd                                   Display Registers
rm              <reg> <contents>     Modify Registers
ef              <vaddr>              Display exception frame
bt              [<vaddr>]            Stack traceback
btp             <pid>                Display stack for process <pid>
bta             [DRSTCZEUIMA]        Display stack all processes
btc                                  Backtrace current process on each cpu
btt             <vaddr>              Backtrace process given its struct task address
ll              <first-element> <lin Execute cmd for each element in linked list
env                                  Show environment variables
set                                  Set environment variables
help                                 Display Help Message
?                                    Display Help Message
cpu             <cpunum>             Switch to new cpu
kgdb                                 Enter kgdb mode
ps              [<flags>|A]          Display active task list
pid             <pidnum>             Switch to another task
reboot                               Reboot the machine immediately
lsmod                                List loaded kernel modules
sr              <key>                Magic SysRq key
dmesg           [lines]              Display syslog buffer
defcmd          name "usage" "help"  Define a set of commands, down to endefcmd
kill            <-signal> <pid>      Send a signal to a process
summary                              Summarize the system
per_cpu                              Display per_cpu variables
grephelp                             Display help on | grep
bp              [<vaddr>]            Set/Display breakpoints
bl              [<vaddr>]            Display breakpoints
bph             [<vaddr>]            [datar [length]|dataw [length]]   Set hw brk
bc              <bpnum>              Clear Breakpoint
be              <bpnum>              Enable Breakpoint
bd              <bpnum>              Disable Breakpoint
ss                                   Single Step
ssb                                  Single step to branch/call
dumpcommon                           Common kdb debugging
dumpall                              First line debugging
dumpcpu                              Same as dumpall but only tasks on cpus
ftdump          [skip_#lines] [cpu]  Dump ftrace log

시스템 전반적인 정보를 얻으려면 summary, ps, dmesg 및 dump 계열의 명령을 이용할 수 있다.
(파이프 문자 '|'와 grep 명령을 통해 원하는 내용 만을 골라낼 수도 있다.)

bp 명령을 통해 break point를 설정하거나 bc/bd/be 명령으로 이를 조작하는 것이 가능하다.
md/mm 명령은 메모리의 내용을 살펴보거나 변경할 수 있으며
마찬가지로 레지스터의 내용을 살펴보거나 변경하기 위해 rd/rm 명령을 이용할 수 있다.

기본적으로 메모리 접근 시에는 가상 주소를 이용하므로 (mdp 명령은 제외)
원하는 경우 pid 명령 혹은 cpu 명령을 통해 다른 프로세스를 선택할 수 있다.
(물론 커널 영역의 메모리는 모든 프로세스에서 동일하다..)

ss/ssb 명령을 통해 single step으로 실행하는 것이 가능하지만
아직 소스는 물론 어셈블리 명령어도 볼 수 없으므로 그리 유용하지는 않을 것 같다.

bt 명령은 stack back trace를 통해 함수 호출 경로를 보여주는데
현재 프로세스는 물론 pid나 task_struct를 통해 특정 프로세스를 지정하거나
각 cpu 별로 실행 중이거나 특정 상태 (running, sleep, zombie, ...)의 프로세스를 지정할 수 있다.
KALLSYMS 기능으로 인해 kdb에서도 back trace 시 심볼 정보에 접근할 수 있으므로 유용하다.

ps와 bta 명령의 경우 원하는 프로세스를 지정하기 위해 프로세스의 상태를 나타내는 문자열을
인자로 넘길 수 있다. 단순히 "A"를 이용하면 모든 프로세스를 지정한다.
대부분 사용자 모드의 ps 프로그램의 출력과 비슷한 값을 같지만 다음과 같은 차이가 있다.
  • C : traced process
  • E : dead process
  • U : uninitialized process
  • I : idle process
  • M : (sleeping) system process (= kernel thread)
따라서 인자로 넘길 수 있는 문자열은 "DRSTCZEUIMA"의 부분집합이 된다.

이 외에도 현재 로드된 모듈 정보를 볼 수 있는 lsmod 명령이나
다른 프로세스에게 시그널을 전달하기 위한 kill 명령 혹은
kdb의 동작에 영향을 주는 환경 변수를 확인/수정할 수 있는 env/set 명령도 존재한다.

원하는 정보를 얻은 후에는 다시 시스템을 정상 실행하거나 (go 명령), 리부팅할 수 있다 (reboot 명령).
만약 kgdb가 연결되어 있다면 (이 내용은 이 후에 다시 다룰 것이다) kgdb에게 제어를 넘겨줄 수도 있다.

아마도 실제로 kdb를 통해 수행할 수 있는 디버깅 작업은 그리 많지 않을 것이다.
하지만 kdb의 장점은 현재 실행 중인 커널의 정보를 직접 접근할 수 있다는 것이므로
kgdb에서 불가능하거나 혹은 매우 복잡한 작업들을 처리하기에 편리한 부분이 있다.

따라서 많은 경우 kgdb와 kdb를 동시에 사용하여 디버깅을 수행하거나
혹은 kdb를 통해 원하는 정보를 얻은 후 나중에 이 정보를 바탕으로 gdb 등을 통해 디버깅을 수행할 수
있을 것이다. (물론 후자의 경우 kexec/kdump를 통해 커널의 vmcore 파일을 얻는 것이 더 나을지도 모른다.)

다음 글에서는 kgdb와 kdb를 연동하는 방법에 대해 살펴볼 것이다.


=== 참조 문헌 ===

by namhyung | 2011/03/02 13:37 | Kernel | 트랙백 | 덧글(0)
트랙백 주소 : http://studyfoss.egloos.com/tb/5491083
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]

:         :

:

비공개 덧글

◀ 이전 페이지 다음 페이지 ▶

카테고리
General
Application
System
Kernel
Book
Tips
태그
git script block-layer linux elf binutils glibc gcc blktrace CARM perf computer-architecture memory build patch bash algorithm CAaQA3 x86 scm documentation awk compiler emacs kernel synchronization sed SMP C vcs
전체보기
이글루 파인더

최근 등록된 덧글
informsi yang bagus dan b..
by agen qnc at 06/22
informasi yang bagus dan b..
by agen qnc at 06/22
informasi yang bagus dan b..
by agen qnc at 06/22
최근 등록된 트랙백
Tod's Ferrari Homme
by Tods Pas Cher,Kodak did ..
Mocassin Femme
by Mocassins Homme, I got so..
natural garcinia cambogia
by
rss

skin by jiinny


X