DDB(4)

명칭
ddb - 대화형 커널 디버거

서식
options DDB

해설
ddb 커널 디버거는 낡은 kdb 의 대부분의 기능을, gdb(1) 의 영향을 받은 합리적인 문장구조법으로 서포트하고 있습니다.

현재의 로케이션은 `dot'로 불립니다. `dot'는 prompt에 16 진수의 형식에서 표시됩니다. 검사와 기입해 명령은, 마지막에 검사했는지 마지막에 변경한 로케이션에 `dot'를 갱신합니다. 그리고, `next'를 다음에 검사 혹은 변경하는 로케이션의 주소에 세트 합니다. 다른 명령은 `dot'를 변경하지 않고, `next'를 `dot'와 같게 합니다.

일반적인 명령 문장구조법은 command[/modifier] address[,count] 됩니다.

공백행은 직전의 명령을 주소 `next'로부터 카운트를 1, 수식자 (modifier) 없다고 봐 반복 실행합니다. address (을)를 지정하면(자) `dot'는 그 주소로 설정됩니다. address (을)를 생략 하면(자) `dot'가 주소로서 사용됩니다. count 하지만 지정되지 않는다고 표시 명령에 대해서는 1 이 지정된 것으로 여겨져 스택 트레이스에 대해서는 무한이 지정된 것이 됩니다.

ddb 디버거는 출력에 대해 more(1) (와)과 같은 기능을 서포트하고 있습니다. 출력행이 변수 $lines 그리고 지정되어 있는 수를 넘으면(자), “--db_more--” (을)를 표시해 응답을 기다립니다. 이것에 대한 유효한 응답은 이하와 같습니다.

SPC 다음의 1 페이지를 표시합니다
RET 다음의 1 행을 표시합니다
q   현재의 명령을 중단해, 커멘드 입력 모드로 돌아옵니다

ddb (은)는 작은 (현재는 10 항목) 명령 역사나, 간단한 Emacs 풍의 명령행 편집 기능을 제공하고 있습니다. Emacs 의 컨트롤 키에 가세해 통상의 ANSI 의 커서 키에서도 역사 버퍼를 브라우즈 하거나 현재행 중(안)에서 커서를 움직이거나 할 수가 있겠지요.

명령
examine
x
수식자의 포맷에 의해, 지정된 주소 로케이션의 내용을 표시합니다. 복수의 수식자를 지정하면(자), 복수의 로케이션이 표시됩니다. 포맷이 지정되지 않으면 이 명령에 마지막에 사용된 포맷이 사용됩니다.

포맷 캐릭터는 이하와 같습니다.
b   바이트 (8 비트)로 표시합니다.
h   하프 워드 (16 비트)로 표시합니다.
l   롱 워드 (32 비트)로 표시합니다.
a   표시된 로케이션을 표시합니다.
A   가능하면 로케이션을 행 번호로 표시합니다.
x   부호 없음의 16 진수로 표시합니다.
z   부호 첨부의 16 진수로 표시합니다.
o   부호 없음의 8 진수로 표시합니다.
d   부호 첨부의 10 진수로 표시합니다.
u   부호 없음의 10 진수로 표시합니다.
r   현재의 기수를 부호 첨부로 표시합니다.
c   하위 8 비트를 캐릭터로서 표시합니다. 표시할 수 없는 캐릭터는 8 진수의 이스케이프 코드 (예: `\000') 그리고 표시됩니다.
s   그 로케이션을 널 캐릭터로 종료하는 캐릭터 라인으로서 표시합니다. 표시할 수 없는 캐릭터는 8 진수의 이스케이프 코드로 표시됩니다.
m   각 행말에 캐릭터 덤프를 붙여 부호 없음의 16 진수로 표시합니다. 각 행두에 로케이션도 16 진수로 표시됩니다.
i   인스트럭션으로서 표시합니다.
I   머신에 의존한 아마 다른 포맷으로 인스트럭션으로서 표시합니다.
    VAX 외부 label를 수속의 엔트리 마스크로서 상정하지 않습니다.
    i386
        계속되는 롱 워드의 경계의 둥근을 실시하지 않습니다.
    MIPS
        레지스터의 내용을 표시합니다.
xf
전방 검사: 마지막에 지정된 파라미터를 사용해, 검사 명령을 실행합니다. 마지막에 실행된 명령에 의해 표시된 주소가 개시 주소로서 사용됩니다.
xb
후방 검사: 마지막에 지정된 파라미터를 사용해, 검사 명령을 실행합니다. 마지막에 실행된 명령에 의해 표시된 주소로부터 표시된 것의 사이즈를 당긴 결과가 개시 주소로서 사용됩니다.
print[/acdoruxz]
지정된 수식자 캐릭터 (상술의 examine 참조)에 따라, addr (을)를 표시합니다. 유효한 포맷은 a, x, z, o, d, u, r, c 입니다. 수식자가 지정되지 않으면 마지막에 지정된 것이 사용됩니다. addr (은)는 캐릭터 라인으로 지정할 수가 있습니다. 그 경우는 그대로 표시됩니다. 예를 들면,

    print/x "eax = " $eax "\necx = " $ecx "\n"

(은)는 다음과 같이 표시됩니다.

    eax = xxxxxx
    ecx = yyyyyy

write[/bhl] addr expr1 [expr2 ...] 명령행으로 addr 의 후로 지정된 식을 addr (으)로부터 시작하는 로케이션에 기입합니다. 기입 사이즈의 단위는 수식자로서 캐릭터 b (바이트), h (하프 워드), l (롱 워드)(으)로서 각각 지정할 수 있습니다. 이것이 생략 되면(자), 롱 워드가 지정된 것으로 간주해집니다.

경고: 식의 사이에는 딜리미터가 없기 때문에, 기묘한 일이 일어날 수 있습니다. 각 식은 괄호로 괄한편이 좋을 것입니다.

set $variable [=] expr 이름 다하고 변수나 레지스터에 expr 의 값을 세트 합니다. 유효한 변수명은 후술 합니다.
break[/u]
addr 에 breakpoint를 세트 합니다. count 하지만 지정되면(자), breakpoint로 정지할 때까지, count - 1 회 계속합니다. breakpoint가 세트 되면(자), breakpoint 번호가 ‘#’ 그리고 표시됩니다. 이 숫자는 breakpoint를 삭제하거나 거기에 조건을 추가하는데 사용할 수가 있습니다.

수식자 u 하지만 지정되면(자), 이 명령은 유저 공간 주소에 breakpoint를 세트 합니다. u 옵션이 지정되지 않는 경우는, 주소는 커널 공간의 것이다고 판단되어 공간 주소가 잘못되어 있으면(자), 그것은 받아들일 수 있는 두에러 메세지가 표시됩니다. 이 수식자는 머신 의존 routine에 의해 서포트되고 있을 때 마셔 사용할 수가 있습니다.

경고: 유저 텍스트가 통상의 유저 공간 디버거에 의해 그림자 되고 있는 경우는, 유저 공간의 breakpoint는 올바르게 동작하지 않습니다. 또, 저레벨의 코드 패스에 대해 breakpoint를 세트 하면(자) 기묘한 일도 일어날지도 모릅니다.
delete addr
delete #number
breakpoint를 삭제합니다. 삭제 대상의 breakpoint는 # 그리고 breakpoint 번호를 지정하는지, 원래의 break 명령로 지정한 것과 같다 addr 에 의해 지정합니다.
step[/p]
count 회싱르스텝으로 실행합니다 (여기에서는 칸마는 반드시 붙이지 않으면 안됩니다). 수식자 p 하지만 지정되면(자), 각 스텝마다 인스트럭션을 표시합니다. 이것이 지정되지 않는 경우는, 마지막 인스트럭션만을 표시합니다.

경고: 머신의 타입에 따라서 다릅니다. 몇개의 저레벨의 코드 패스나 유저 코드의 싱르스텝 실행은 할 수 없을지도 모릅니다. 소프트웨어에 의해 싱르스텝을 에뮤레이트 하고 있는 머신 (예: pmax)에서는, 인터럽트 처리기로 실행되고 있는 코드로부터의 스텝 실행은 아마 잘못한 것을 실시하게 되겠지요.
continue[/c]
breakpoint나 시계 포인트까지 실행을 계속합니다. 수식자 c 하지만 지정되면(자), 실행중의 인스트럭션을 카운트 합니다. pmax 와 같은 몇개의 머신에서는 load 와 store 도 카운트 합니다.

경고: 카운트중은 디버거는 아무것도 표시하지 않고 싱르스텝을 실행하고 있습니다. 이것은 저레벨의 코드에서의 싱르스텝 실행이 기묘한 행동을 일으킨다 일지도 모르는 것을 의미하고 있습니다.
until[/p]
다음의 call 나 return 인스트럭션으로 멈춥니다. 수식자 p 하지만 지정되면(자), 깊게 네스트 한 call 와 인스트럭션의 누적 카운트를 각 call 혹은 return 그리고 표시합니다. 이 지정이 없으면, 매치 하는 return 에 히트 했을 때에게만 표시합니다.
next[/p]
match[/p]
매치 하는 return 인스트럭션으로 멈춥니다. 수식자 p 하지만 지정되면(자), 깊게 네스트 한 call 와 인스트럭션의 누적 카운트를 각 call 혹은 return 그리고 표시합니다. 이 지정이 없으면, 매치 하는 return 에 히트 했을 때에게만 표시합니다.

trace[/u] [frame] [, count] 스택 트레이스. 옵션 u (을)를 지정하면(자), 유저 공간을 트레이스 합니다. 이것이 없으면, trace (은)는 커널 공간만을 트레이스 합니다. count (은)는 트레이스 되는 프레임수입니다. count 하지만 생략 되면(자), 모든 프레임이 표시됩니다.

경고: 유저 공간 스택 트레이스는, 머신 의존 코드에 의해 서포트되고 있는 경우만 유효가 됩니다.

search[/bhl] addr value [mask] [, count] 메모리중에서 value (을)를 검색합니다. 만약 검색한 값이 발견되지 않으면, 이 명령은 흥미로운 방법으로 실패하겠지요. 이것은 ddb 가 메모리를 부정하게 액세스 했을 경우에 항상 recover 하고 있는 것은 없는 것에 기인하고 있습니다. 옵션의 인수 count 에 의해 검색을 제한합니다.
show all procs[/m]
ps[/m]
모든 프로세스의 정보를 표시합니다. 프로세스의 정보는 머신에 의해 서포트되어 있지 않은 경우나, 타겟의 프로세스의 스택의 바닥이 그 때에 메인 메모리에 없는 경우는 표시되지 않을지도 모릅니다. 수식자 m 에 의해, 프로세스의 VM MAP 주소를 표시해, 다른 정보를 표시하지 않게 할 수 있습니다.
show registers[/u]
레지스터 세트를 표시합니다. 옵션 u 하지만 지정되면(자), 커널이나 현재 세이브되고 있지만 대신에 유저 레지스터가 표시됩니다.

경고: 수식자 u 의 서포트는 머신에 의. 서포트되어 있지 않은 경우는, 올바르지 않은 정보가 표시되겠지요.

show map[/f] addr addr 에 있어서의 VM MAP를 표시합니다. 수식자 f 하지만 지정되면(자), 완전한 MAP가 표시됩니다.

show object[/f] addr addr 에 있어서의 VM 오브젝트를 표시합니다. 옵션 f 하지만 지정되면(자), 완전한 오브젝트가 표시됩니다.
show watches
모든 시계 포인트를 표시합니다.

watch addr,size 어느 area에 시계 포인트를 세트 합니다. 그 area에의 변경이 시도되었을 때에, 실행은 정지합니다. 인수 size 의 디폴트는 4 입니다. 잘못한 공간 주소를 지정하면(자), 그 요구는 거부되고 에러 메세지가 표시됩니다.

경고: 하드 코딩 된 카네르메모리를 시계 포인트에 세트 하면(자), i386 와 같은 몇개의 시스템에서는 복구 불가능한 에러가 발생하는 일이 있습니다. 유저 주소에서의 시계 포인트가 가장 잘 동작합니다.
gdb
리모트 GDB 모드와 DDB 모드를 바꿉니다. 리모트 GDB 모드에서는, 리모트 디버그 기능을 사용해 gdb(1) (을)를 실행하기 위해서 타겟 머신의 시리얼 콘솔에 접속되고 있는 이제(벌써) 1 대의 머신이 필요합니다. 현재는 i386 아키텍쳐에서만 이용할 수가 있습니다.
help
이용 가능한 명령와 커멘드의 단축형의 요약을 표시합니다.

변수
디버거는 레지스터와 변수를 $name (으)로서 액세스 합니다. 레지스터명은 “show registers” 명령로 나타나는 것입니다. 변수에는 변수명의 머리에 숫자를 부가하거나 변수명의 직후에 코론에 이어 몇개의 수식자를 지정할 수가 있습니다. 예를 들어, 레지스터 변수는 $eax:u (와)과 같이 수식자 u (을)를 붙여 유저 레지스터를 나타낼 수가 있습니다.

현재 서포트되고 있는 빌트인 변수에는 다음의 것이 있습니다.
radix
    입력과 출력의 기수
maxoff
    offset 가 maxoff 보다 크지 않으면, 주소는 'symbol'+offset 로서 표시됩니다.
maxwidth
    표시행의 폭
lines
    행수. "more" 기능으로 사용됩니다.
tabstops
    tab stop폭.
workxx
    워크 변수. xx (은)는 0 에서 31 의 값을 받을 수가 있습니다.

식
‘~’ (와)과 ‘^’ (와)과 단항 연산자의 ‘&’ (을)를 제외해, C 언어의 거의 모든 식의 연산자가 서포트되고 있습니다. ddb 에서의 특별 룰은 이하와 같습니다.

식별자 심볼의 명칭은 심볼의 값으로 번역됩니다. 그것은 대응하는 오브젝트의 주소가 됩니다. ‘’. (와)과 ‘’: (은)는 식별자에 사용할 수가 있습니다. 오브젝트 포맷 의존 routine에 의해 서포트되고 있으면, [filename]: func:lineno (와)과 [filename]: variable (와)과 [filename]: lineno (은)는 심볼로서 받아들여집니다.

숫자  기수는 최초의 2 캐릭터로 결정됩니다. 0x (은)는 16 진수, 0o (은)는 8 진수, 0t (은)는 10 진수가 되어, 이러한 외는 현재의 기수에 따릅니다.

.   `dot'

+   `next'

..  검사한 마지막 행의 초의 주소. `dot'나 `next'와는 달라, 이것은 “examine” 인가 “write” 명령에서만 변경됩니다.

'   명시적으로 지정한 마지막 주소.

$variable
    지정된 변수의 값으로 번역됩니다. 이것에: (와)과 수식자를 전술한 것처럼 계속할 수가 있습니다.

a#b 좌측을 우측의 다음의 배수에 끝맺는 2 항연산자.

*expr
    간접. 이것에 ‘’: (와)과 수식자를 전술한 것처럼 계속할 수가 있습니다.

관련 항목
gdb(1)

역사
ddb 디버거는 Mach 용으로 개발되어 386BSD 0.1 에 이식되었습니다. 이 메뉴얼 페이지는 Garrett Wollman 에 의해 -man 매크로로부터 고쳐 쓸 수 있었습니다.