반응형


출처 : http://www.antsys.co.kr/data/vi_editor.htm


자주 쓰는 내역에 대해서 잘 정리가 되어 있어서 자주보려고 포스팅 합니당.


vi 시작 명령어

vi filename

vi +18 filename

vi +/"문자열" fn

vi -r filename

view filename

파일 열기, 작성

18행으로 파일 열기

"문자열"의 처음발생 단어부터 열기

손상된 파일 회복

읽기 전용으로 파일 열기

vi 커서 이동 명령어

h()

j()

k()

l()

왼쪽으로 커서 이동

아래로 커서 이동

위로 커서 이동

오른쪽으로 커서 이동

w

e

b

Enter

Back space

Space Bar

^

$

H

M

L

숫자G

오른쪽 한 단어의 끝 부분으로 커서 이동

오른쪽 한 단어의 앞 부분으로 커서 이동

왼쪽 한 단어의 앞 부분으로 커서 이동

한 행 아래로 커서 이동

한 문자 왼쪽으로 커서 이동

한 문자 오른쪽으로 커서 이동

행의 맨 왼쪽으로 커서 이동

행의 맨 오른쪽으로 커서 이동

화면의 맨 위로 이동

화면의 중간으로 이동

화면의 맨 아래로 이동

숫자만큼 지정한 줄로 커서 이동

Ctrl + f

Ctrl + b

Ctrl + d

Ctrl + u

Ctrl + e

Ctrl + y

한 화면 위로 이동

한 화면 아래로 이동

반 화면 위로 이동

반 화면 아래로 이동

한 줄씩 위로 이동

한 줄씩 아래로 이동

문자,행 삽입 명령어

a (종료:ESC)

A (종료:ESC)

i (종료:ESC)

I (종료:ESC)

o (종료:ESC)

O (종료:ESC)

커서 오른쪽에 문자 삽입

커서 오른쪽, 행의 끝에 문자 삽입

커서 왼쪽에 문자 삽입

커서 왼쪽, 행의 처음에 문자 삽입

커서 아래에 행 삽입

커서 위에 행 삽입

텍스트 변경 명령어

cw (종료:ESC)

cc (종료:ESC)

C (종료:ESC)

s (종료:ESC)

S (종료:ESC)

r

r-Enter

J

xp

~

u

U

:u

.

단어 변경

행 변경

커서 오른쪽의 행 변경

커서가 위치한 문자열 대체

커서가 위치한 라인의 문자열 대체

커서 위치 문자를 다른 문자로 대체

행 분리

현재 행과 아래 행 결합

커서 위치 문자와 오른쪽 문자 교환

문자형(,소문자) 변경

이전 명령 취소

행 변경 사항 취소

이전의 최종 행 취소

이전 최종 명령 반복

텍스트 삭제 명령어

x

5x

dw

dd

5dd

db

D

:5,10d

커서가 있는 문자 삭제

커서가 있는 위치부터 5개의 문자를 삭제

현재 커서가 있는 한단어 삭제

커서가 있는 라인 삭제

커서가 있는 라인부터 5개의 라인 삭제

커서의 위치에서 꺼꾸로 한단어 삭제

커서 오른쪽 행 삭제

5-10번째 행 삭제

복사 및 이동 명령어

yy

Y

P

p

 

:1,2 co 3

:4,5 m 6

yank 또는 복사

yank 또는 복사

yank되거나 삭제된 행 현재 행 위에 삽입

yank되거나 삭제된 행 현재 행 아래에 삽입

1-2행을 3행 다음으로 복사

4-5행을 6행 위로 이동

행 번호 설정 명령어

:set nu

:set nonu

행 번호 표시

행 번호 숨기기

행 찾기 명령어

G

21G

Ctrl + G

파일의 마지막 행으로 가기

파일의 21번째 행으로 가기

현재의 filenameline수를 알려줌

탐색 및 대체 명령어

/검색할 문자열/

?검색할 문자열?

n

N

:g/search-string/s//replace-string/gc

:s/str/rep/

:1,.s/str/rep/

:%s/str/rep/g

 

:.$/aaa/bbb/

오른쪽 아래 방향으로 문자열 검색

왼쪽 위 방향으로 문자열 검색

문자열의 다음으로 계속 검색

문자열의 이전으로 계속 검색

각 발생 탐색 후 확인하고 대체

 

 

현재 행의 strrep로 대체

1부터 현재 행의 strrep로 대체

파일 전체 strrep로 전부 대체

커서의 위치로부터 화일의 끝까지 있는 모든 aaabbb로 대체

화면정리 명령어

Ctrl + l

불필요한 화면정리 후 다시 표시

파일 명령어

:r filename

:34 r filename

커서 다음에 파일 삽입

파일을 34번째 행 다음에 삽입

보관 및 종료 명령어

:w

:w filename

:wq

ZZ

:q!

q

e!

 

변경사항 보관

버퍼를 파일로 보관

변경사항 보관 후 vi 종료

변경사항 보관 후 vi 종료

변경사항 보관하지 않고 종료

수정한 파일을 저장하지 않고 vi 종료

수정한 것을 무시하고 다시 편집상태로





출처 : http://gyuha.tistory.com/157


정리가 잘 되어 있습니다. 다른분 블로그의 내용을 가져왔습니다.


VIM 명령어 정리

 

 

1. 저장 및 종료

명령어

설명

:w

저장

:w file.txt

file.txt 파일로 저장

:w » file.txt

file.tx파일에 덧붙여서 저장

:q

vi 종료

:q!

vi 강제 종료

ZZ

저장 후 종료

:wq!

강제 저장 후 종료

:e file.txt

file.txt파일을 불러옴

:e

현재 파일을 불러옴

:e#

바로 이전에 열었던 파일을 불러 옴

 

 

2. 입력모드 전환

a

커서 위치 다음칸부터 입력

A

커서 행의 맨 마지막부터 입력

i

커서의 위치에 입력

I

커서 행의 맨 앞에서 부터 입력

o

커서의 다음행에 입력

O

커서의 이전 행에 입력

s

커서 위치의 한글자를 지우고 입력

cc

커서위치의 한 행을 지우고 입력

 


3. 이동

h

왼쪽으로 이동

l

오른쪽으로 이동

j

아래행으로 이동

k

위 행으로 이동

w 또는 W

다음 단어의 첫 글자로 이동

b 또는 B

이전 단어의 첫 글자로 이동

e 또는 E

단어의 마지막 글자로 이동

<CR>

다음행 글자로 이동

^

그행의 첫 글자로 이동

$

그 행의 마지막 글자로 이동

+

다음 행의 첫 글자로 이동

-

위 행의 첫 글자로 이동

(

이전 문장의 첫 글자로 이동

)

다음 문장의 첫 글자로 이동

{

이전 문단으로 이동

}

다음 문단으로 이동

H

커서를 화면 맨 위로 이동

z<CR>

현재 행을 화면의 맨우로 이동

M

커서를 화면 중안으로 이동

z.

현재 행을 화면의 중앙으로 이동

L

커서를 화면 최하단으로 이동

z-

현재 행의 화면의 최하단으로 이동

[n]H

커서를 위에서 n행으로 이동

[n]L

커서를 아래에서 n행으로 이동

ctrl+u

반 화면 위로 스크롤

ctrl+d

반 화면 아래로 스크롤

ctrl+b

한 화면 위로 스크롤

ctrl+f

한 화면 아래 스크롤

gg 또는 1G

문서의 맨 처음으로 이동

G

문서의 맨 마지막 행으로 이동

[n]G 또는 :[n]

n행으로 이동


 

4. 삭제

x 또는 dl

커서 위치의 글자 삭제

X 또는 dh

커서 바로 앞의 글자 삭제

dw

현재 위치부터 스페이스 까지 삭제

diw

현재 위치에 있는 단어 삭제

dd

커서가 있는 행을 삭제

[n]dd

현재 커서 부터 아래 n번째 줄까지 삭제

dj

현재 커서와 아래 줄 삭제

[n]dj

현재 커서 부터 아래 n+1번째 줄까지 삭제

dk

현재 커서와 윗로 n+1번째 줄까지 삭제

[n]dk

현재 커서와 줄 삭제

D 또는 d$

현재 커서가 있는 위치부터 행 끝까지 삭제

d0 또는 d^

현재 커서가 있는 위치부터 행 시작 까지 삭제

 

 

5. 복사 & 붙여넣기

yy 또는 Y

커서가 있는 한 행 복사

p

현재 커서에 붙여 넣기, 행 복사 일 경우 아래 줄에 붙여넣음.

P

현재 커서위치의 앞행에 붙여 넣기, 행 복사일 경우에는 줄에 붙여 넣음

[n]yy 또는 [n]Y

커서가 위치한 이후로 n행 복사

[n]p

n번 만큼 붙여넣기 반복

 

 

6. 블록 지정

v

블록 지정

V

줄단위 블록 지정

ctrl+v(윈도우에서는 ctrl+q)

비쥬얼 블록 지정

블록 지정 중 명령

y

블록 복사 하기

r

치환

d

지정 블록 지우기

U

대문자로 바꾸기

u

소문자로 바꾸기

~

대소문자 전환

J

행 합침

:

선택 영역에 대하여 ex명령

<

행 앞에 탭 제거

>

행 앞에 탭 삽입

 

 

7. 문자열 탐색 및 치환

/[문자열]

문자열 탐색

:s/old/new

현재 행의 처음 old new로 교체

:s/old/new/g

현재 행의 모든 old new로 교체

:10,20s/old/new/g

10행부터 20행까지 모든 old new로 교체

[블록지정중]:s/old/new/g

지정 블록 내에서 모든 old new로 교체

:-3,+4s/old/new/g

현재 커서 위치에서 위로 3행 아래로 4행까지의 old new로 교체

:%s/old/new/g

문서 전체에서 old new로 교체

:%s/old/new/gc

문서 전체에서 old new로 확인하며 교체

:g/pattern/s/old/new/g

pattern이 있는 모든 행의 old new로 교체

 

 

8. vim 정규 표현식

^

행의 첫 문자([]안에서는 not의 의미)

$

행의 끝

.

아무 문자나 한 문자 의미

\|

or의 의미

[ ]

[]사이의 문자 중 하나

\{min,max\}

min이상 max이하 반복됨

*

앞의 내용이 0번 이상 반복됨

\+

앞의 내용이 1번 이상 반복됨

\<

단어의 시작

\>

단어의 끝

\n

새 행 문자

\t

탭 문자

 

 

9. vim 확장 정규 표현 문자열

\i

변수 지정에 사용되는 문자들 [0-9A-Za-z]

\I

\i와 같지만 숫자는 제외

\k

keyword로 사용하는 문자 [_\.\-0-9A0Za-z]

\f

파일 이름으로 사용하는 문자

\p

프린트 가능한 문자

\P

\p와 같지만 숫자는 제외

\s

whitespace character(공백과 탭)

\S

non-whitespace character

\d

숫자 [0-9]

\D

숫자가 아닌 문자 [^0-9]

\x

16진수 숫자 [0-9A-Fa-f]

\X

16진수 숫자가 아닌 문자 [^0-9A-Fa-f]

\o

8진수 숫자 [0-7]

\O

8진수 숫자가 아닌 문자 [^0-7]

\w

영문 단어의 시작에 사용되는 문자 [0-9A-Za-z-]

\W

영문 단어에서 사용되지 않는 문자 [^0-9A-Za-z-]

\h

영문 단어의 시작에 사용되는 문자 [A-Za-z-]

\H

영문 단어의 시작에 사용 되지 않는 문자 [^A-Za-z-]

\a

모든 알파벳 [A-Za-z]

\A

알파벳이 아닌 문자 [^A-Za-z]

\l

소문자 [a-z]

\L

소문자가 아닌 문자 [a-z]

\u

대문자 [A-Z]

\U

대문자가 아닌 문자 [^A-Z]

\e

Esc

\t

Tab

\r

캐리지 리턴

\b

백스페이스

\n

새 행

 

 

10. POSIX 문자 클래스

문자 클래스

내용

[:alnum:]

알파벳과 숫자 [A-Za-z0-9]

[:alpha:]

알파벳 [A-Za-z]

[:cntrl:]

제어 문자

[:blank:]

탭과 공백 문자

[:digit:]

숫자 [0-9]

[:graph:]

제어문자와 공백 문자를 제외한 문자

[:lower:]

소문자 [a-z]

[:upper:]

대문자 [A-Z]

[:print:]

제어문자를 제외한 문자, 즉 프린터 할 수 있는 문자

[:punct:]

[:graph:]문자 중 [:alnum:]을 제외한 문자. ex)!,@,#,$,%,^....

[:space:]

화이트스페이스 ex)공백, , 케리지 리턴, 새행, 수직탭, 폼필드

[:xdigit:]

16진수

 

 

11. 파일 버퍼

:files 또는 :ls 또는 :buffers

버퍼 목록 나열

:b[n]

n번 버퍼로 이동

:bd[n] 또는 :bw[n]

n번 버퍼를 삭제 (n이 없으면 현재의 버퍼를 삭제)

:bp[n]

이전 버퍼로 이동,n 붙이면 n번만큼 이전 버퍼로 이동

:bn[n]

이후 버퍼로 이동,n 붙이면 n번만큼 이후 버퍼로 이동

:sb[n]

창을 수평분할 하여 n번 버퍼를 로드

:bf

첫 번째 버퍼로 이동

:bl

마지막 버퍼로 이동

양식의

 

12. Tab

Vim 7.0부터 추가된 기능

:tabnew

새로운 탭을 열기

:tabnew b.txt

b.txt가 존재하면 열고, 없으면 새로 만들어서 연다

:tabf b.txt

b.txt가 존재하면 열고, 없으면 에러 발생

:tabn[n]

다음 탭을 열기,n 붙이면 n번 만큼 이동

:tabp[n]

이전 탭을 열기,n 붙이면 n번 만큼 이동

:tabs

탭 목록 보기

:tabclose

탭을 닫기

:tabfirst

첫번째 탭을 열기

:tablast

마지만 탭을 열기

:tabdo %s/old/new/g

모든 탭에 적용을 원할 때 (모든탭에서 old new로 변경)

 


13. 다중 창 관련 명령

명령모드

ex모드

결과

창생성

CTRL-W s

:[N]sp[plit]

현재 파일을 두 개의 수평 창으로 나눔

CTRL-W v

:[N]vs[plit]

현재 파일을 두 개의 수직 창으로 나눔

CTRL-W n

:new

새로운 수평 창 생성

CTRL-W ^ 또는 CTRL-W CTRL-^

 

수평 창으로 나누고 이전 파일의 오픈

CTRL-W f

 

창을 수평으로 나누고 커서 위치의 파일 오픈

CTRL-W i

 

커서 위치의 단어가 정의된 파일을 오픈

창삭제

CTRL-W q

:q[uit]!

현재 커서의 창을 종료

CTRL-W c

:close

현재 커서의 창 닫기

CTRL-W o

:on[ly]

현재 커서의 창만 남기고 모든 창 삭제

창이동

CTRL-W h

 

왼쪽 창으로 커서 이동

CTRL-W j

 

아래쪽 창으로 커서 이동

CTRL-W k

 

위쪽 창으로 커서 이동

CTRL-W l

 

오른쪽 창으로 커서 이동

CTRL-W w

 

창을 순차적으로 이동

CTRL-W p

 

가장 최근에 이동한 방향으로 이동

CTRL-W t

 

최상위 창으로 이동

CTRL-W b

 

최하위 창으로 이동

창이동

CTRL-W r

 

순착으로 창의 위치를 순환

CTRL-W x

 

이전 창과 위치를 바꿈

CTRL-W H

 

현재창을 왼쪽 큰화면으로 이동

CTRL-W J

 

현재창을 아래쪽 큰화면으로 이동

CTRL-W K

 

현재창을 위쪽 큰화면으로 이동

CTRL-W L

 

현재창을 오른쪽 큰화면으로 이동

창 크기 조정

CTRL-W =

 

창의 크기를 모두 균등하게 함

CTRL-W _

 

수평 분할에서 창의 크기를 최대화

CTRL-W |

 

수직 분할에서 창의 크기를 최대화

CTRL-W [N]+

:res[ize] +N

창의 크기를 N행 만큼 증가

CTRL-W [N]-

:res[ize] -N

창의 크기를 N행 만큼 감소

CTRL-W [N]>

 

창의 크기를 오른쪽으로 N칸 만큼 증가

CTRL-W [N]<

 

창의 크기를 오른쪽으로 N칸 만큼 감소

다중창 사용의 경우 대부분 붙여서 사용하는 명령어는 CTRL을 같이 눌러도 똑같은 역활을 하는 경우가 많다.
) CTRL-W j CTRL-W CTRL-J와 같다.

 

 

14. 마킹마킹위치로 이동

m[a-z0-9]

파일내에서 마킹, 현재 버퍼내에서만 이동 함 예)ma

m[A-Z]

전체영역에서 마킹, 다른 파일로도 이동 함.

`[A-Za-z0-9]

마킹된 위치로 돌아감 예)`a

’[A-Za-z0-9]

마킹된 행의 처으으로 이동함. )‘a

직전에 커서가 위치하던 행의 처음

``

직전의 커서 위치로 이동

’”

이전에 vim으로 현재 파일을 닫았을 때 커서가 있던 행의 처음으로 이동

`"

이전에 vim으로 현재 파일을 닫았을 때 커서가 있던 위치로 이동 


반응형
반응형
출처 : http://nicejoo.blogspot.kr/2012/02/memory-leak.html
출처 : http://stormaa.tistory.com/5
출처 : http://ysoftman.blogspot.kr/2012/05/linux-valgrind.html
출처 : http://www.solanara.net/solanara/memoryleak ( 다양한 릭 디텍팅 방식 가이드)
출처 : http://h21007.www2.hp.com/portal/download/files/unprot/devresource/Tools/wdb/doc/011310/memdebug-updated.pdf (WDB)
-----------------------------------------------------------------------------------------------

1. Valgrind 설치

wget http://www.valgrind.org/downloads/valgrind-3.3.0.tar.bz2(새 창으로 열기)
tar xvfj valgrind-3.3.0.tar.bz2
cd valgrind-3.3.0
./configure
make
make install

2. Valgrind 테스트
valgrind --leak-check=yes main

3. 간단 실행법
valgrind --tool=memcheck --leak-check=full --show-reachable=yes --log-file=memcheck.txt [프로그램] [실행인자들...]
valgrind --leak-check=full --log-file=memcheck.txt -v --error-limit=no [프로그램경로] [인자]


--leak-check=full : 메모릭에러가 날 경우 소스파일명과 라인위치 출력

               이 옵션을 사용할려면 디버깅컴파일을 해야합니다. (컴파일시 -g 옵션)
--log-file : 체크결과를 저장할 로그파일명


// 항목별 메모리 블럭 누수를 확인 할 수 있다.
definitely lost: 블럭 해제(free) 코드를 사용하지 않은 명백한 메모리 누수가 있음을 나타낸다.
indirectly lost: 블럭을 가르키는 포인터를 상실한 경우로 예를들어 이진트리의 루트노드를 잃어버리면 자식 노드 블럭 포인터를 간접적으로 잃어버리는 경우를 나타낸다.
possibly lost: 내부 포인터가 해제 되지 않은 경우로, 자신이 모르는 내부 포인터인 경우 신경 쓰지 않아도 된다.
still reachable: 메모리 블럭을 아직까지 사용하고 있는 경우, 프로그램 종료되기전에 해제해야될 메모리 블럭을 나타낸다.


반응형

'UTIL > Leak Detect' 카테고리의 다른 글

Monitoring and Tuning Memory Use  (0) 2015.08.17
반응형

출처 : http://community.snu.ac.kr/blog/blog.log.view.screen.do?blogId=145&logId=333


시스템의 메모리는 항상 거의 다 채워진 상태로 사용된다. 현재 실행되는 프로그램이 모든 메모리를 사용하고 있지 않을지라도 운영체제는 이전에 실행된 프로그램의 텍스트나 파일들을 메모리에 보관하고 있다. 이렇게 보관하는 것으로 인한 시스템 부하는 없다. 왜냐하면, 어쨌든 메모리가 사용되고 있는 것이 아니기 때문이다. 메모리에 보관되고 있는 프로그램이나 파일들이 다시 사용되게 될 때, 추가적인 디스크 I/O를 줄일 수 있는 장점이 있다.


ꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏ

Determining How Much Memory Is Being Used


vmstat

  현재 시스템의 모든 프로세스가 사용하고 있는 가상 메모리(active virtual memeory)와 free list에 등록된 실 메모리의 여유공간을 보여준다.

  시스템의 메모리가 부족한지 튜닝이 필요한지는 vmstat 명령을 여러번 일정한 간격으로 실행하여 pi, po 필드의 값을 검사하여 지속적으로 1이상의 값이 나오면, 메모리가 성능의 제약이 되고 있다고 볼 수 있다. 가끔씩 1 이상의 값이 나오는 것은 무시해도 된다.

  높은 wa와 b 필드값이 동시에 표시되는 경우는 페이징 스페이스에 대한 I/O 때문인 경우가 대부분이다.

kthr     memory             page              faults        cpu

----- ----------- ------------------------ ------------ -----------

 r  b   avm   fre  re  pi  po  fr   sr  cy  in   sy  cs us sy id wa

 1  1 37636  1757   0   0   0   2    9   0 468  320 348  0  0 99  0

 0  0 37642  1751   0   0   0   0    0   0 454 1354 357  0  0 99  0

 0  0 37642  1751   0   0   0   0    0   0 452 1301 345  0  0 99  0

 0  0 37643  1750   0   0   0   0    0   0 453 1302 349  0  0 99  0

 0  0 37643  1750   0   0   0   0    0   0 452 1298 345  0  0 99  0

 0  0 37643  1750   0   0   0   0    0   0 453 1299 343  0  0 99  0


VMM과 관련된 성능 문제를 확인하기 위해서는 memory, page 부분을 검사한다.

․ memory

  - avm(active virtual memory)

디폴트 정책인 deferred page space policy를 사용하는 경우에는 이 값이 사용되는 페이징 공간의 크기보다 클 수 있다. 이 값에 file page를 포함되지 않는다.

  - fre

4KB 단위의 사용가능한 실 메모리 페이지 수. free list의 최소유지 값은 vmtune의 minfree 파라미터에 의해서 결정된다. 응용 프로그램이 실행 종료되면, 모든 working page는 즉시 free list에 등록되지만, file page는 메모리에 남게 된다. 만일, 해당 파일이 지워지게 되면, file page도 free list에 등록된다. 이와 같은 이유 때문에 fre 필드의 값이 실제로 시스템의 가용 메모리를 나타낸다고 할 수 없는 것이다.

․ page

  - re

4 버전 이상에서는 더 이상 의미가 없다.

  - pi

페이징 공간에서부터 메모리로 읽혀진 페이지 수. 페이징 공간은 디스크에 존재하며, 메모리에 여유 공간이 없을 경우, 사용된다. pi 필드 값이 존재한다면, 이전에 po 필드에 해당하는 페이지가 out된 기록이 있게 된다. 초당 5이상의 값이 일반적인 기준으로 사용되며, 환경에 따라 달라진다. 절대적인 기준이란 있을 수 없다.

  - po

메모리 부족으로 인해 페이징 공간으로 out된 페이지 수.

  - fr/sr

vmtune의 minfree 파라미터 값 이하로 fr 컬럼의 페이지 수가 감소하게 되면, 페이지 교체 알고리즘이 적용된다. 따라서, VMM은 필요한 메모리를 확보하기 위해서 PFT(page frame table)을 검사하여 할당 해제할 페이지를 찾는다. maxfree 값까지 free 메모리 페이지를 확보할 때까지 페이지를 검사하는데, 이 때 검사한 페이지 수를 sr 필드에 표시하며, 결과적으로 할당 해제된 페이지 수를 fr 필드에 표시하게 된다. 메모리에 사용되지 않는 file page가 많다면, 할당 해제할 페이지를 쉽게 찾을 수 있을 것이며, 이때, sr값이 fr보다 별로 크지 않을 것이다. fr:sr의 비가 높을수록 메모리가 부족하다는 의미다. 1:4(fr:sr) 이라면, 하나의 여유 메모리를 확보하기 위해서  4개의 페이지를 검사해야만 한다는 뜻이다.

  - cy

페이지 교체를 위해서 PFT를 scan한 초당 횟수. 보통, PFT를 다 검사하는 경우는 없으므로 이 필드 값은 보통 0으로 표시된다. 만약, 이 필드 값이 0이 아니다면, 페이지 교체를 위해서 PFT를 검사하는데, 다 검사하도록 원하는 페이지를 얻을 수 없었다는 의미로 시스템의 메모리가 거의 모두 사용되고 있다는 의미다.


  시스템의 RAM이 어느 정도가 필요하나를 대략적으로 추정하는 방법은 vmstat의 avm의 최대값이 얼마인가를 보는 것이다. 이상적으로는 avm 값이 메모리보다 작아야 한다. 이 2값의 차이만큼 페이징이 발생했다는 것을 의미한다. avm이 RAM양 보다 적은데도 페이징 공간에 대한 페이징이 발생한다면, 실 메모리가 file page로 많이 사용되기 때문이다. 이러한 경우에는 minperm/maxperm 파라미터 값을 조절할 수 있다.


vmstat -I

  kthr      memory             page              faults        cpu

-------- -----------   ------------------------ ------------ -----------

 r  b  p   avm    fre    fi  fo  pi  po  fr  sr   in   sy     cs  us sy id wa

 2  1  0 1490301  1396   3   2   0   0   1    4 2719 141591 49393 10 12 78  1

 p 필드는 raw device에 대한 I/O를 기다리는 쓰레드로 파일 시스템에 대한 것은 포함되지 않는다. fi/fo는 file page에 대한 페이징이다.


vmstat -s

  시스템이 부팅된 이후부터의 누적된 통계치를 보여준다. 메모리 사용에 대한 정보를 얻기 위해서는 이 명령을 주기적으로 수행하여 결과치의 차이를 보아야 한다.


ps

  ps v PID 명령을 통해서 각 프로세스마다의 메모리 사용을 알 수 있다.

# ps v 52930

   PID    TTY STAT  TIME PGIN  SIZE   RSS   LIM  TSIZ   TRS %CPU %MEM COMMAND

 52930      - A     7:17  484  2424   208    xx   370    24  0.0  0.0 ./ns-admi

PGIN

    페이지 폴트로 인해 발생한 page in 수

    모든 페이지 폴트는 I/O 유발하므로 I/O 규모 측정에 사용될 수 있다.

SIZE

    프로세스의 데이터 부분의 가상 크기(페이징 공간), KB 단위

    프로세스의 working segment pages 수와 동일하다.

    다른 플래그의 SZ 필드와 동일하다.

    일부 페이지가 page-out 된 경우에는 사용하고 있는 실 메모리 양보다 크게 표시됨

    private segment, shared-library data segment를 포함하고 있다.

RSS

    프로세스의 실 메모리 크기, KB 단위

    working segment + code segment

    code segment는 프로그램의 모든 인스턴스에 의해서 공유된다.

TSIZ

    프로그램의 text section 크기.

    프로그램의 text section은 touch 될 경우에만 메모리로 로드된다.

    이 값은 active memory 사용량에는 영향을 주지 않는다.

    dump -ov 명령을 통해서 알아낼 수 있다.

TRS

    resident set of text size, number of code segment pages

    인스턴스가 많은 프로그램의 경우, 메모리 사용량을 과장해서 보여준다.

    TSIZ 보다 크게 나오는데, 그 이유는 다른 헤더 정보 등이 추가되기 때문이다.

%MEM

    프로그램이 사용하는 메모리를 전체 메모리로 나눈 것.

    RSS처럼 메모리 사용이 과장되게 나올 수 있다.


※ ps 명령은 shared memory segment나 memory-mapped segment에 의해서 사용되는 메모리는 포함하고 있지 않다. 따라서, 보다 정확한 정보를 보기 위해서는 svmon 명령을 사용해야 한다.

# dump -ov /usr/bin/ksh

/usr/bin/ksh:

                        ***Object Module Header***

# Sections      Symbol Ptr      # Symbols       Opt Hdr Len     Flags

         4      0x00000000              0                72     0x1007

Flags=( RELFLG EXEC LNNO DYNLOAD )

Timestamp = "Apr 04 06:19:10 2003"

Magic = 0x1df  (32-bit XCOFF)

                        ***Optional Header***

Tsize        Dsize       Bsize       Tstart      Dstart

0x0002ed30  0x00005858  0x000073b8  0x10000100  0x20000e30

SNloader     SNentry     SNtext      SNtoc       SNdata

0x0004      0x0002      0x0001      0x0002      0x0002

TXTalign     DATAalign   TOC         vstamp      entry

0x0005      0x0003      0x200061d0  0x0001      0x20005ee0

maxSTACK     maxDATA     SNbss       magic       modtype

0x00000000  0x00000000  0x0003      0x010b        1L

ftp:/home/admin> ps v 14596

   PID    TTY STAT  TIME PGIN  SIZE   RSS   LIM  TSIZ   TRS %CPU %MEM COMMAND

 14596  pts/0 A     0:00   76   568   788 32768   188   224  0.0  0.0 /usr/bin/


svmon


  현재 메모리에 대한 snapshot을 잡은 것이지만, 사용자 인터럽트를 사용하는 것이므로 진정한 의미의  snapshot이라 할 수 없다.


How Much Memory is in Use

# svmon -G

               size      inuse       free        pin    virtual

memory      2359296    2357650       1646     398806    1492391

pg space    1589248     163665

               work       pers       clnt      lpage

pin          398806          0          0          0

in use      1402168          0     955482          0

․ memory

    size : total size of memory(4KB)

    inuse = size - free

    free : free list 의 페이지 수

    pin : RAM에 pinned된 페이지 수

․ in use / pin

    work : working pages

    pers : persistent pages

    clnt : client pages(remote file pages)


Who is Using Memory?

# svmon -Put 10

-------------------------------------------------------------------------------

     Pid Command          Inuse      Pin     Pgsp  Virtual 64-bit Mthrd LPage

   16952 atmsvcd           7482     2485     2011     9152      N     N     N

    Vsid      Esid Type Description              LPage  Inuse   Pin Pgsp Virtual

       0         0 work kernel seg                   -   3901  2483 1593  4576

    f01e         d work shared library text          -   2723     0   34  3573

    9d33         2 work process private              -    611     2  381   992

    2084         - pers /dev/hd2:10282               -    126     0    -     -

    c999         - pers /dev/hd2:10303               -     40     0    -     -

     1a0         1 pers code,/dev/hd2:5656           -     31     0    -     -

    508a         - pers /dev/hd2:10287               -     17     0    -     -

    708e         - pers /dev/hd2:10288               -      9     0    -     -

    60cc         - pers /dev/hd4:4120                -      6     0    -     -

    dd3b         f work shared library data          -      4     0    3    11

    50ca         - pers /dev/hd4:4123                -      4     0    -     -

    606c         - pers /dev/hd2:10283               -      3     0    -     -

    21c4         - pers /dev/hd2:10304               -      3     0    -     -

    . . . .

  결과는 요약부분과 상세 설명 부분으로 나뉘며, 메모리 사용량이 많은 프로세스부터 상위 10개를 보여준다.

  segment는 여러 프로세스에 의해서 공유될 수 있는데, 그런 세스먼트에 속하는 페이지는 여러 프로세스에 중복되어 나타날 수 있다. 따라서, inuse 필드 값을 다 더하면, 실 메모리 양보다 많아지게 된다.

  segment id=2084 는 persistent segment이며, /dev/hd2, 즉, /usr 파일시스템에 속하는 파일이며, 126페이지가 실 메모리에 있으며, 페이징 공간에 페이징 되지는 않은 상태이다.

  segment id=60cc는 / 파일시스템에 속하며, 해당 파일의 inode 값은 4120이다.

# ncheck -i 4120 /

4120    /etc/objrepos/CuAt

# find / -xdev -inum 4120 -print

/etc/objrepos/CuAt

Vsid는 virtual segment ID, Esid는 effective segment ID이고 해당 페이지에 접근하는데 사용되는 segment register를 반영한다.


Detailed Information on a Specific Segment ID

# svmon -D 9d33 -b

Segid: 9d33

Type:  working

LPage: N

Address Range: 0..995 : 65312..65535

Size of page space allocation: 381 pages (  1.5 MB)

Virtual: 992 frames ( 3.9 MB)

Inuse: 611 frames ( 2.4 MB)

           Page      Frame    Pin        Ref        Mod  ExtSegid    ExtPage

          65339      80707     Y          Y          Y         -          -

          65340      80708     Y          Y          Y         -          -

          65314      80374     N          Y          Y         -          -

             26      80413     N          Y          Y         -          -

          65338      78852     N          Y          Y         -          -

          65341      81922     N          Y          Y         -          -

          65337      82007     N          Y          Y         -          -

             25      80174     N          Y          Y         -          -

  2개 페이지가 메모리에 pinned 되어 있으며, 대부분의 페이지가 현재 참조되고 있고 변경되어 있다는 것을 알 수 있다. 이는 working segment 이기 때문이다.

※ -D 옵션을 사용하면, 성능에 영향을 주므로 주의해서 사용해야 한다.


List of Top Memory Usage of Segments

# svmon -Sut 10


    Vsid      Esid Type Description              LPage  Inuse   Pin Pgsp Virtual

    4e00         - pers /dev/backup:17               -  71465     0    -     -

    780f         - work kernel heap                  -   7214  3787  329  7245

    8c38         - pers /dev/backup:27               -   6025     0    -     -

    700e         - work misc kernel tables           -   4886     0  673  4886

       0         - work kernel seg                   -   3901  2483 1593  4576

    f01e         - work                              -   2718     0   34  3573

    19ea         - pers large file /dev/hd9var:247   -   2237     0    -     -

    8010         - work page frame table             -   1899  1899    0  1899

    fa56         - pers /dev/backup:24               -   1766     0    -     -

    8831         - work                              -   1665  1665    0  1665


svmon and vmstat

  vmstat free 필드 = svmon memory free 필드

  vmstat avm 필드 = svmon memory virtual 필드


svmon and ps

# svmon -P 9088


-------------------------------------------------------------------------------

     Pid Command          Inuse      Pin     Pgsp  Virtual 64-bit Mthrd LPage

    9088 bash              6882     2485     1627     8277      N     N     N


    Vsid      Esid Type Description              LPage  Inuse   Pin Pgsp Virtual

       0         0 work kernel seg                   -   3901  2483 1593  4576

    f01e         d work shared library text          -   2718     0   34  3573

    748e         1 pers code,/dev/hd10opt:2421       -    135     0    -     -

    4a80         2 work process private              -     91     2    0    91

    5a82         f work shared library data          -     37     0    0    37

    6de5         - pers /dev/hd2:12307               -      0     0    -     -

# ps v 9088

   PID    TTY STAT  TIME PGIN  SIZE   RSS   LIM  TSIZ   TRS %CPU %MEM COMMAND

  9088  pts/0 A     0:00    2   512  1052 32768   498   540  0.0  0.0 bash


SIZE = virtual size in KB of data section of the process in paging space

      = number of working segment pages of the process have been touched

      = svmon의 private, lib data에서 Virtual 필드 값

      = 91 + 37 pages = 128 × 4 KB = 512

RSS = real memory size in KB of the process

     = sum of the number of working and code segment pages in memory

     = 91 + 37 + 135 pages = 263 × 4 KB = 1052

TRS = size of real memory of text

     = number of code segment pages(not include the shared text of the process)

     = 135 pages = 135 × 4 KB = 540


Calculating Minimum Memory Requirement of a Program


  total memory = T + ( N × ( PD + LD ) ) + F

    T : Number of pages for text(shared by all users)

    N : Number of instance of program

    PD : working segment pages in process private segment

    LD : shared library data pages used by the process

    F : file pages (shared by all users)

예) # svmon -P 8956

-------------------------------------------------------------------------------

     Pid Command          Inuse      Pin     Pgsp  Virtual 64-bit Mthrd LPage

    8956 cron              6796     2485     1627     8260      N     N     N

    Vsid      Esid Type Description              LPage  Inuse   Pin Pgsp Virtual

       0         0 work kernel seg                   -   3901  2483 1593  4576

    f01e         d work shared library text          -   2718     0   34  3573

    91d2         2 work process private              -     65     2    0    65

    92d2         f work shared library data          -     46     0    0    46

    3ac7         - pers large file /dev/hd9var:21    -     46     0    -     -

    7acf         1 pers code,/dev/hd2:4256           -      8     0    -     -

    88b1         - pers /dev/hd2:6144                -      5     0    -     -

    70ae         - pers /dev/hd2:4099                -      3     0    -     -

    80b0         - pers /dev/hd2:2                   -      1     0    -     -

    18e3         - pers /dev/hd9var:17               -      1     0    -     -

      a0         - pers /dev/hd4:4103                -      1     0    -     -

    4088         - pers /dev/hd3:2                   -      1     0    -     -

    52ca         - pers /dev/hd2:78282               -      0     0    -     -

   T : 7acf = 8

   PD : 91d2 = 65

   LD : 92d2 = 46

   F : 88b1, 70ae, 80b0, 18e3, a0, 4088, 52ca = 12


ꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏ

Finding Memory-Leaking Programs


  memory leak은 프로그램 에러로 인해 메모리 해제를 하지 않고 계속 할당해서 사용함으로써 메모리가 부족하게 되는 현상이다. svmon 명령을 반복적으로 실행해서 프로세스의 working segment 영역이 계속해서 증가하는가를 검사한다. kernel segment의 leak은 mbuf leak이나 device driver, kernel extention, kernel 등에 의해서 발생할 수 있다.

  문제가 되는 서브루틴이나 코드의 줄을 구분하는 것은 매우 어려운 일이다. realloc()은 실제로 에러가 아닌 경우에도 memory leak과 같은 현상을 발생시키게 된다. realloc을 자주 사용하게 되면, 프로세스의 working segment가 점점 증가하게 된다.

  private working segment의 Inuse, Pgspace, Address Range 필드 값이 계속해서 증가할 경우, memory leak을 의심해야 한다.


ꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏ

RMSS simulation


  rmss(Reduced-Memory System Simulator)는 시스템의 메모리 보드를 교체하지 않고도 시스템의 메모리를 감소시킨 상황을 시뮬레이션할 수 있는 도구이다. 시스템의 메모리를 감소시키면서 시스템의 상황 변화를 모니터링 할 수 있다. rmss는 다음과 같은 질문에 답을 얻을 수 있는 자료를 제공한다.

  “일정한 성능을 얻기 위해 필요한 시스템의 메모리는 몇 MB인가?”

  “특정 메모리 양을 가지고 동시에 몇 명의 사용자에게 서비스를 할 수 있는가?”

  rmss는 capacity plan tool로 부하를 감당하기 위해 필요한 메모리 양을 산출하는데 이용되며, problem determination tool로도 사용될 수 있다.


2 Sytles of Using rmss

  - to change the memory size and exit

주어진 메모리 크기에서 응용 프로그램의 실행 상황을 살핀다. 응용 프로그램이 복잡하여 하나의 명령으로 실행할 수 없을 경우 또는 프로그램이 다수의 인스턴스로 실행되는 환경에서 사용한다.

  - as a driver program

응용 프로그램을 메모리 크기를 변화시켜 가면서 실행한다.

※ rmss 명령을 실행하기 전에, memory load control을 off로 설정해야 한다.

        /usr/samples/kernel/schedtune -h 0


to change the memory size and exit

  단위는 MB이며, 8MB에서 시스템 메모리 사이의 값을 줄 수 있다. 시스템의 환경에 따라서 어느 값이하로는 설정할 수 없을 수 있다. 그런 경우에는 에러 메시지를 보여준다.

  rmss는 free page frame의 페이지들을 unusable frame pool에 보관하는 방식으로 메모리를 줄이며, 메모리 크기를 원상태로 하면, pool에서 페이지들을 free list에 추가한다. 또한, rmss는 메모리 크기에 따라 자동적으로 시스템 환경변수와 데이터 구조를 변경한다. 변경하는데 걸리는 시간은 줄이는 메모리 크기에 비례한다.

  # rmss -c 128      memory size = 128 MB

  # rmss -p           current memory size

  # rmss -r           reset to total system memory size

※ rmss 명령은 실제로 사용 가능한 메모리 크기를 보여준다. 따라서, 메모리에 불량 부분이 있으면, 원래 값보다 적게 나온다. 성능에 대한 정보를 따로 제공하지 않기 때문에 다른 도구를 이용하여 성능을 측정하여야 한다.


as a driver program

  # rmss -s 시작메모리 -f 최소메모리 -d 변화량 -n 반복횟수 -o 결과파일 프로그램

  예) rmss -s 16 -f 8 -d 1 -n 1 -o rmss.out foo

Hostname:  widgeon.austin.ibm.com

Real memory size:   16.00 Mb

Time of day:  Thu Jan  6 19:04:04 2000

Command:  foo

Simulated memory size initialized to  16.00 Mb.

Number of iterations per memory size = 1 warm-up + 1 measured = 2.


Memory size  Avg. Pageins  Avg. Response Time    Avg. Pagein Rate

(megabytes)                     (sec.)           (pageins / sec.)

-----------------------------------------------------------------

16.00            115.0           123.9                 0.9

15.00            112.0           125.1                 0.9

14.00            179.0           126.2                 1.4

13.00             81.0           125.7                 0.6

12.00            403.0           132.0                 3.1

11.00            855.0           141.5                 6.0

10.00           1161.0           146.8                 7.9

9.00            1529.0           161.3                 9.5

8.00            2931.0           202.5                 14.5

Avg. Pageins : 프로그램 실행 동안 발생한 모든 page in

Avg. Response Time : 프로그램 실행 시간

Avg. Pagein Rate : Pageins의 평균 비율

  위의 예에서는 14MB까지는 성능에 별다른 영향이 없으나, 13MB 부터는 성능이 점점 저하되는 것을 볼 수 있다. 현재 16MB에서의 성능치가 만족할 수 없다고 메모리를 추가하는 것은 성능에 이점이 없다는 것을 보여준다.


ꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏ

Tuning VMM Memory Load Control


h parameter

  memory load control에 의해서 프로세스가 suspend되는 시점을 정의한다. 임계값을 측정하는데는 po, fr 2가지 값이 사용된다.

        

  h = 0으로 설정되면, 사용하지 않겠다는 의미이다. 메모리가 128MB 이상이라면 디폴트 값은 0이고, 그렇지 않으며, 6이다. 메모리가 128MB 이상인 경우에는 보통 memory load control을 사용하지 않은 경우가 thrashing 상황을 더 잘 처리한다.

  시스템 설정에 관계없이 po/fr 값이 낮으면, thrashing 상태가 아니다.

        # /usr/samples/kernel/schedtune -h 4

        # /usr/sbin/schedo -o v_repage_hi=4


p parameter

  중지시킬 프로세스를 선택하는 기준으로 사용된다.

  r : number of repages         f : number of page faults

        

  디폴트 값은 4이다. 따라서, r/f 값이 0.25 이상이면 프로세스가 thrashing 현상을 발생시키고 있다고 볼 수 있다.

        # /usr/samples/kernel/schedtune -p 6

        # /usr/sbin/schedo -o v_repage_proc=6


m parameter

  멀티 프로그램의 최소 한계로, 이 값은 active process 수로 지정된다. 실행되고 있거나 페이지 I/O를 기다리는 프로세스는 active process 이고, 이벤트를 기다리거나 중지된 프로세스나 wait 프로세스는 제외된다.

  memory load control이 실행되더라도 m개의 active process가 실행되고 있도록 하는 것이다.


w parameter

  중지된 프로세스가 기다려야 할 시간.


e parameter

  한 번 중지된 프로세스는 지정한 시간 동안은 다시 중지되지 않는다.


ꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏ

Tunning with vmtune


minfree and maxfree

  free list를 관리하는 파라미터로 minfree 값이하로 free list가 감소하면, 페이지 스틸이 발생하여 maxfree 값이 될 때까지 페이지 스틸이 이루어진다. 미리 free memory page를 확보함으로써 메모리 할당 요청에 대비하며, 불필요한 I/O 발생을 제거한다.

  디폴트 값은 다음과 같다.

        

        minfree = maxfree - 8

        단, (maxfree - minfree) >= maxpgahead

  memory pool이 하나 이상인 경우에는 각각의 memory pool에 대해서 파라미터 값을 지정할 수 있으며, vmtune에 표시되는 값은 모든 풀의 값을 더한 값이다.

  minfree 페이지는 그 만큼 메모리를 낭비하는 것이다. minfree는 미래의 메모리 할당 요청에 대해 대비하는 것으로 응용 프로그램의 종류와 메모리 사용하는 방식에 대해서 알면, 효과적으로 대처할 수 있다. minfree 값을 설정할 때, 주요 프로그램이 사용하는 메모리를 svmon으로 확인하여 필요한 만큼의 메모리를 minfree로 지정할 수 있다. 이 때의 어려움은 프로그램이 한 번에 많은 메모리를 요구하지 않을 수 있기 때문에 불필요하게 메모리를 낭비하는 결과를 가져올 수도 있기 때문이다.

  minfree = 120 × # of CPUs

  maxfree = minfree + 8 × # of CPUs

  maxfree - minfree <= 100


memory pool

        # vmtune -m N

        # vmo -r -o mempools=N

  시스템 부팅시 메모리 풀 수를 변경하게 된다. 이 값은 커널 설정 파일에 기록된다. 디폴트로는 /usr/lib/boot/unix_mp 파일이며, vmtune은 변경 이전의 파일을 .sav 로 저장한다.


lrubucket

        # vmtune -l N

        # vmo -o lrubucket=N

  대량의 메모리를 가진 시스템에서 LRU 알고리즘에 따른 메모리 스캔의 부하를 감소시키기 위해서 lrubucket 파라미터를 조절할 필요가 있다.

  LRU 알고리즘에 따라 메모리를 스캔하면서 참조비트가 off인 페이지를 스틸하고 참조비트를 리셋한다. 이 과정에서 메모리가 큰 경우에는 많은 페이지를 스캔해야 한다. 따라서, 메모리 frame을 bucket으로 나누어서 관리한다. LRU 알고리즘은 하나의 bucket을 스캔하고 필요한 만큼의 메모리를 확보하지 못하면, 다른 bucket을 스캔하기 전에, 2번째 스캔을 하게 된다.

  디폴트 값은 131072 또는 512 MB 이다.


minperm / maxperm

        # vmtune -p n -P N

        # vmo -o minperm%=n

        # vmo -o maxperm%=N

  numperm : number of file pages in memory

        ․ numperm > maxperm,         steal only file pages

        ․ maxperm > numperm > minperm, repage 비율에 따라서 steal

        ․ numperm < minperm,          page 종류를 가리지 않고 아무거나 steal

  파일 I/O가 주요한 성능 제한 사항인지, computational page를 메모리에 유지하는 것이 중요한지 등에 따라서 설정 값을 변경할 수 있다. 특히, NFS를 사용하는 시스템에서는 보다 많은 file pages를 메모리에 보관할 수 있도록 하는 것이 성능향상에 도움이 된다.

w  File System으로 구성된 Oracle : minperm  10%, maxperm  30%

w  SAP R3(File System Oracle) : minperm  5%, maxperm  10%



strict_maxperm

        # vmtune -h 0|1

        # vmo -o strict_maxperm=0|1

  persistent file cache 에 대한 hard limit을 설정할 것인가? 1로 설정되면, maxperm 값이 hard limit으로 설정되며, 이 값 이상으로 file pages가 증가하게 되면, LRU 알고리즘에 따라 페이지 교체가 file pages 에 대해서 실행된다.

※ 사용할 때, 주의해서 사용하지 않으면, 예기치 않은 결과를 가져올 수 있다.


maxclient

        # vmtune -t N

        # vmo -o maxclient%=N

  JFS2 파일 시스템은 buffer cache로 client pages라는 메모리 페이지를 이용한다. 이 페이지들은 maxperm, minperm 임계값의 영향을 받지 않는다. 이 client pages에 대한 최대값을 지정하는 파라미터가 maxclient 이다.

  사용량이 maxclient 설정값에 도달하면, LRU는 client pages를 스틸한다. client pages를 스틸하고도 모자라면 다른 종류의 페이지도 스틸하게 된다. maxclient 값을 줄임으로써 LRU가 working segment pages를 스틸하지 못하도록 해야 할 필요가 있다. 또한, maxperm 이하로 값을 설정해야 한다.


ꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏ

Tuning Paging Space


´페이징 스페이스 부족과 관련된 에러 메시지는 다음과 같다.

"INIT: Paging space is low"

          "ksh: cannot fork no swap space"

      "Not enough memory"

          "Fork function failed"

          "fork () system call failed"

          "Unable to fork, too many processes"

          "Fork failure - not enough memory available"

          "Fork function not allowed. Not enough memory available."

          "Cannot fork: Not enough space"


npswarn

        # vmtune -w N

        # vmo -o npswarn=N

  페이징 공간의 가용한 페이지 수가 N이하로 줄어들면, OS는 프로세스에게 SIGDANGER 시그널을 보내게 된다. 프로세스는 이 시그널을 무시하거나, 종료하거나, disclaim()을 사용하여 메모리를 해제한다.

  디폴트 값은  max( 512, 4×npskill )


npskill

        # vmtune -k N

        # vmo -o npskill=N

  페이징 공간의 가용한 페이지 수가 N이하로 줄어들면, OS는 프로세스에게 SIGKILL 시그널을 보내고 강제로 종료시키기 시작한다. SIGDANGER 시그널에 응답한 프로세스나 early 할당 정책을 사용하는 프로세스는 영향을 받지 않는다.

  디폴트 값 = max(64, NumberOfPagingSpacePages/128)


nokilluid

        # vmtune -n N

        # vmo -o nokilluid=N

  uid가 N 이하인 사용자 프로세스는 npskill 파라미터의 영향을 받지 않는다.


fork() retry interval

  페이징 공간 부족으로 새로운 프로세스를 fork하지 못할 경우, 스케줄러는 5번 재시도한다. 이 때, 재시도 간격은 10clock tick이 디폴트이다.

        # schedtune -f N (clock tick)


ꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏ

Page Space Allocation Method


LPSA(Late Page Space Allocation)

  ․ allocated when actually touched(the page was modified somehow)

  ․ 페이지는 프로세스가 page-out 될 때, 할당된다.

  ․ 프로세스가 page-out될 가용한 공간을 항상 보장할 수 없다.

EPSA(Early Page Space Allocation)

  ․ paging space pages reserved when processes use malloc()

  ․ 프로세스가 페이징 공간 부족으로 kill되지 않는 것을 보장한다.

  ․ PSALLOC=early

DPSA(Deferred Page Space Allocation)

  ․ allocation delayed until necessary to page out the page

  ․ additional overcommitment of paging space

  ․ 한 번 page-out 페이지가 다시 RAM에 page-in 되더라도 그 공간은 reserved 됨.

  ․ 다음 경우에 할당된 페이지가 해제된다.

    - working segment로 page-in된 페이지

    - 쓰레드가 할당을 해제한 경우

    - thread exit

# vmtune -d 0|1      (DPSA=1)

# vmo -o deffps=0|1

  vmstat(avm), ps(SIZE, SZ) 등의 도구들은 DPSA 정책에 따라 실제로 access된 가상 메모리 크기를 보여준다. 반면에 svmon은 실제로 사용된 페이징 공간 크기를 보여주므로, 이 값은 vmstat의 avm 값보다 작게 출력된다.

  lsps -a는 실제로 사용되는 페이징 공간만을 보여준다, 그러나. lsps -s는 사용되지 않고 있지만, reserve된 페이징 공간도 고려해서 보여준다. 따라서, lsps -s 명령을 사용하는 것이 좀 더 정확하다고 할 수 있다.


ꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏ

Shared Memory


  shmat(), mmap()을 사용하여 파일들을 명시적으로 메모리에 매핑시킬 수 있다. 이렇게 함으로써 버퍼링과 시스템 콜로 인한 부하를 피할 수 있다. 이러한 메모리 영역을 shared segments라 한다. 4.2.1 버전 이후부터 32비트 응용 프로그램에만 적용된다. 11개의 shared memory segments 제공된다. 각 segment는 256MB 크기다. 응용 프로그램은 이러한 공유메모리 세그먼트에 read/write 함으로써 파일에 대한 read/write을 수행할 수 있다. 또한, 세그먼트에 대한 포인터를 사용하기 때문에 read/write system call로 인한 부하를 피할 수 있다.

  파일과 데이터는 다수의 프로세스에 의해서 공유될 수 있는데, 공기화 문제는 응용 프로그램에서 해결해야 한다. 전형적인 예로는 데이터베이스 프로그램이 공유 세그먼트를 데이터 베이스 버퍼 캐쉬로 사용한다.

  shared memory segments에 대한 페이징 공간도 할당된다.


EXTSHM(Extended Shared Memory)

  각 shared memory region은 크기에 관계없이 256MB 크기의 메모리 공간을 사용한다. 4.2.1 버전부터는 EXTSHM을 통해서 1바이트에서 256MB까지 크기를 지정할 수 있다.

  EXTSHM을 통해서 11개 세그먼트의 제한은 사라지게 되었다. EXTSHM을 사용하기 위해서는 프로그램의 환경 설정에 EXTSHM=ON으로 설정하면 사용할 수 있다. 프로세스가 사용할 수 있는 segment의 수에 대한 제한은 없으며, 사용하는 메모리 공간의 크기는 여전히 256MB 의 배수이다.


ꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏꠏ

Memory Affinity Support


  POWER 기반의 SMP 장비들은 다수의 MCM을 포함하고 있다. 시스템 메모리는 이러한 MCM에 부착되어 있다. 모든 프로세서가 어떤 메모리에도 접근할 수 있지만, 자신의 MCM에 부착되어 있는 메모리에 접근하는 것이 제일 빠르다.

  따라서, page fault를 발생시킨 프로세서의 MCM에 부착된 메모리에서 page fault를 해결하도록 하는 것이 memory affinity support이다.

        # vmtune -y 0|1

        # vmo -r -o memory_affinity=0|1

    ※ bosboot, reboot를 반드시 해줘야만 효과가 있다.

  응용 프로그램에서 이 기능을 사용하기 위해서는 환경 변수를 설정해야 한다.

        # export MEMORY_AFFINITY=MCM

반응형

'UTIL > Leak Detect' 카테고리의 다른 글

Linux 메모리 릭 체킹 Valgrind  (0) 2015.08.17
반응형
출처 : http://www.codeproject.com/Articles/31382/Memory-Leak-Detection-Using-Windbg


Detecting memory leaks using Windbg.

Introduction

Memory leak is a time consuming bug often created by C++ developers. Detection of memory leaks is often tedious. Things get worst if the code is not written by you, or if the code base is quite huge.

Though there are tools available in the market that will help you in memory leak detection, most of these tools are not free. I found Windbg as a freeware powerful tool to solve memory leak bugs. At least, we get an idea about the code location which might be suspected to cause memory leaks. COM Interface leaks are out of the scope of this article.

Windbg is a powerful user/kernel space debugger from Microsoft, which can be downloaded and installed from here.

Using Windbg

To start working with Windbg:

  1. Configure the symbol file path to the Microsoft symbol server “SRV*d:\symbols*http://msdl.microsoft.com/download/symbols”.
  2. Add your program EXE/DLL PDB (program database) path to the symbol file path.
  3. You also need to to configure the Operating System's flag to enable user stack trace for the process which has memory leaks. This is simple, and can be done with gflags.exe. Gflags.exe is installed during Windbg's installation. This can also be done through command line, using the command “gflags.exe /i MemoryLeak.exe +ust”. My program name is Test2.exe; hence, for the demo, I will be using Test2.exe rather than MemoryLeak.exe. The snapshot below shows the setting of OS flags for the application Test2.exe.

cmd.JPG

Once we have configured Windbg for the symbol file path, start the process which is leaking memory, and attach Windbg to it. The Attach option in Windbg is available under the File menu, or can be launched using the F6 shortcut. The snapshot below shows the same:

attach.JPG

The !heap command of Windbg is used to display heaps. !heap is well documented in the Windbg help.

I have developed a small program which leaks memory, and will demonstrate further using the same.

int _tmain(int argc, _TCHAR* argv[])
{   while(1) 
     { 
        AllocateMemory(); 
     } 
     return 0; 
} 
void AllocateMemory() 
{ 
     int* a = new int[2000]; 
     ZeroMemory(a, 8000); 
     Sleep(1); 
}

The above program leaks an integer array of size 2000*4 bytes.

After attaching Windbg to the process, execute the !heap –s command. -s stands for summary. Below is the output of the !heap -s for the leaking process:

0:001> !heap -s
NtGlobalFlag enables following debugging aids for new heaps:
    validate parameters
    stack back traces
  Heap     Flags   Reserv  Commit  Virt   Free  List   UCR  Virt  Lock  Fast 
                    (k)     (k)    (k)     (k) length      blocks cont. heap 
-----------------------------------------------------------------------------
   00150000 58000062    1024     12     12      1     1     1    0      0   L  
   00250000 58001062      64     24     24     15     1     1    0      0   L  
   00260000 58008060      64     12     12     10     1     1    0      0      
   00330000 58001062   64576  47404  47404     13     4     1    0      0  
-----------------------------------------------------------------------------

Let the process execute for some time, and then re-break in to the process, and execute !heap -s again. Shown below is the output of the command:

0:001> !heap -s
NtGlobalFlag enables following debugging aids for new heaps:
   validate parameters
   stack back traces
   Heap     Flags   Reserv  Commit  Virt   Free  List   UCR  Virt  Lock  Fast 
                     (k)     (k)    (k)     (k) length      blocks cont. heap 
   -----------------------------------------------------------------------------
    00150000 58000062    1024     12     12      1     1     1    0      0   L  
    00250000 58001062      64     24     24     15     1     1    0      0   L  
    00260000 58008060      64     12     12     10     1     1    0      0      
    00330000 58001062  261184 239484 239484     14     4     1    0      0      
   -----------------------------------------------------------------------------

Lines marked in bold show the growing heap. The above snapshot shows a heap with the handle 00330000 growing.

Execute “!heap -stat –h 00330000” for the growing heap. This command shows the heap statistics for the growing heap. Shown below is the command's output.

0:001> !heap -stat -h 00330000
heap @ 00330000
group-by: TOTSIZE max-display: 20
    size     #blocks     total     ( %) (percent of total busy bytes)
    1f64 76c6 - e905f58  (99.99)
    1800 1 - 1800  (0.00)
    824 2 - 1048  (0.00)
    238 2 - 470  (0.00)
    244 1 - 244  (0.00)
    4c 5 - 17c  (0.00)
    b0 2 - 160  (0.00)
    86 2 - 10c  (0.00)
    50 3 - f0  (0.00)
    74 2 - e8  (0.00)
    38 4 - e0  (0.00)
    48 3 - d8  (0.00)
    c4 1 - c4  (0.00)
    62 2 - c4  (0.00)
    be 1 - be  (0.00)
    b8 1 - b8  (0.00)
    ae 1 - ae  (0.00)
    ac 1 - ac  (0.00)
    55 2 - aa  (0.00)
    a4 1 - a4  (0.00)

The above snapshot shows 0x76c6 blocks of size 1f64 being allocated (marked in bold). Such a huge number of blocks of the same size makes us suspect that these can be leaked blocks. Rest of the block allocations do not have growing block numbers.

The next step is to get the address of these blocks. Use the command !heap -flt s 1f64. This command filters all other blocks of heap and displays the details of blocks having size 1f64.

Shown below is the output for the command:

0:001> !heap -flt s 1f64
    _HEAP @ 150000
    _HEAP @ 250000
    _HEAP @ 260000
    _HEAP @ 330000
      HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
        003360e0 03f0 0000  [07]   003360e8    01f64 - (busy)
        00338060 03f0 03f0  [07]   00338068    01f64 - (busy)
        00339fe0 03f0 03f0  [07]   00339fe8    01f64 - (busy)
        0033bf60 03f0 03f0  [07]   0033bf68    01f64 - (busy)
        0033dee0 03f0 03f0  [07]   0033dee8    01f64 - (busy)
        01420040 03f0 03f0  [07]   01420048    01f64 - (busy)
        01421fc0 03f0 03f0  [07]   01421fc8    01f64 - (busy)
        01423f40 03f0 03f0  [07]   01423f48    01f64 - (busy)
        01425ec0 03f0 03f0  [07]   01425ec8    01f64 - (busy)
        01427e40 03f0 03f0  [07]   01427e48    01f64 - (busy)
        01429dc0 03f0 03f0  [07]   01429dc8    01f64 - (busy)
        0142bd40 03f0 03f0  [07]   0142bd48    01f64 - (busy)
        0142dcc0 03f0 03f0  [07]   0142dcc8    01f64 - (busy)
        0142fc40 03f0 03f0  [07]   0142fc48    01f64 - (busy)
        01431bc0 03f0 03f0  [07]   01431bc8    01f64 - (busy)
        01433b40 03f0 03f0  [07]   01433b48    01f64 - (busy)
        01435ac0 03f0 03f0  [07]   01435ac8    01f64 - (busy)
        01437a40 03f0 03f0  [07]   01437a48    01f64 - (busy)
        014399c0 03f0 03f0  [07]   014399c8    01f64 - (busy)
        0143b940 03f0 03f0  [07]   0143b948    01f64 - (busy)
        0143d8c0 03f0 03f0  [07]   0143d8c8    01f64 - (busy)
        0143f840 03f0 03f0  [07]   0143f848    01f64 - (busy)
        014417c0 03f0 03f0  [07]   014417c8    01f64 - (busy)
        01443740 03f0 03f0  [07]   01443748    01f64 - (busy)
        014456c0 03f0 03f0  [07]   014456c8    01f64 - (busy)
        01447640 03f0 03f0  [07]   01447648    01f64 - (busy)
        014495c0 03f0 03f0  [07]   014495c8    01f64 - (busy)
        0144b540 03f0 03f0  [07]   0144b548    01f64 - (busy)
        0144d4c0 03f0 03f0  [07]   0144d4c8    01f64 - (busy)
        0144f440 03f0 03f0  [07]   0144f448    01f64 - (busy)
        014513c0 03f0 03f0  [07]   014513c8    01f64 - (busy)
        01453340 03f0 03f0  [07]   01453348    01f64 - (busy)
        014552c0 03f0 03f0  [07]   014552c8    01f64 - (busy)
        01457240 03f0 03f0  [07]   01457248    01f64 - (busy)
        014591c0 03f0 03f0  [07]   014591c8    01f64 - (busy)
        0145b140 03f0 03f0  [07]   0145b148    01f64 - (busy)
        0145d0c0 03f0 03f0  [07]   0145d0c8    01f64 - (busy)
        0145f040 03f0 03f0  [07]   0145f048    01f64 - (busy)
        01460fc0 03f0 03f0  [07]   01460fc8    01f64 - (busy)
        01462f40 03f0 03f0  [07]   01462f48    01f64 - (busy)
        01464ec0 03f0 03f0  [07]   01464ec8    01f64 - (busy)
        01466e40 03f0 03f0  [07]   01466e48    01f64 - (busy)
        01468dc0 03f0 03f0  [07]   01468dc8    01f64 - (busy)

Use any UsrPtr column value from the listed output, and then use the the command !heap -p -a UsrPtr to display the call stack for UsrPtr. I have selected 0143d8c8 marked in bold.

Upon execution of !heap -p -a 0143d8c8, we get the call stack shown below:

0:001> !heap -p -a 0143d8c8 
    address 0143d8c8 found in
    _HEAP @ 330000
      HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
        0143d8c0 03f0 0000  [07]   0143d8c8    01f64 - (busy)
        Trace: 0025
        7c96d6dc ntdll!RtlDebugAllocateHeap+0x000000e1
        7c949d18 ntdll!RtlAllocateHeapSlowly+0x00000044
        7c91b298 ntdll!RtlAllocateHeap+0x00000e64
        102c103e MSVCR90D!_heap_alloc_base+0x0000005e
        102cfd76 MSVCR90D!_heap_alloc_dbg_impl+0x000001f6
        102cfb2f MSVCR90D!_nh_malloc_dbg_impl+0x0000001f
        102cfadc MSVCR90D!_nh_malloc_dbg+0x0000002c
        102db25b MSVCR90D!malloc+0x0000001b
        102bd691 MSVCR90D!operator new+0x00000011
        102bd71f MSVCR90D!operator new[]+0x0000000f
        4113d8 Test2!AllocateMemory+0x00000028
        41145c Test2!wmain+0x0000002c
        411a08 Test2!__tmainCRTStartup+0x000001a8
        41184f Test2!wmainCRTStartup+0x0000000f
        7c816fd7 kernel32!BaseProcessStart+0x00000023

The lines marked in bold shows the functions from our code.

Note: Sometimes, it might happen that the “!heap -s” command does not show a growing heap. In that case, use the “!heap -stat -h” command to list all the heaps with their sizes and number of blocks. Spot the growing number of blocks, and then use the “!heap –flt s SIZE” (SIZE = the size of the suspected block) command.


반응형

'UTIL > Debugging' 카테고리의 다른 글

Windows Wingdb를 이용한 MEMORY LEAK 대처법  (0) 2014.12.26
windbg 사용법 (WinDebug)  (0) 2014.05.26
gdb 사용법 안내  (0) 2012.08.01
dbx와 core 파일 분석 및 사용법  (0) 2012.08.01
반응형

출처 : http://darpangs.tistory.com/19

----------------------------------------------------------------------------------

참조 : http://www.codeproject.com/KB/cpp/MemoryLeak.aspx


1. gflags.exe 를 이용하여 메모리 할당 트레이싱 대상 프로그램을 세팅한다.
- gflags.exe /i MLeakTarget.exe +ust

: 프로세스 이름을 기준으로 트레이싱을 시작하는 듯.

2. WinDbg 를 이용해서 대상 프로세스에 attach 한다.
3. !heap -s  명령어를 입력한다.현재 사용 중인 heap 의 사용 내역이 보인다.

4. !heap -stat -h 00330000 명령어를 입력한다.
: 각 힙에 대한 핸들값을 마지막에 인자로 넣는다. ( 00330000 )
: 그러면 해당 힙의 사용 내역이 자세히 나온다.
: 위의 참조 글을 보면, 여기서 크기를 기준으로 필터링해서 다시 목록을 뽑고, 뽑아진 목록에서 해당 힙을 가리키는 유저모드 포인터 값이 나온다.
: 이 포인트 값을 이용해서 어떻게 할당된 메모리 인지 콜스택을 볼 수 있다. ( 이건 gflags.exe 에 의해 세팅되었기 때문에 가능하다. )

5. !heap -p -a 0x143fa303
: 이 명령을 입력하면, 인자로 넣어진 주소가 어떻게 allocation 되었는지 그 때의 콜 스택이 나오게된다.
: 적당한 디버깅 심벌들이 갖추어져 있다면, 어디서 할당된 놈인지 파악할 수 있을것이다.

6.. 원하는 주소값이 나온다면, ln 주소값  명령을 이용해서 해당되는 소스라인을 확보한다.
: ln 명령어 찾는다고 좀 헤멨음. ;;
----------------------------------------------------------------------------------------------
위의 참조 사이트에서 나오는 방법은 실제 필드에서는 저렇게 큰 메모리가 leak 되는 상황은 거의 없고, 실제로는 항상 작은 용량의 메모리 들이 leak 되기 때문에 별로 쓸모가 없다고 얘기가 나오고 있다.

뭐... 그럴수도 있을거 같고, 나의 경우엔...

현재 작업 중인 프로그램 코드내부에 메모리를 할당하고 해제하는 함수를 모조리 래핑해 놓은게 있다.

그래서 프로그램 종료 시에 할당되고 해제되지 않은 메모리의 주소값을 친절하게도 알려준다.

뭐 그 정도면 게임끝~ 위의 단계에서 바로 5번 단계의 명령어를 쓰면 필요한 콜 스택을 구할 수 있다.



--------------------------------------------------------------------------------------------

출처 : http://blog.daum.net/_blog/BlogTypeView.do?blogid=03gwy&articleno=15700730


상용툴을 사용하지 않고 WinDBG를 활용한 힙영역 메모리 누수 탐지에 관한 내용이 코드프로젝트 사이트에 있어서 복습할 겸 글을 써보기로 했습니다.

 

1. WinDBG 실행후 PDB와 실행이미지 경로 세팅

   (실행파일은 계속적으로 메모리 누수가 일어나는 형태의 파일이어야 함. 간단한 소스를 만들면 됩니다)

2. 적당히 WinDbg로 실행하다가 브레이크를 건뒤 커맨드를 넣는다.

3. !heap -s 힙의 상태를 표시해줌

4. 다시 실행하고 적당히 시간이 지났을 때 브레이크 걸고 3번을 반복

5. 힙 핸들 중 이전에 비해 메모리 차지하는 비중이 큰 핸들 값을 조사

6 !heap -stat -h 12345678  12345678 핸들의 힙 상태를 보겠다는 의미

7. 이중에서 블럭 할당 값이 지나치게 많은 값이 메모리 누수 부분이라고 할 수 있겠습니다.

   블럭 사이즈가 많이 있으므로 의심되는 블럭 크기의 값만 보기 위해

8. !heap -flt s 1fd4   블럭 크기가 1fd4인 값만 필터링해서 보여달라는 의미

9. 그러면 1f4d 크기로 할당된 리스트들이 가득 나옵니다. 각 항목중에 usrptr 값이 있습니다. 이 항목을 사용하면 이 값이 힙에 할당되기 까지의 스택 트레이스를 보여 줍니다.

10. !heap -p -a usrptr 


--------------------------------------------------------------------------------------------

출처 : http://www.duck.pe.kr/m/post/173


00400000 00413000 image00400000 C (no symbols)
71710000 71794000 comctl32 (deferred)
77980000 77a1b000 oleaut32 (deferred)
77de0000 77e49000 user32 (deferred)
77e50000 77f32000 kernel32 (deferred)
77f40000 77f7c000 GDI32 (deferred)
77f80000 77ffc000 ntdll (pdb symbols) c:\websymbols\ntdll.pdb\41AFDCD61\ntdll.pdb
786f0000 7875f000 RPCRT4 (deferred)
796d0000 79735000 ADVAPI32 (deferred)
7cf00000 7cfef000 ole32 (deferred)

- .help : 메타명령어 (.명령) 도움말

- .hh : DEBUGGER.CHM 명령 띄우기.

- ~ Thread 관련 명령

Threads can only be specified in user mode. In kernel mode, the tilde (~) refers to a processor.

Also note that many commands can be preceded by a thread symbol. For an explanation of a tilde (~) followed by a command, see the entry for the command itself.

Here are examples of the use of this command. The following command will display all threads:

0:001> ~

The following command will also display all threads:

0:001> ~*

The following command will display the currently active thread:

0:001> ~.

The following command will display the thread that originally caused the exception (or that was active when the debugger attached to the process):

0:001> ~#

The following command will display thread number 2:

0:001> ~2

Here is an example of the output of this command:

0:001> ~
0 id: 4dc.470 Suspend: 0 Teb 7ffde000 Unfrozen
. 1 id: 4dc.534 Suspend: 0 Teb 7ffdd000 Unfrozen
# 2 id: 4dc.5a8 Suspend: 0 Teb 7ffdc000 Unfrozen

On the first line of this example, 0 is the decimal thread number; 4DC is the hexadecimal process ID, 470 is the hexadecimal thread ID, 0x7FFDE000 is the address of the TEB, and Unfrozen is the thread status. The period (.) before thread 1 means this is the current thread. The number sign (#) before thread 2 means this thread was the one that originally caused the exception or it was ctive when the debugger attached to the rocess.

- LD : (load Symbols)

0:000> ld ole32
Symbols loaded for ole32
0:000> lm
start end module name
00400000 00413000 image00400000 C (no symbols)
71710000 71794000 comctl32 (deferred)
77980000 77a1b000 oleaut32 (deferred)
77de0000 77e49000 user32 (deferred)
77e50000 77f32000 kernel32 (deferred)
77f40000 77f7c000 GDI32 (deferred)
77f80000 77ffc000 ntdll (pdb symbols) c:\websymbols\ntdll.pdb\41AFDCD61\ntdll.pdb
786f0000 7875f000 RPCRT4 (deferred)
796d0000 79735000 ADVAPI32 (deferred)
7cf00000 7cfef000 ole32 (pdb symbols) c:\websymbols\ole32.pdb\42CABEE01\ole32.pdb
0:000> ld kernel32
Symbols loaded for kernel32
0:000> lm
start end module name
00400000 00413000 image00400000 C (no symbols)
71710000 71794000 comctl32 (deferred)
77980000 77a1b000 oleaut32 (deferred)
77de0000 77e49000 user32 (deferred)
77e50000 77f32000 kernel32 (pdb symbols) c:\websymbols\kernel32.pdb\4498D8981\kernel32.pdb
77f40000 77f7c000 GDI32 (deferred)
77f80000 77ffc000 ntdll (pdb symbols) c:\websymbols\ntdll.pdb\41AFDCD61\ntdll.pdb
786f0000 7875f000 RPCRT4 (deferred)
796d0000 79735000 ADVAPI32 (deferred)
7cf00000 7cfef000 ole32 (pdb symbols) c:\websymbols\ole32.pdb\42CABEE01\ole32.pdb
0:000> ld *
Symbols already loaded for image00400000
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\WINNT\system32\comctl32.dll -
Symbols loaded for comctl32
Symbols loaded for oleaut32
Symbols loaded for user32
Symbols already loaded for kernel32
Symbols loaded for GDI32
Symbols already loaded for ntdll
Symbols loaded for RPCRT4
Symbols loaded for ADVAPI32
Symbols already loaded for ole32
0:000> lm
start end module name
00400000 00413000 image00400000 C (no symbols)
71710000 71794000 comctl32 (export symbols) C:\WINNT\system32\comctl32.dll
77980000 77a1b000 oleaut32 (pdb symbols) c:\websymbols\oleaut32.pdb\3DF8FF78\oleaut32.pdb
77de0000 77e49000 user32 (pdb symbols) c:\websymbols\user32.pdb\4211D1FD1\user32.pdb
77e50000 77f32000 kernel32 (pdb symbols) c:\websymbols\kernel32.pdb\4498D8981\kernel32.pdb
77f40000 77f7c000 GDI32 (pdb symbols) c:\websymbols\gdi32.pdb\43B3D6741\gdi32.pdb
77f80000 77ffc000 ntdll (pdb symbols) c:\websymbols\ntdll.pdb\41AFDCD61\ntdll.pdb
786f0000 7875f000 RPCRT4 (pdb symbols) c:\websymbols\rpcrt4.pdb\41E6468F7\rpcrt4.pdb
796d0000 79735000 ADVAPI32 (pdb symbols) c:\websymbols\advapi32.pdb\4253BAFE1\advapi32.pdb
7cf00000 7cfef000 ole32 (pdb symbols) c:\websymbols\ole32.pdb\42CABEE01\ole32.pdb


심볼에 대한 자세한 정보를 얻고자 하는 경우
0:000> lm v m gdi32
start end module name
77f40000 77f7c000 GDI32 (pdb symbols) c:\websymbols\gdi32.pdb\43B3D6741\gdi32.pdb
Loaded symbol image file: c:\websymbols\gdi32.dbg\43B3E1B73c000\gdi32.dbg
Image path: C:\WINNT\system32\GDI32.dll
Image name: GDI32.dll
Timestamp: Thu Dec 29 22:16:39 2005 (43B3E1B7)
CheckSum: 0003E315
ImageSize: 0003C000
File version: 5.0.2195.7073
Product version: 5.0.2195.7073
File flags: 0 (Mask 3F)
File OS: 40004 NT Win32
File type: 2.0 Dll
File date: 00000000.00000000
Translations: 0409.04b0
CompanyName: Microsoft Corporation
ProductName: Microsoft(R) Windows (R) 2000 Operating System
InternalName: gdi32
OriginalFilename: gdi32
ProductVersion: 5.00.2195.7073
FileVersion: 5.00.2195.7073
FileDescription: GDI Client DLL
LegalCopyright: Copyright (C) Microsoft Corp. 1981-1999


심볼서버

To use the Microsoft Symbol Server

1. Make sure you have installed the latest version of Debugging Tools for Windows.

2. Start a debugging session.

3. Decide where to store the downloaded symbols (the "downstream store"). This can be a local drive or a UNC path.

4. Set the debugger symbol path as follows, substituting your downstream store path for DownstreamStore.

SRV*DownstreamStore*http://msdl.microsoft.com/download/symbols

) SRV*c:\websymbols*http://msdl.microsoft.com/download/symbols

장애의종류

Crash: Heap Corrupt, AV(Access Violation)

Hang: Deal lock, Orphaned thread, contention..

Leak: Memory Leak

장애 종류에 따른 대처

Crash:

Access Violation

- adplus.vbs > CDB 사용

- Tlist process id확인 (id)

- Adplus.vbs –crash –p pid : Crash 발생하면 메모리 덤프를 생성

Heap Corrupt

- page heap: heap영역에 할당된 메모리의 영역을 체크함. 범위를 초과하는 경우 프로세스를 종료시킴.

- gflags.exe 성능을 떨어뜨릴 있으면 덤프를 뜨고나면 disable 시켜야 한다.

http://support.microsoft.com/kb/286470/ : 마이크로 소프트의 페이지

시스템 범위 페이지 힙에 GFlags 사용

GFlags 도구는 시스템 범위 페이지 힙을 설정하는 사용됩니다. GFlags 명령을 적용하려면 명령을 실행한 컴퓨터를 다시 시작해야 합니다.

시스템 범위 일반 페이지 힙을 설정하려면 다음과 같이 하십시오. 1. 명령줄에 다음을 입력합니다.

gflags -r +hpa

2. 컴퓨터를 다시 시작합니다.

시스템 범위 일반 페이지 힙을 해제하려면 다음과 같이 하십시오. 1. 명령줄에 다음을 입력합니다.

gflags -r -hpa

2. 컴퓨터를 다시 시작합니다.

단일 프로세스 페이지 힙에 GFlags 사용

특정 프로세스를 모니터링하기 위해 페이지 힙을 사용할 있도록 설정할 있습니다. 이렇게 하려면 다음 단계를 수행하십시오.

1. 명령 프롬프트에서 디버그 도구를 설치한 디렉터리로 변경합니다.

2. 명령 프롬프트에서 다음을 입력한 Enter 키를 누릅니다.

Gflags.exe –p /enable lsass.exe

참고 lsass.exe Pageheap 도구로 모니터링할 프로세스의 이름을 나타냅니다.

3. 페이지 모니터링이 이상 필요하지 않으면 모니터링을 해제합니다. 수신 대기 포트의 목록을 얻으려면 프롬프트에서 다음 명령을 입력하고 Enter 키를 누릅니다.

Gflags.exe -p /disable lsass.exe

참고 lsass.exe Pageheap 도구로 모니터링할 프로세스의 이름을 나타냅니다.

4. 현재 Pageheap 확인을 사용하는 모든 프로그램을 표시하려면 명령 프롬프트에서 다음을 입력한 다음 Enter 키를 누릅니다.

Gflags.exe –p

* Hang 장애

Deadlock, 무한 루프(while(true){ … } )등의 로직 관련 문제.

- Hang dump 받는다. Hang dump 이상 받아서 체크하도록 한다.

Adplus.vbs –hang –p pid(process id)

- Deallock이나 lock 문제가 되는 경우에는 Windbg !lock 통해서 현재 lock 가장 많이 잡고 있는 Thread등을 조사하여 본다.

* 메모리 누수

Windows 2000/XP, 2003 이상의 경우

- DebugDiag라는 메모리 누수 감지 공개소프트웨어를 사용하고, perfmon(성능 모니터)에서 process private bytes, virtual Bytes 살펴보아서 private bytes 지속적인 증가, virtual Bytes 계단식 증가를 살펴보도록 한다.

반응형

'UTIL > Debugging' 카테고리의 다른 글

Windbg를 이용한 메모리 릭 검사(영문)  (0) 2014.12.26
windbg 사용법 (WinDebug)  (0) 2014.05.26
gdb 사용법 안내  (0) 2012.08.01
dbx와 core 파일 분석 및 사용법  (0) 2012.08.01
반응형

 /* Channel Status */

 #define MQCHS_INACTIVE     0

 #define MQCHS_BINDING      1

 #define MQCHS_STARTING     2

 #define MQCHS_RUNNING      3

 #define MQCHS_STOPPING     4

 #define MQCHS_RETRYING     5

 #define MQCHS_STOPPED      6

 #define MQCHS_REQUESTING   7

 #define MQCHS_PAUSED       8

 #define MQCHS_INITIALIZING 13

반응형
반응형


출처 : http://skmagic.tistory.com/379




WinDbg란?!

마이크로 소프트에서 배포하는 마이크로 소프트 윈도우의 다목적 디버거

유져모드 어플리케이션, 드라이버 및 커널모드에서 자체 운영체제 디버깅을 할 수 있다.



난 보통 덤프 파일 분석을 위해 사용하기에 덤프파일 분석을 위한 디버깅을 소개한다.


[덤프 디버깅]

1.유져모드 덤프 디버깅

2.커널모드 덤프 디버깅


(언제 다 정리하지?!)


[디버깅 방법]

1.심볼을 연결한다 (pdb파일이 있는 경로로 설정) (tip:웬만하면 경로는 영문명으로 하자)

2.소스코드를 연결한다.(안해도 콜스택정도는 나옴)

3.각종 명령어를 통해 분석할 수 있다.



[명령어]

k : 콜스택 보기

.ecxr : 예외가 발생한 상황에 저장된 컨텍스트 레코드를 보여준다(eax, ebx, ecx 등등...)

!analyze -v : Windebug가 자동분석을 해서 많은 정보를 보여준다.

u 주소값: 어셈보기



CommandoptionusageDesc
종료   
q  디버깅 종료
qd  디버깅 종료;연결해제
디버깅 환경정보   
vertarget  타겟 컴퓨터 정보 표시
version  디버그 환경 정보 표시
.lastevent  마지막 디버그 이벤트 정보 표시
||  디버깅 세션 정보 표시
sumble & sorurce   
.symfix  MS 심볼경로 설정
.sympath  심볼경로 확인/설정
.sym noisy  심볼파일 검색 과정을 출력
.srcpath  소스경로 설정
.srcnoisy .srcnoisy 1소스경로 검색 과정을 출력
모듈   
lm l로드된 모듈만 표시
  m [pattern]패턴과 일치되는 모듈만 표시
  v모듈 상세정보 표시
!lmi!lmi ntdll.dll 모듈 상세정보 표시
.reload /f [m_name]심볼을 즉시 로드
xX ntdll!*/v심볼 타입을 표시.
 X *!*abc*/t데이터 타입을 표시
  /n이름순으로 정렬
ln ln [address]해당 주소에 근접한 심볼의 정보 표시
레지스터   
r  레지스터 정보 표시
r $proc  현재 프로세스의 PEB주소( user-mode)
   현재 프로세스의 EPROcESS주소( kernel-mode)
r $thread  현재 스레드의 TEB주소( user-mode)
   현재 스레드의 ETHREAD주소( kernel-mode)
r $tpid  현재 프로세스 ID(PID)
r $tid  현재 스레드 ID(TID)
언어셈블   
u  언어셈블
  f언어셈블(함수전체)
  b언어셈블(ip이전의 8개 명령어)
콜스택   
k [n]콜스택 정보표시
  p함수정보 출력
  b인자표시
  n프레임번호
  vFPO정보 표시
  f스택 사용량 표시
break point   
bpbp 0x123456 bp 설정
bl  bp 리스트 출력
bcbc * | [frame_no] bp 삭제
bd,bebc * | [frame_no] bp disable/enable
bmbm notepad!*Win* 패턴과 일치하는 모든심볼에 bp설정
bubu aaa!bbb 로드되지 않은 심볼에 대한 bp설정
ba  특정 주소에 access시 bp
지역변수   
dvdv modulr!test*  
  /i심볼유형과 인자유형 표시
  /V변수저장 위치 표시( register or address )
데이터유형   
dtdf _EPROCESS 0xaddr 주소를 특정 데이터 형으로 변환해서 표시
du  Unicode string 표시
da  Ansi string 표시
dc   
db   
dy   
    
!address!address  
 !address [address]  
프로세스 & 스레드 정보   
!peb  PEB(Process Environment Block)표시
!teb  TEB(Thread Environment Block) 표시
    
!gle  API의 마지막 에러코드 표시
실행 제어   
t  Trace
~.t  다른 스레드를 중지시킨 상태에서 하나의 statementt실행
g   
p  Step Over
gugu 현재함수가 복귀할 때 까지 실행
 ~0 gu 스레드 0을 제외한 모든 스레드를 freeze함
wt  내부에서 호출된 함수와 함수호출 횟수등의 정보 표시
.cxr  컨텍스트 변경
!ready   
.thread   
!thread   
.trap   
.process   
!process   
ed   
ebeb .-6 90 90 90 90 90 90 6byte를 NOP(0x90)으로 변경
!error!error [error code] 에러코드 정보표시













출처 : http://blog.naver.com/process3

[심볼관련 사용하는 주요 명령어]

심볼을 로드할 때 사용하는 명령입니다.

보통은 심볼패스를 설정한 후에 .reload 와 같이 사용합니다.

kd> .symfix e:\symbols

kd> .reload
Connected to Windows XP 2600 x86 compatible target, ptr64 FALSE
Loading Kernel Symbols
........................
Loading User Symbols

lm 을 사용하여 심볼이 로드된 상태를 봅니다.

kd> lm
start end module name
804d9000 806ede00 nt (pdb symbols) e:\symbols\ntoskrnl.pdb\8592B6763F344B562\ntoskrnl.pdb
806ee000 80701d80 hal (deferred)
f9871000 f988b580 Mup (deferred)
f996f000 f998e780 fltMgr (deferred)
...

nt 는 심볼이 로드된 것이 보이는데 나머지는 deferred 라고 나옵니다.
이것은 WinDbg 의 lazy symbol loading (deferred symbol loading) 이라는 특징 때문에 그렇습니다.

WinDbg 는 심볼을 로드할 때 꼭 필요한 심볼만 올려놓고 나머지는 deferred 로 해놓고 심볼을 올리지 않습니다. deferred 로 된 녀석들은 나중에 해당 모듈이 WinDbg 상에서 실제 사용되는 순간이 발생해야만 로드가 됩니다. 필요한 것만 그때 그때 올려주는 나름대로 효율적인 방법입니다. ^^

WinDbg Help 에 보면 .reload 는 다양한 옵션을 가지고 있는데요.
제가 유용하게 사용하는 것만 몇가지 설명합니다.

.reload /i mydrv.sys (심볼이 맞지않아도 강제로 심볼 로드하기)

예를 들어 어제 빌드한 드라이버가 BSOD 를 발생시켜서 덤프가 만들어 졌는데 심볼은 보관하지 않아서 덤프분석을 할 수 없는 문제를 만났다고 가정합시다. 다행히도 어제 소스 코드를 그대로 보관하고 있었다고 하면 그것을 그대로 빌드하여 pdb 파일을 생성할 수 있습니다. 문제는 이 pdb 파일을 로드하려고 해도 WinDbg가 TimeStamp 등을 체크하여 symbol mismatch 에러를 내면서 심볼로드를 하지 않는다는 겁니다. 이런 경우에 심볼이 맞는지 확인하지 말고 강제로 올려달라는 /i 옵션을 사용하면 심볼이 올라갑니다.

.reload /f (심볼 모두 올리기)

보통 lazy symbol loading 상태로 그냥 사용하시면 되지만 혹시 모든 모듈의 심볼을 모두 올려 놓아야 할 경우가 있다면 /f 옵션을 사용해서 모든 모듈의 심볼을 올릴 수 있습니다.

.reload /u (심볼 모두 내리기)

반대로 모든 심볼을 모두 내려야 할 경우가 있다면 /u 옵션을 사용해서 모든 모듈의 심볼을 내릴 수 있습니다.

.reload /u mydrv.sys (특정모듈 심볼 내리기)

mydrv.pdb 를 로드하여 사용하고 있는데 새로 빌드한 mydrv.pdb 를 심볼패스에 복사하면 mydrv.pdb 가 사용중이라서 복사가 실패합니다. 이런 경우 /u mydrv.sys 옵션을 줘서 특정 모듈의 심볼만 내릴 수 있습니다.

.reload mydrv.sys (특정모듈 심볼 로드하기)

위와 같이 내려진 특정 모듈의 심볼만 다시 올리려면 mydrv.sys 처럼 모듈 이름을 줘서 로드합니다.


로드된 모듈 리스트 보기
lm 명령을 이용하면 된다.

lm k : Kernel Mode 모듈 표시
lm u : User Mode 모듈 표시
lm m : 패턴을 검사하여 해당하는 것만 보여줌 <lm m my*>

lkd> lm
start end module name
00c80000 00c90000 NateOnHook40u (export symbols) C:\Program Files\NATEON\BIN\NateOnHook40u.dll
00cb0000 00cb9000 MgHookDll C (export symbols) C:\Program Files\LG Software\On Screen Display\MgHookDll.dll
01000000 0106a000 windbg (pdb symbols) D:\Symbol\WebSymbol\windbg.pdb\D6EF677AA54441279479F0307F05A8941\windbg.pdb
016a0000 01784000 ext (export symbols) C:\Program Files\Debugging Tools for Windows\winext\ext.dll
01790000 017c1000 kext (pdb symbols) D:\Symbol\WebSymbol\kext.pdb\6B643FC4E9F94FF4ABA4CEF1FD6F89D61\kext.pdb


모듈의 심볼(Symbol) 검사
x 모듈!패턴 을 입력하면 된다.

lkd> x nt!Ke*
804f8c02 nt!KeQuerySystemTime = <no type information>
804f8c9e nt!KeEnableInterrupts = <no type information>
80500e38 nt!KeSwitchKernelStack = <no type information>
804fad32 nt!KeReadStateProcess = <no type information>
804f9188 nt!KeReleaseInterruptSpinLock = <no type information>


데이터 타입(Date Type) 표시
dt 데이터 타입 을 입력하면 된다.

lkd> dt _EPROCESS
+0x000 Pcb : _KPROCESS
+0x06c ProcessLock : _EX_PUSH_LOCK
+0x070 CreateTime : _LARGE_INTEGER
+0x078 ExitTime : _LARGE_INTEGER
+0x080 RundownProtect : _EX_RUNDOWN_REF
+0x084 UniqueProcessId : Ptr32 Void
+0x088 ActiveProcessLinks : _LIST_ENTRY
+0x090 QuotaUsage : [3] Uint4B
+0x09c QuotaPeak : [3] Uint4B
+0x0a8 CommitCharge : Uint4B



메모리 덤프(Memory Dump)
d* 명령들을 이용하면 된다.

db : Byte 형식 + Ascii 로 표시
dd : 데이터를 4Byte 형식으로 표시

lkd> db 8053db18
8053db18 8b ff 55 8b ec 8b 45 08-8b 4d 0c 8b 55 14 89 48 ..U...E..M..U..H
8053db28 0c 8b 4d 10 89 48 10 03-ca 89 48 14 8b 4d 18 83 ..M..H....H..M..
8053db38 c1 fe 89 48 18 8b 4d 1c-89 48 20 66 8b 4d 20 66 ...H..M..H f.M f



디스어셈블리(Disassembly)
u 주소 를 이용하면 된다. 특정 함수를 디스어셈블리 하고 싶으면 uf 주소 를 하면 된다.

u 주소 : 주소에서 일부분만 디스어셈블리
u 주소1 주소2 : 주소1에서 주소 2까지 디스어셈블리

lkd> u 8053db18 or uf nt!NtOpenProcess
nt!KeInitializeProfile:
8053db18 8bff mov edi,edi
8053db1a 55 push ebp
8053db1b 8bec mov ebp,esp
8053db1d 8b4508 mov eax,[ebp+0x8]
8053db20 8b4d0c mov ecx,[ebp+0xc]


메모리 영역 속성 보기(VA Dump)
!vadump 명령을 사용하면 된다. 만약 특정 메모리의 속성을 보고 싶다면 !vprot 주소 명령을 사용하면 된다.

0:000> !vadump
BaseAddress: 00000000
RegionSize: 00010000
State: 00010000 MEM_FREE
Protect: 00000001 PAGE_NOACCESS

BaseAddress: 00010000
RegionSize: 00001000
State: 00001000 MEM_COMMIT
Protect: 00000004 PAGE_READWRITE
Type: 00020000 MEM_PRIVATE


0:000> !vprot 30c191c
BaseAddress: 030c1000
AllocationBase: 030c0000
AllocationProtect: 00000080 PAGE_EXECUTE_WRITECOPY
RegionSize: 00011000
State: 00001000 MEM_COMMIT
Protect: 00000010 PAGE_EXECUTE
Type: 01000000 MEM_IMAGE


프로세스 관련
모든 프로세스를 보기위해서는 !process 0 0 를 입력하면 된다. 디버거를 특정 프로세스에 붙이고 싶으면 .process /i [pid] 를 입력하면 된다.


lkd> !process 0 0
**** NT ACTIVE PROCESS DUMP ****
PROCESS 8a3a3490 SessionId: none Cid: 0004 Peb: 00000000 ParentCid: 0000
DirBase: 00780000 ObjectTable: e1001c70 HandleCount: 521.
Image: System

PROCESS 8a184158 SessionId: none Cid: 03f0 Peb: 7ffdd000 ParentCid: 0004
DirBase: 17a40020 ObjectTable: e163dd70 HandleCount: 20.
Image: smss.exe

PROCESS 89df4da0 SessionId: 0 Cid: 0440 Peb: 7ffd5000 ParentCid: 03f0
DirBase: 17a40040 ObjectTable: e1c6cb18 HandleCount: 626.
Image: csrss.exe


구조체 내용 보기

!strct _KMUTANT ff93a330

이렇게 명령을 주면 자료구조랑 값들이 같이 출력이 된다.


WinDBG 디버깅 과정 파일로 저장하기

Windbg를 이용해서 디버깅을 하다보면,

디버깅과정을 저장할 필요가 생깁니다.
또는 아래와 같은 상황이 있을수 있을겁니다.


- 다른분의 도움을 통해 디버깅한 내용을 참고하고 싶은경우
- 수십시간동안 켜놓은 결과를 저장해야하는경우. -> 화면 버퍼를 넘어가면 그동안의 내용이 사라지죠~
- .cls 를 습관적으로 사용하는경우. -> 제경우입니다. T.T

이때 유용한 명령어가 바로.

.logxxx 계열 명령어입니다.


.logopen logfile
>> 디버깅 과정을 저장할 로그파일 명을 지정합니다.
ex) .logopen “c:\dbglog\logs.txt”

.logfile
>> 현재 기록중인 디버깅 로그파일의 상태를 표시합니다.

.logclose
>> 기록중이던 로그를 종료(완료)합니다.



유용하게 쓰세요~
(단, .logopen 이전의 내용은 저장되지 않습니다.` ^^)
참고하세요)
.logopen 정보 역시 Windbg WorkSpace 에 함께 저장됩니다.~ ^^





GUI환경의 디버깅툴인 windbg 사용법을 알아보자.

사용자 삽입 이미지


일단 각 필요파일들을 download해야겠지?

◎ 필요한 파일들
* windbg 다운로드
32bit버전 : http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx
64bit버전 : http://www.microsoft.com/whdc/devtools/debugging/install64bit.mspx

* 심볼파일 다운로드
http://www.microsoft.com/whdc/devtools/debugging/symbolpkg.mspx
위의 링크에서 각 OS에 맞는 파일 다운로드하여 설치

◎ 설치할때 특별하게 주의할 점은 없다. 모르겠다 싶으면 그냥 "다음(Next)" 버튼만 눌러라.
단, 기억할것은 심볼파일을 설치할때 어디에 설치했는지 잘 봐두도록..
기본설치 위치는 해당 OS폴더 밑의 Symbols이다. 예를 들면 XP인 경우는
"C:\Windows\Symbols"에 설치된다.

◎ 실행방법 및 심볼파일 경로 설정
1. 실행창에서
시작 -> 실행 창 또는 명령프롬프트 창에서 아래와 같이 입력
windbg -y 심볼파일경로 -i OS이미지경로 -z 덤프파일경로
예> windbg -y SRV*C:\Windows\Symbols*http://msdl.microsoft.com/download/symbols -i d:\i386 -z c:\windows\memory.dmp

2. 시작 -> 모든 프로그램 -> Debugging Tools for Windows -> WinDbg 실행
File -> Symbol File Path... 실행
Symbol Search Path창이 뜨면 아래 경로 입력하고 확인 클릭
경로 : SRV*C:\Windows\Symbols*http://msdl.microsoft.com/download/symbols
File -> Image File Path... 실행
OS 이미지 경로입력 (OS CD의 i386에 있음)
File -> Open Crash Dump... 실행
Dump파일 경로 입력

◎ Remote Debugging 방법
* Debugger사용하는 방법
- 서버, 클라이언트 모두 windbg를 설치, 서버측에 심볼파일 설치
1. 서버(debug하려는 기계)셋팅 :
복수사용자(클라이언트) : 콘솔창 : WinDbg -server npipe:pipe=pipename
단일사용자 : WinDbg실행 -> 명령창: .server npipe=pipename
2. 클라이언트 셋팅:
1) WinDbg -remote npipe:server=Server, pipe=Pipename[,password=password]
2) WinDbg 실행 -> File-> Connect to Remote Session 선택
npipe:server=Server,pipe=PipeName[,password=Password]입력
* Remote.exe 사용하는 방법
- 서버, 클라이언트 모두 debugging tool 설치, 심볼파일은 클라이언트 설치

◎ 주요 명령어


참조 :
1. MSDN
2. 네이버 윈도우시스템프로그래밍 카페




참고 자료

Windbg Tutorial
http://www.codeproject.com/KB/debug/windbg_part1.aspx

Windows에서 디버깅을 위해 만든 작은 메모리 덤프 파일을 읽는 방법
http://support.microsoft.com/default.aspx?scid=kb;ko;315263

Windbg로 덤프 남기는법
http://msdn.microsoft.com/en-us/library/ff562428.aspx

잊지 말아야 할 점은, windbg는 symbol과 source code의 매칭을 해주지 않는다.
반드시 Symbol File Path와, Source File Path 메뉴 에서 경로를 제대로 지정해주어야, 덤프 분석시 정보가 제대로 출력된다.

windbg shell command

덤프 생성
.dump /f C:\경로\파일명.dmp

덤프 정보 분석
!analyze [-v]

지역변수 보기
dv

콜스택 보기
kb

콜스택에 번호 매겨서 보기
kn

스택 프레임 번호에 맞추기 (0번부터 시작)
.frame [번호]

Display Exception Context Record
.ecxr

레지스터 보기
r

디스 어셈블해서 보기
u [주소]

직접 메모리 내용 보기
dd [주소]

메모리의 내용과 심벌을 일치시켜 보여준다.
dds [주소]

프로세스 리스팅
!process 0 0

프로세스 어태치 시키기
.process /i [pid]


할당된 가상메모리 덤프

올리디버거의 Memory Map윈도의 기능

!vadump [-v]


해당메모리 주소가 어떤 속성인지 알려줌

!vprot [주소]


현재 프로세스내에 동작중인 스레드의 스택을 보여줌

!uniqstack [-b]

-b옵션을 주면 스택에 담긴 아규먼트까지 보여준다


현재 스레드에 할당된 권한(Privilege)를 보여줌

!token


각 스레드가 동작한 시간

!runaway


레지스트리 정보 확인

!dreg

예) 0:000> !dreg System\CurrentControlSet\Services\Tcpip!*


해당 주소를 UNICODE_STRING구조체 형식으로 살펴봄

!ustr [주소]

typedef struct _UNICODE_STRING {
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} UNICODE_STRING;


해당 주소를 ANSI_STRING혹은 OEM_STRING구조체로 살펴봄

!str [주소]

typedef struct _STRING {
USHORT Length;
USHORT MaximumLength;
PCHAR Buffer;
} STRING;
typedef STRING ANSI_STRING;
typedef STRING OEM_STRING;



스레드 로컬 스토리지 슬롯을 살펴봄

!tls

모든 슬롯 출력

예) !tls -1

Specifies the thread environment block (TEB). If this is 0 or omitted, the current thread is used

예) !tls 0


현재 스레드의 TEB정보를 출력

!teb


현재 프로세스의 PEB정보를 출력

!peb


잘 알려진 몇몇 STL템플릿정보를 출력

!stl


로딩된 dll모듈의 베이스주소와 길이 모듈명을 출력한다

lm


해당모듈의 자세한 정보를 출력

!lmi [모듈]

예) !lmi 00400000


반복적인 디버거명령을 실행시키면서, 링크드리스트 정보를 출력함

!list

예) !list "-t ntdll!_LIST_ENTRY.Flink -e -x \"dd @$extret l4; dt ntdll!_RTL_CRITICAL_SECTION_DEBUG @$extret-0x8\" ntdll!RtlCriticalSectionList"


현재 Shared User-mode Page를 출력함

현재 타임존과 시스템루트, TickCount와 시간을 출력함

!kuser


로드된 모듈들의 리로케이션되기전의 주소를 출력한다

!imgreloc [주소]


최근 에러코드를 리턴한다

!gle


에러코드를 가지고 무슨 에러인지 설명을 보여준다

!error [에러코드번호]


글로벌 플래그를 설정 혹은 보여준다

!gflag


로드된 모듈들에 대한 커스터마이징(?)된 출력을 해준다.

!for_each_module ["명령어"]

예) !for_each_module .echo @#ModuleIndex : @#Base @#End @#ModuleName @#ImageName @#LoadedImageName

로드된 모듈에서 MZ로 시작되는것을 찾는다
예) !for_each_module s-a @#Base @#End "MZ"


가상메모리에서 이미지헤더를 검색한다 (MZ검색)

.imgscan


표현식을 헥사, 8진수, 2진수, 시간형, Float형, Double 형으로 변환한 형태로 보여준다

.formats [표현식]

디버그 레지스터 확인
0:000> rm 0x20;r
dr0=00000000 dr1=00000000 dr2=00000000
dr3=00000000 dr6=00000000 dr7=00000000
ntdll!KiFastSystemCallRet:
7c93eb94 6a01 push 1

범용레지스터 확인
0:000> rm 0x01;r
eax=00000000 ebx=00000000 ecx=00000006 edx=7c9ac080 esi=7c93e88e edi=00000000
eip=7c93eb94 esp=0007fde8 ebp=0007fee4 iopl=0 nv up ei pl zr na pe nc
ntdll!KiFastSystemCallRet:
7c93eb94 6a01 push 1

레지스터 값 변경
r eip=7c931230
r eax = @ebx
r zf=0


특정 주소에 어셈블 코드 삽입
a <위치>
예) a eip
00401000 sub esp, 10


특정 주소에 원하는 값 삽입
e[옵션] <주소>
예) eb <주소>
00401000 90
00401001 90
00401002 90


현재 보여주는 숫자의 진수바꾸기
n <base>
예) n 8
예) n 16 # 16진수
예) n 10 #10진수로 보여줌


메모리가 참조하고 있는 데이터를 살펴보기
예) dpa esp 현재 스택을 아스키형태로 보여줌
예) dpu esp 현재 스택을 유니코드형태로 보여줌


메모리의 내용을 심벌과 매핑시켜서 보여줌
예) dds esp 현재 콜 스택을 보여줌


반응형
반응형

[출처 : http://flowrider.tistory.com/6]


  Windows/NT
                  AMQHASMN.EXE - The logger
                  AMQHARMN.EXE - Log formatter (LINEAR logs only)
                  AMQZLLP0.EXE - Checkpoint process
                  AMQZLAA0.EXE - LQM agents
                  AMQZTRCN.EXE - Trace
                  AMQZXMA0.EXE - Execution controller
                  AMQXSSVN.EXE - Shared memory servers
                  AMQCRSTA.EXE - Any remotely started channel over TCP/IP
                               - Could be
                  RECEIVER,REQUESTER,CLUSRCVR,SVRCONN,SENDER,SERVER
                  AMQCRS6A.EXE - Any remotely started channel over LU62/SNA

                               - Could be
                  RECEIVER,REQUESTER,CLUSRCVR,SVRCONN,SENDER,SERVER
                  RUNMQCHL.EXE - Any locally started channel over any
                  protocol
                               - Could be SENDER,SERVER,CLUSSDR,REQUESTER
                  RUNMQLSR     - LISTENER PROCESS
                  RUNMQCHI     - CHANNEL INITIATOR
                  RUNMQSC.EXE  - MQSeries Command processor
                  AMQPCSEA.EXE - PCF command processor
                  AMQSCM.EXE   - Service Control Manager

                  SOLARIS
                  amqhasmx - logger
                  amqharmx - log formatter, used only if the queue manager
                  has linear logging selected
                  amqzllp0 - checkpoint processor
                  amqzlaa0 - queue manager agents
                  amqzxma0 - processing controller
                  amqcrsta - Any remotely started channel over TCP/IP
                           - Could be
                  RECEIVER,REQUESTER,CLUSRCVR,SVRCONN,SENDER,SERVER
                  amqcrs6a - Any remotely started channel over LU62/SNA
                           - Could be
                  RECEIVER,REQUESTER,CLUSRCVR,SVRCONN,SENDER,SERVER
                  runmqchl - Any locally started channel over any protocol
                           - Could be SENDER,SERVER,CLUSSDR,REQUESTER
                  runmqlsr - listener process
                  runmqchi - channel initiator
                  runmqsc  - MQ Command interface
                  amqpcsea - PCF command processor

                  AS/400
                  AMQHIXK4 - Storage Manager (Housekeeper)
                  AMQMCPRA - Data Store (Object Cache)
                  AMQCLMAA - Listener
                  AMQALMP4 - Check Point Process
                  AMQRMCLA - Sender channel
                  AMQCRSTA - Any remotely started channel over TCP/IP
                           - Could be
                  RECEIVER,REQUESTER,CLUSRCVR,SVRCONN,SENDER,SERVER
                  AMQCRS6A - Any remotely started channel over LU62/SNA
                           - Could be
                  RECEIVER,REQUESTER,CLUSRCVR,SVRCONN,SENDER,SERVER
                  AMQPCSVA - PCF command processor
                  AMQRIMNA - Channel initiator (trigger monitor to start
                  channel)
                  AMQIQES4 - Quiesce (forces user logoffs - for upgrades)
                  AMQIQEJ4 - Quiesce (without user logoffs - for daily use
                  if desired)

                  AIX
                  amqhasmx - logger
                  amqharmx - log formatter, used only if the queue manager
                  has linear logging selected
                  amqzllp0 - checkpoint processor
                  amqzlaa0 - queue manager agent(s)
                  amqzxma0 - processing controller
                  amqcrsta - Any remotely started channel over TCP/IP
                           - Could be
                  RECEIVER,REQUESTER,CLUSRCVR,SVRCONN,SENDER,SERVER
                  amqcrs6a - Any remotely started channel over LU62/SNA
                           - Could be
                  RECEIVER,REQUESTER,CLUSRCVR,SVRCONN,SENDER,SERVER
                  runmqchl - Any locally started channel over any protocol
                           - Could be SENDER,SERVER,CLUSSDR,REQUESTER
                  runmqlsr - listener process
                  runmqchi - channel initiator
                  runmqsc  - MQ Command interface
                  amqpcsea - PCF command processor

                  HP/UX
                  amqhasmx - logger
                  amqharmx - log formatter, used only if the queue manager
                  has linear logging selected
                  amqzllp0 - checkpoint processor
                  amqzlaa0 - queue manager agents
                  amqzxma0 - processing controller
                  amqcrsta - Any remotely started channel over TCP/IP
                           - Could be
                  RECEIVER,REQUESTER,CLUSRCVR,SVRCONN,SENDER,SERVER
                  amqcrs6a - Any remotely started channel over LU62/SNA
                           - Could be
                  RECEIVER,REQUESTER,CLUSRCVR,SVRCONN,SENDER,SERVER
                  runmqchl - Any locally started channel over any protocol
                           - Could be SENDER,SERVER,CLUSSDR,REQUESTER
                  runmqlsr - listener process
                  runmqchi - channel initiator
                  runmqsc  - MQ Command interface
                  amqpcsea - PCF command processor

                  OS2
                  AMQHASM2.EXE - The logger
                  AMQHARM2.EXE - Log formatter (LINEAR logs only)
                  AMQZLLP0.EXE - Checkpoint process
                  AMQZLAA0.EXE - LQM agents
                  AMQZXMA0.EXE - Execution controller
                  AMQXSSV2.EXE - Shared memory servers
                  AMQCRSTA.EXE - Any remotely started channel over TCP/IP
                               - Could be
                  RECEIVER,REQUESTER,CLUSRCVR,SVRCONN,SENDER,SERVER
                  AMQCRS6A.EXE - Any remotely started channel over LU62/SNA

                               - Could be
                  RECEIVER,REQUESTER,CLUSRCVR,SVRCONN,SENDER,SERVER
                  RUNMQCHL.EXE - Any locally started channel over any
                  protocol
                               - Could be SENDER,SERVER,CLUSSDR,REQUESTER
                  RUNMQLSR     - LISTENER PROCESS
                  RUNMQCHI     - CHANNEL INITIATOR
                  RUNMQSC.EXE  - MQSeries Command processor
                  AMQPCSEA.EXE - PCF command processor

반응형

'UTIL > WMQSeries' 카테고리의 다른 글

WMQ Channel Status  (7) 2014.07.09
WMQ 간단한 사용팁2 (7.1.x, 7.5.x MQRC 2035 문제)  (0) 2013.08.19
WMQ 간단한 사용팁1  (0) 2011.08.23
[EAI]IBM WMQ 구성 참고  (0) 2011.08.21
WMQ 7.0 Linux에서 설치하기  (0) 2011.08.21
반응형

 

 

WMQ 7.1 이나 7.5 이상 버전에서는 channel의 mcauser만 바꿔준다고 해서 서드파티 모니터링 툴이 해당 큐매니저에 붙을 수 없다.

몇 가지 작업을 더 해줘야 하는데 해당 문제는 WMQ가 업그레이드 되며 보안문제 이슈 해결을 위해 추가된 기능으로 보인다.

 

해당 문제는 WMQ 6, 7.0.x 대에서는 해당하지 않는다.

 

2035 MQRC_NOT_AUTHORIZED

해당 문제가 발생할 때 근본적으로는 system.def.svrconn의 mcauser가 관리자로 지정되어 있지 않기 때문에 그랬다.

하지만 해당 버전 부터는 해당 큐 매니저 접속 채널 자체의 인증작업을 거쳐야 하는데 이는 관리자가 추가할 수 있다.

 

이 전과 동일하게 사용하기 위해서는 가장 간단하게 이 채널 인증 기능을 DISABLE 해버리는 것이다.

 

$ runmqsc QmgrName
DISPLAY QMGR CHLAUTH
AMQ8408: Display Queue Manager details.
QMNAME(TEST01) CHLAUTH(ENABLED) <- 인증 작업을 거치도록 설정되어 있음.

DISPLAY CHLAUTH(*)
1 : DISPLAY CHLAUTH(*)
AMQ8878: Display channel authentication record details.
CHLAUTH(SYSTEM.ADMIN.SVRCONN) TYPE(ADDRESSMAP)
ADDRESS(*) USERSRC(CHANNEL)
AMQ8878: Display channel authentication record details.
CHLAUTH(SYSTEM.*) TYPE(ADDRESSMAP)
ADDRESS(*) USERSRC(NOACCESS)
AMQ8878: Display channel authentication record details.
CHLAUTH(*) TYPE(BLOCKUSER)
USERLIST(*MQADMIN)

 

따라서 아래와 같이 설정해 주면 이 이전 버전들과 동일하게 사용할 수 있다.

ALTER QMGR CHLAUTH(DISABLED)

 

하지만 기껏 인증 기능 추가했더니 인증기능 Disable 시키는건 아무도 좋아하지 않을터.

IBM에서는 아래의 방법을 가이드하고 있다.

 

1) You can add the following two Channel Authentication Records discussed in the following presentation:
The first rule blocks administrative users and the MCAUSER "nobody" (which prevents someone from creating a user ID "nobody" and putting it into an authorized group).
$ runmqsc QmgrName
SET CHLAUTH(*) TYPE(BLOCKUSER) USERLIST('nobody','*MQADMIN')

The second rule provides a reduced blacklist for SYSTEM.ADMIN channels that allows administrators to use these. It is assumed here that some other CHLAUTH rule such as an SSLPEERMAP has validated the administrator’s connection or than an exit has done so.
SET CHLAUTH(SYSTEM.ADMIN.*) TYPE(BLOCKUSER) USERLIST('nobody')

The above rules apply to SYSTEM.ADMIN.SVRCONN which is used by the MQ Explorer.

If you are using another user-defined channel, such as MY.ADMIN.SVRCONN, then you need to add the following two records:
SET CHLAUTH(MY.ADMIN.SVRCONN) TYPE(ADDRESSMAP) ADDRESS(*) USERSRC(CHANNEL)
SET CHLAUTH(MY.ADMIN.SVRCONN) TYPE(BLOCKUSER) USERLIST('nobody')


Note: it is not advisable to use SYSTEM.DEF.* channels for active connections. The system default channels are the objects from which all user-defined channels inherit properties. The recommended practice is that SYSTEM.DEF.* and SYSTEM.AUTO.* channels should NOT be configured to be usable.

 

 

2) This is a variation of 1) but allowing the MQ Administrator to only use a particular host.
The first rule blocks MCAUSER "nobody".
SET CHLAUTH(SYSTEM.ADMIN.SVRCONN) TYPE(BLOCKUSER) USERLIST('nobody')

The second rule removes all access to SYSTEM.ADMIN.SVRCONN ...
SET CHLAUTH(SYSTEM.ADMIN.SVRCONN) TYPE(ADDRESSMAP) ADDRESS(*) ACTION(REMOVE)

... and the third rule adds an entry for the server that needs access.
SET CHLAUTH(SYSTEM.ADMIN.SVRCONN) TYPE(ADDRESSMAP) ADDRESS(9.27.4x.7y) USERSRC(CHANNEL)

 

반응형

'UTIL > WMQSeries' 카테고리의 다른 글

WMQ Channel Status  (7) 2014.07.09
IBM WMQ 운영체제별 상주프로세스 - 기능 목록  (0) 2013.08.19
WMQ 간단한 사용팁1  (0) 2011.08.23
[EAI]IBM WMQ 구성 참고  (0) 2011.08.21
WMQ 7.0 Linux에서 설치하기  (0) 2011.08.21
반응형

 

현재 폴더의 SVN 폴더를 해제하기 위해서는 .svn 폴더를 삭제해주면 된다.

더불어 .cvs CVS 폴더까지 깔끔하게 지우려면 해당 디렉토리에서 아래 명령어를 입력해주자

 

참고로 정상적인 방법은 아니고 꼼수...

 

FOR /r . %f IN (.svn) DO RD /s /q "%f"   (.svn 폴더 하위 삭제)
FOR /r . %f IN (.cvs) DO RD /s /q "%f"   (.cvs 폴더 하위 삭제)
FOR /r . %f IN (CVS) DO RD /s /q "%f"   (CVS 폴더 하위 삭제)

 

반응형
반응형

어떤 분이 써놓은 신 문서이다.

정리가 제법 잘 되어 있어서 퍼왔다.

 

원문 출처

http://optimizer.snu.ac.kr/yanne/

 

 

 

 

GDB 사용하기

 

1.   GDB

 

GDB같은 디버거의 목적은 다른 프로그램 수행 중에 프로그램 내부에서무슨 일이 일어나고 있는지 보여주거나 프로그램이 잘못 실행되었을 무슨 일이 일어나고 있는지 보여주는 것이다. GDBC, C++, Modula-2 프로그램을 디버그 있다.

쉘에서 gdb GDB 시작하면 quit 종료명령을 주기전까지는 터미널로부터 명령라인을 읽어 들인다. help명령을 사용하여 gdb내부에서 도움말을 있다.

디버깅을 하기 위해서는 –g옵션을 주고 컴파일/링크 해야 한다. 만약 링크가 libg.a 찾을 없다고 하면서 실패하게 되면, /usr/lib/ligb.a 갖고 있지 않기 때문이다. 파일은 특별한 라이브러리로서 디버깅 가능 C라이브러리이다. libc 패키지에 포함되어 있거나 또는 libc 소스 코드를 받아서 컴파일 하면 생긴다. /usr/lib/libc.a /usr/lib/libg.a 링크 시켜도 된다.

 

l  코어파일 분석하기

 

코어파일은 충돌할 당시 프로세스의 메모리 이미지를 덤프한 것이다. 코어파일을 gdb 함께 사용하여 프로그램의 상태를 조사하고 실패 원인을 규명할 있다. 어떤 예기치 않은 일이 발생하여 비정상적인 종료가 발생할 운영체계는 디스크에 코어 파일을 남긴다.메모리에 관한 문제는 Checker 패키지를 사용하여 예방할 있다. 하지만 메모리 fault 일으키는 경우에는 충돌하면서 파일을 덤프한다. 코어파일은 일반적으로 프로세스를 실행시킨 현재 작업 디렉토리에 생성되지만 프로그램 내에서 작업 디렉토리를 바꾸는 경우도 있다.

 

보통 리눅스는 부팅시에 코어 파일을 만들지 않도록 세팅되어 있다. 코어 파일 생성을 가능케 하려고 한다면 그것을 다시 가능케 하는 셀의 내장 명령을 사용한다.

만약C 호환 (tcsh) 쓰고 있다면 다음과 같이 명령을 내린다.

%  limit core unlimited

만약 본쉘류( sh , bash , zsh , pdksh ) 사용하고 있다면,

$  ulimit –c unlimited

같은 명령을 내린다.

코어파일을 함께 사용하기 위해선 다음과 같이 한다.

% gdb program core

 

ulimte -a 를 하면 현재 설정값을 볼 수 있다.

 

 

l  실행 중인 프로그램 디버깅하기

 

gdb 이미 실행중인 프로그램도 디버깅할 있게 해준다. 프로세스 실행을 가로채고 조사한 다시 원래 상태로 실행하도록 있다. attach명령을 사용하여 실행중인 프로세서에 gdb 붙인다. attach 명령을 사용하기 위해서는 프로세스에 해당하는 실행 프로그램에 허가권을 가지고 있어야 한다. 예를 들어 프로세스 ID 254번으로 실행 중인 pgmseq 프로그램이 있다면 다음과 같이 한다.

% gdb pgmseq

% attach 254

다음과 같이 해도 된다.

% gdb pgmseq 254

 

일단 gdb 실행 중인 프로세스에 부착되면 프로그램을 일시 중지 시키고 gdb명령을 사용할 있도록 제어권을 가져온다. break 사용하여 중지점을 사용할 있고 중지점에 이를 때까지 실행하도록 continue 명령을 사용할 있다.

detach명령을 사용하여 gdb 실행 중인 프로세스에서 떼어 낸다. 필요에 따라 다른 프로세스에 대하여 attach명령을 사용할 있다.

 

2.   gdb시작하기

 

% gdb                       - gdb 먼저 실행 file이라는 명령으로 program 부른다.

% gdb  program         - 일반적인 방법이다.

% gdb  program  core - 코어파일을 사용할 동시에 인자로 준다.

% gdb  program  1234 - 실행중인 프로세스를 디버그 하려면 프로세스 ID 번째 인자로 주면 된다. 명령은 gdb (‘1234’ 이름의 파일이 없다면) 프로세스 1234 접속시킨다.(gdb core파일을 먼저 찾는다.)

 

실행절차

%  gcc  –g  test.c  –o  test

%  gdb  test

명령을 실행하면 다음과 같은 메시지가 나타난다.

% gdb test

GNU gdb 4.18

Copyright 1998 Free Software Foundation, Inc.

GDB is free software, covered by the GNU General Public License, and you are

Welcome to change it and/or distribute copies of it under certain conditions.

Type “show copying” to see the conditions.

There is absolutely no warranty for GDB.  Type “show warranty” for details.

This GDB was configured as “i386-redhat-linux”...

(gdb)

 

3.   많이 사용하는 GDB명령어

 

list

현재 위치에서 소스 파일의 내용을 10 보여준다

list 2, 15 : 소스 파일의2 ~ 15 까지를 보여준다.

run

프로그램을 시작한다.(break 있다면 break까지 실행)

run arg : 새로운 인수를 가지고 프로그램을 시작한다.

arg “*” “[…]” 포함할 수도 있다.

쉘의 사용까지도 확장될 있다.

“<”,“>” , “>>”같은 입출력 방향 재지정기호도 또한 허용된다.

break

특정 라인이나 함수에 정지점을 설정한다.

break function : 현재 파일 안의 함수 function 정지점을 설정한다.

break file:function : 파일file안의 function 정지점을 설정한다.

watch : 감시점 설정(감시점은 어떤사건이 일어날 때에만 작동한다)

until : 실행중 line까지 실행

clear   

특정 라인이나 함수에 있던 정지점을 삭제한다.

delete 

몇몇 정지점이나 자동으로 출력되는 표현을 삭제한다.

next

다음 행을 수행한다. 서브루틴을 호출하면서 계속 수행한다.

호출이 발생하지 않으면 step 같다.

next n : 이를 n 수행하라는 의미

step

줄씩 실행 시킨다.

함수를 포함하고 있으면 함수 내부로 들어가서 줄씩 실행시킨다.

print

print expr : 수식의 값을 보여준다.

display

현재 display 명령의 목록을 보여준다.

bt

프로그램 스택을 보여준다. (backtrace)

kill

디버깅 중인 프로그램의 실행을 취소한다.

file

file program : 디버깅할 프로그램으로서 파일을 사용한다.

cont

continue : 현재 위치에서 프로그램을 계속 실행한다.

help

명령에 관한 정보를 보여주거나 일반적인 정보를 보여준다.

quit

gdb에서 빠져나간다.

 

 

 

 

 

 

4.   gdb 해보기

 

예제1

 

% vi test.c

      1 #include <stdio.h>

      2

      3 main()

      4 {

      5     int i;

      6     double j;

      7     /*다음은i/2+i 값을 출력하는 문이다.

      8       i1이면 j1.5 되어야 하지만 실제는 그렇지 않다.*/

      9     for( i=0; i<5 ; i++){

     10         j=i/2+i;

     11         printf(“j is %f \n”,j);

     12     }

     13 }

% gcc –g test.c –o test

% test

실행이 되지 않으면 mv test a.out으로 하여a.out 실행시킨다. 실행을 시키면 원하는 답이 아니다. 그러면 gdb 해보자.

% gdb a.out

(gdb) list        // list 소스 내용을 10줄씩 보여준다.

1         #include <stdio.h>

2

3         main()

4         {

5         int i;

6         double j;

7         /*다음은i/2+i 값을 출력하는 문이다.

8         i1이면 j1.5 되어야 하지만 실제는 그렇지 않다.*/

9         ( i=0; i<5 ; i++){

j=i/2+i;

 

(gdb) b 9  // break 9 : for 문에 이상이 있다고 판단하여 line 9 breakpoint 잡는다.

Breakpoint 1 at 0x80483d6: file test.c, line 9.

(gdb) r               // run : breakpoint까지 실행된다.

Starting program: /home/pllab/chowing/gdb/a.out

Breakpoint 1, main () at test.c:9

9  for( i=0; i<5 ; i++){

(gdb) s                           // step : 한줄 실행시킨다.

j=i/2+i;

(gdb) s

11  printf(“j is %f \n”,j);

(gdb) p j         // print j : j 값을 본다.

$2 = 0

(gdb) n

j is 0.000000

for( i=0; i<5 ; i++){

(gdb) display i

(gdb) display j

(gdb) n

11  printf(“j is %f \n”,j);

2: j = 1

1: i = 1

// 10 line에서 실행 i=1 , j=1이므로 10 line에서 잘못된 것을 있다.

// 10 line j = (double) i/2 + i; 고친다.

(gdb) quit

 

예제2

 

% vi hab.c

      1 #include <stdio.h>

      2

      3 int hab(int x, int y);

      4

      5 main(void)

      6 {

      7     int a, b,dab;

      8     printf(“정수a, b 입력하시오”);

      9     scanf(“%d %d”,&a,&b);

     10     dab = hab(a,b);

     11     printf(“\n%d + %d = %d \n”,a,b,dab);

     12 }

     13 int hab(int x, int y)

     14 {

     15     return (x + y);

     16 }                                      

 

// 프로그램은 이상은 없다. 스택을 보기 위한 것이다.

// 여러 곳에서 호출되는 함수 안에서 충돌이 일어날 경우를 생각해 보자. 때는 함수가 어디로부터 호출되었는지 그리고 어떤 상황에서 충돌이 일어났는지 파악하고자 것이다.

backtrace (bt) 명령을 이용하면 충돌이 일어난 시점에서 프로그램의 현재 호출 스택(call stack) 상태를 있다. 호출 스택은 현재 함수까지 이르는 호출 목록이다. 함수를 호출할 때마다 보관된 레지스터 , 함수 전달 인수, 지역 변수 등의 자료를 스택에 push한다. 이렇게 해서 함수들은 스택상에 일정 공간을 차지한다. 특정함수에 대하여 스택에서 사용되고 있는 메로리 부분을 스택프레임(frame)이라 부르며 호출 스택은 이러한 스택 프레임을 순서대로 정렬한 목록이다.

% gdb hab

(gdb) b 10      Breakpoint 2 at 0x8048428: file hab.c, line 10.

(gdb) r

Starting program: /home/pllab/chowing/gdb/hab

정수a, b 입력하시오3 4

breakpoint 2, main () at hab.c:10

10       dab = hab(a,b);

(gdb) bt         // 현재 스택에 main 있다.

#0  main () at hab.c:10

(gdb) s

hab (x=3, y=4) at hab.c:15

15          return (x + y);

(gdb) bt         // 지금은 스택에 hab 있다.

#0  hab (x=3, y=4) at hab.c:15

#1  0x8048435 in main () at hab.c:10

(gdb) frame 0 // hab 상태를 점검하기 위해서 스택 프레임0번으로 이동

#0  hab (x=3, y=4) at hab.c:15

15          return (x + y);

(gdb) up           // hab 어떻게 호출되었는가를 보기 위하여 상위 스택프레임으로 이동

#1  0x8048435 in main () at hab.c:10

dab = hab(a,b);

(gdb) finish

(gdb) info program     // 프로그램의 실행 상태를 보여 준다.

Using the running image of child Pid 12909.

Program stopped at 0x804843d.

It stopped after being stepped.

(gdb) info locals          // 현재 함수 내에서 모든 지역 변수 이름과 값을 출력한다.

a = 3

b = 4

dab = 7

(gdb) info variables   // 소스파일 순서대로 프로그램 내에 알려져 있는 모든 변수를 출력한다.

(gdb) info address a   // 어떤 변수가 어디에 저장되어 있는지에 대하여 알려 준다.

Symbol “a” is a local variable at frame offset -4.

// a 스택프레임 꼭대기로부터4바이트 아래에 놓여 있다는 뜻이다.

(gdb) info frame         // 현재 프레임 정보를 보여 준다.

Stack level 0, frame at 0xbffff848:

eip = 0x804843d in main (hab.c:11); saved eip 0x400301eb

source language c.

Arglist at 0xbffff848, args:

Locals at 0xbffff848, Previous frame’s sp is 0x0

Saved registers:

ebp at 0xbffff848, eip at 0xbffff84c

 

예제3

 

% vi core.c

      1 #include <stdio.h>

      2

      3 main()

      4 {

      5     char *bug = NULL;

      6

      7     strcpy(bug,“debug”);

      8     printf(“bug is %s \n”,bug);

      9

     10     return;

     11 }

     12

% coredebug

Segmentation fault

// core 파일 생성

% gdb coredebug

(gdb) b 7

Breakpoint 1, main () at core.c:7

7           strcpy(bug,”debug”);

(gdb) p bug

$1 = 0x0         // gdb 에서0x0 null이다. 번지가 없다.

(gdb) s

Program received signal SIGSEGV, Segmentation fault.

0x40075434 in ?? ()    

// strcpy에서 segmentation fault 발생한 것을 있다.

// bug 번지를 할당하면 된다.

 

% gdb corebug core  // core파일을 이용하면 bug정보가 나온다.

GNU gdb 4.18

Copyright 1998 Free Software Foundation, Inc.

GDB is free software, covered by the GNU General Public License, and you are

welcome to change it and/or distribute copies of it under certain conditions.

Type “show copying” to see the conditions.

There is absolutely no warranty for GDB.  Type “show warranty” for details.

This GDB was configured as “i386-redhat-linux”...

warning: core file may not match specified executable file.

Core was generated by ‘a.out’.

Program terminated with signal 11, 세그멘테이션 오류.

Reading symbols from /lib/libc.so.6...done.

Reading symbols from /lib/ld-linux.so.2...done.

#0  strcpy (dest=0x0, src=0x8048490 “debug”) at ../sysdeps/generic/strcpy.c:38

../sysdeps/generic/strcpy.c: 그런 파일이나 디렉토리가 없음.

gdb signal 11 번과 함께 코어 파일이 생성되었음을 알려 준다. 여기서는 허가받지 않은 메모리 공간에 읽기, 쓰기를 시도했기 때문에 커널이 프로세스에게 signal 11 보냈다.

시그널로 인해 프로세스는 종료하면서 코어 파일을 덤프한다.

 

l  기타 기능

 

gdb 매우 많은 기능을 가진 프로그램이다.

 

Breakpoint

중지점을 조건적으로 설정할 있다. 어떤 동작이 참일 때만 작동하도록 있다.  Ex) break 184 if (stace == 0)

info break 사용하면 모든 중지점과 감시점 목록을 보여 주고 상태도 보여 준다.

disable 사용하여 작동불능으로 있고 enable 사용하여 가능하게 수도 있다.

 

 

인스트럭션 레벨 디버깅

gdb 통해 인스트럭션 레벨의 디버깅을 있으므로 프로그램의 매우 깊은 내부까지 조사할 있다.

(gdb) disass play      //play함수에 대한 디스어셈블리.

(gdb) display/ i $pc   //현재의 인스트럭션을 보여준다. $pc gdb내부 변수로서 현재 인스트럭션의 위치를 가리키는 프로그램 카운터이다.

 

참고

GDB 대한 매뉴얼은

http://kkucc.konkuk.ac.kr/~kipal/html/gdb-man.html에서 있다.

(복사본)

http://pl.changwon.ac.kr/~chowing/gdb_man.html

 

반응형
반응형

 

 

dbx와 core 파일을 분석할때는 다음과 같이 하자.

 

우선 첫째로 현재 해당 core파일을 생성한 바이너리 부터 확인해보자.

file 다음 core 파일을 입력하면 현재 core 파일의 [비트], [생성한 바이너리명] 을 알 수 있다.

$> file core

core_: AIX core file 64-bit, server

 

그 다음 core 파일과 dbx를 실행 시켜보자.

실행 방법은 dbx [바이너리경로] [코어파일경로]

 

dbx가 실행 된 뒤 where 을 치면 차세한 오류 내역을 확인할 수 있다.

$> dbx server core

(dbx) where

.

.

warning: "/lib/libi18n.a(shr_64.o)" has changed since core creation
warning: "/lib/libiconv.a(shr4_64.o)" has changed since core creation
warning: "/usr/mqm/lib64/libmqmcs.a(shr.o)" has changed since core creation
warning: "/usr/mqm/lib64/libmqz.a(libmqz.o)" has changed since core creation
warning: "/lib/libC.a(shr2_64.o)" has changed since core creation
warning: "/lib/libnsl.a(shr_64.o)" has changed since core creation
warning: "/lib/libC.a(ansi_64.o)" has changed since core creation
warning: "/lib/libc.a(shr_64.o)" has changed since core creation

 

IOT/Abort trap in pthread_kill at 0x900000000aa37d0
0x900000000aa37d0 (pthread_kill+0xb0) e8410028          ld   r2,0x28(r1)
(dbx) q

 

뭐.. 이런식으로 확인한다.

 

dbx로 Running Process를 분석할때는 아래와 같다

$> dbx -d<depth> -a <pid>

ex) dbx -d 300 -a 12345

 

dbx에서 thread 정보를 확인하고자 할때는

(dbx) thread

(dbx) thread info <thread no.>

 

특정 프로세서의 thread 상황은

(dbx) ps -p <pid> -mo THREAD

 

 

file 와 [디렉토리 경로]

list [start] , [end]

또는 바로 수정하려면 edit를 사용하면 된다.

 

dbx에서 사용가능한 명령어들은 다음과 같다.

 addcmd       alias        assign       attribute    barrier      call       
 case         catch        clear        cleari       condition    corefile   
 coremap      cont         delcmd       delete       detach       disable    
 display(/)   down         dump         edit         enable       fd         
 file         frame        func         goto         gotoi        handler    
 help         ignore       kthread      list         listi        malloc     
 map          move         multproc     mutex        spinlock     next       
 nexti        onceblock    plugin       pluginload   pluginunload print      
 proc         prompt       pthread      quit         registers    rerun      
 resource     return       run          rwlock       screen       search(/?) 
 set          sh           skip         source       status       step       
 stepi        stop         stophwp      stopi        thread       tls        
 tnext        tnexti       trace        tracehwp     tracei       tskip      
 tstep        tstepi       tstop        tstophwp     tstopi       ttrace     
 ttracehwp    ttracei      unalias      unset        up           use        
 whatis       where        whereis      which    

 

gdb에서는 break <linenumber> 이지만 dbx에서는 stop <linenumber> 인듯하다.

 

디버깅을 하기 위해서는 –g옵션을 주고 컴파일/링크 해야 한다. 만약 링크가 libg.a 찾을 없다고 하면서 실패하게 되면, /usr/lib/ligb.a 갖고 있지 않기 때문이다. 파일은 특별한 라이브러리로서 디버깅 가능 C라이브러리이다. libc 패키지에 포함되어 있거나 또는 libc 소스 코드를 받아서 컴파일 하면 생긴다. /usr/lib/libc.a /usr/lib/libg.a 링크 시켜도 된다.

 

또한 AIX에서 ulimit로 코어파일을 생성하도록 설정해줘야 한다.

-c 옵션으로 생성하는 코어파일의 block 크기를 지정할 수 있다. block 크기는 시스템에 따라 다르다

 

코어 파일 생성을 가능케 하려고 한다면 그것을 다시 가능케 하는 셀의 내장 명령을 사용한다.

만약C 호환 (tcsh) 쓰고 있다면 다음과 같이 명령을 내린다.

%  limit core unlimited

만약 본쉘류( sh , bash , zsh , pdksh ) 사용하고 있다면,

$  ulimit –c unlimited

같은 명령을 내린다.

 

코어파일을 함께 사용하기 위해선 다음과 같이 한다. (gdb의 경우)

% gdb program core

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

자세한 메뉴얼은 아래에 써 놓습니다.

출처 : http://alladdin.tistory.com/21

----------------------------------------------

 

dbx 명령

목적

디버그할 환경을 제공하고 프로그램을 실행합니다.

구문

dbx [ -a ProcessID ] [ -c CommandFile ] [ -d NestingDepth ] [ -I Directory ] [ -E DebugEnvironment ] [ -p oldpath=newpath:...| pathfile ] [ -k ] [ -u ] [ -F ] [ -r ] [ -x ] [ ObjectFile [ CoreFile ] ]

 

설명

dbx 명령은 C, C++, Pascal 및 FORTRAN 프로그램에 대한 디버그를 제공하여, 사용자가 다음과 같은 작업을 수행할 수 있도록 합니다.

  • 오브젝트 및 코어 파일 검사.
  • 프로그램 실행을 위한 제어 환경 제공.
  • 선택한 문장에 중단점을 설정하거나 한 번에 한 행씩 프로그램 실행.
  • 변수를 사용하여 디버그한 후 올바른 형식으로 표시.

ObjectFile 매개변수는 컴파일러가 만들어 내는 오브젝트(실행 가능) 파일입니다. dbx 명령에 필요한 정보를 만들기 위해 프로그램 컴파일 시 -g(기호 테이블 작성) 플래그를 사용합니다.

주: 오브젝트 파일을 컴파일할 경우 cc 명령의 -g 플래그를 사용해야 합니다. -g 플래그를 사용하지 않거나 strip 명령으로 xcoff 파일에서 기호 참조가 제거된 경우, dbx 명령의 사용 범위는 제한됩니다.

-c 플래그를 지정하지 않으면 dbx 명령은 사용자의 $HOME 디렉토리의 .dbxinit 파일을 검사합니다. 그런 다음, 사용자의 현재 디렉토리에서 .dbxinit 파일을 검사합니다. .dbxinit 파일이 현재 디렉토리에 존재하면, 이 파일이 사용자의 $HOME 디렉토리에 있는 .dbxinit 파일을 대체합니다. .dbxinit 파일이 사용자의 $HOME 디렉토리 또는 현재 디렉토리에 존재하면, 디버그 세션이 시작될 때 이 파일의 부속 명령이 실행됩니다. 편집기를 사용하여 .dbxinit 파일을 작성하십시오.

ObjectFile을 지정하지 않으면, dbx는 디버그할 오브젝트 파일 이름을 요청합니다. 디폴트는 a.out입니다. 코어 파일이 현재 디렉토리에 존재하거나 CoreFile 매개변수가 지정되어 있으면, dbx는 프로그램에 이상이 있는 위치를 보고합니다. 코어 이미지에 보유된 변수, 레지스터 및 메모리는 ObjectFile의 실행이 시작될 때까지 검사됩니다. 그 시점에 dbx 디버그 프로그램은 명령을 위한 프롬프트를 리턴합니다.

표현식 처리

dbx 프로그램은 광범위한 표현식을 사용합니다. dbx 디버그 프로그램에 C 및 Pascal 구문의 공통적인 기능의 일부와, 여러 가지 FORTRAN 확장자를 가진 표현식을 지정할 수 있습니다.

디버그 프로그램에서 자주 사용되는 연산자는 다음과 같습니다.

* 또는 ^ 간접 선언이나 포인터 참조를 표시합니다.
[ ] 또는 ( ) 첨자 배열 표현식을 표시합니다.
. 포인터 및 구조체와 함께 이 필드 참조 연산자를 사용합니다. 이것은 C 연산자인 -> (화살표)를 사용하지 않고도 가능합니다.
& 변수 주소를 알 수 있습니다.
.. 배열의 하위 섹션을 지정할 때 상하한을 구분합니다. 예제 : n[1..4].

디버그 프로그램에서 사용되는 연산자 유형은 다음과 같습니다.

대수표현식 =, -, *, /(부동소수의 나눗셈), div(정수의 나눗셈), mod, exp(지수연산)
비트 단위 연산 -, I, bitand, xor, ~. <<, >>
논리적 or, and, not, II, &&
비교 <, >, <=, >=, < > or !=, = or ==
기타 (유형 이름), 크기

논리적 표현식과 비교 표현식이 stoptrace의 조건으로 허용됩니다.

표현식 유형이 검사됩니다. 사용자는 표현식의 이름을 변경하거나 캐스팅 연산자를 사용하여 표현식 유형을 대체합니다. 이름 바꾸기의 세 가지 양식은 Typename(Expression), Expression |Typename, (Typename) Expression입니다. 다음 예제에서 변수 x는 값이 97인 정수입니다.

(dbx) print x
97
(dbx) print char (x), x ₩ char, (char) x, x
'a' 'a' 'a' 97

명령행 편집

dbx 명령은 Korn 쉘에서 제공하는 것과 유사한 명령행 편집 기능을 제공합니다. vi 모드는 vi와 같은 편집 기능을 제공하는 반면, emacs 모드는 emacs와 유사한 제어를 제공합니다.

이 기능은 dbx 부속 명령인 set -o 또는 set edit를 사용하여 설정될 수 있습니다. vi 방식의 명령행 편집 기능을 사용하기 위해서는, 부속 명령 set edit vi 또는 set -o vi를 입력하십시오.

EDITOR 환경 변수를 사용하여 편집 모드를 설정할 수도 있습니다.

dbx 명령은 입력된 명령을 .dbxhistory 파일에 저장합니다. DBXHISTFILE 환경 변수가 설정되지 않은 경우, 기록을 위해 사용되는 파일은 $HOME/.dbxhistory입니다.

디폴트로, dbx는 최근에 입력된 128개의 명령 텍스트를 저장합니다. DBXHISTSIZE 환경 변수는 이 한계를 늘리는데 사용될 수 있습니다.

플래그

-a ProcessID 디버그 프로그램을 실행 중인 프로세스에 연결합니다. 디버그 프로그램을 연결하려면, 이 프로세스에 대해 kill 명령을 사용할 수 있는 권한이 있어야 합니다. 프로세스 ID를 판별하려면 ps 명령을 사용하십시오. 사용 권한이 있으면, dbx 프로그램은 프로세스를 인터럽트하고, 오브젝트 파일의 전체 이름을 판별하며, 기호 정보를 읽고, 명령을 입력할 수 있는 프롬프트를 처리합니다.
-c CommandFile 표준 입력(STDIN)으로부터 읽기 전에 파일에 있는 dbx 부속 명령을 실행합니다. $HOME 디렉토리에 지정된 파일을 먼저 처리한 다음, 현재 디렉토리에 있는 파일을 처리합니다. 현재 디렉토리에 있는 명령 파일이 $HOME 디렉토리에 있는 명령 파일보다 우선적으로 처리됩니다. 지정된 파일이 $HOME 디렉토리 또는 현재 디렉토리에 존재하지 않으면, 경고 메시지가 표시됩니다. source 부속 명령은 dbx 프로그램이 시작될 때 한 번 사용됩니다.
-d NestingDepth 프로그램 블록의 중첩 한계를 설정합니다. 디폴트 중첩 행 수는 25입니다.
-E DebugEnvironment 디버그 프로그램에 대한 환경 변수를 지정합니다.
-p oldpath=newpath:...| pathfile oldpath=newpath 형식으로 코어 파일을 조사할 경우 라이브러리 경로에 대한 대체를 지정합니다. oldpath는 대체될 기존 값(코어 파일에 저장된 대로)을 지정하고 newpath는 대체할 새로운 값을 지정합니다. 이들은 전체 또는 부분, 상대 또는 절대 경로입니다. 복수의 대체를 콜론으로 구분하여 지정할 수 있습니다. 또다른 방법으로, -p 플래그를 사용하여 이전에 설명된 형식으로 맵핑을 읽을 파일의 이름을 지정할 수 있습니다. 맵핑을 파일에서 읽을 때 행당 하나의 맵핑만이 허용됩니다.
-F 레이지(lazy) 읽기 모드를 끄고 dbx 명령에서 시작 시 모든 기호를 읽게 하는데 사용할 수 있습니다. 디폴트로, 레이지(lazy) 읽기 모드는 온(on) 상태입니다. 이는 dbx 세션을 초기화하는 데 필요한 기호 테이블 정보만을 읽습니다. 이 모드에서, dbx는 기호 정보를 읽지 않은 국지 변수 및 유형은 읽지 않습니다. 따라서, whereis i와 같은 명령은 각 함수 내의 국지 변수 i의 모든 경우에 대해서 보여줄 수는 없습니다.
-I Directory (대문자 i) 소스 파일을 검색한 디렉토리 리스트의 Directory 변수에서 지정한 디렉토리가 포함됩니다. 디폴트는 다음 디렉토리에서 소스 파일을 찾는 것입니다.
  • 컴파일되었을 때 소스 파일이 위치한 디렉토리. 이 디렉토리는 컴파일러가 오브젝트의 소스 경로에 있을 경우에만 찾을 수 있습니다.
  • 현재 디렉토리
  • 프로그램이 현재 위치한 디렉토리.
-k 메모리 주소를 대응시킵니다. 커널 디버깅에 사용될 수 있습니다.
-r 즉시 오브젝트 파일을 실행합니다. 성공적으로 종료되면, dbx 디버그 프로그램이 종료됩니다. 그렇지 않으면, 디버그 프로그램으로 들어가게 되고 종료된 원인을 보여줍니다.
주: -r을 지정하지 않으면, dbx 명령은 사용자가 명령을 입력하도록 프롬프트를 대기시킵니다.
-u dbx 명령은 파일 이름 기호 앞에 @(at 기호)를 붙입니다. 이 플래그는 모호한 기호 이름이 생기는 것을 방지해 줍니다.
-x dbx 명령이 FORTRAN 소스 코드에서 발생한 기호로부터 _(뒤에 붙은 밑줄) 문자를 삭제하지 못하도록 합니다. 이 플래그를 사용하면 dbx에서 밑줄친 문자를 제외하고 동일한 기호(예제: xxxxxx_)를 구분할 수 있습니다.

예제

  1. 다음 예제는 프로세스와 동시에 dbx 디버그 프로그램을 시작하는 방법에 대해 설명합니다. 예제는 samp.c라는 프로그램을 사용합니다. 이 C 프로그램은 먼저 기호 테이블 참조사항이 들어 있는 오브젝트 파일을 작성하기 위해 -g 플래그를 사용하여 컴파일됩니다. 이런 경우, samp 프로그램은 다음 사항을 표시합니다.
    $ cc -g samp.c -o samp

    samp 프로그램이 실행 중일 때 운영 시스템은 버스 오류를 알리고 다음과 같이 사용자의 현재 작업 디렉토리에 코어 이미지를 작성합니다.

    $ samp
    Bus Error - core dumped

    오류가 발생한 위치를 찾아내려면 다음을 입력하십시오.

    $ dbx samp

    시스템이 다음과 같은 메시지를 리턴합니다.

    dbx version 3.1
    Type 'help' for help.
    reading symbolic information . . . [
    using memory image in core]
      25   x[i] = 0;
    (dbx) quit
  2. 이 예제는 프로세스에 dbx를 연결하는 방법에 대해 설명합니다. 이 예제는 looper.c 프로그램을 사용합니다.
    main()
    {
    int i,x[10];
           
          for (i = 0; i < 10;);
    }

    i가 증가하지 않으므로 프로그램이 종료되지 않습니다. 기호 디버깅 기능을 확보하려면 looper.c-g 플래그를 사용하여 컴파일하십시오.

    $ cc -g looper.c -o looper

    명령행에서 looper를 실행하고 다음 단계를 실행하여 프로그램을 실행하는 중에 프로그램에 dbx를 연결합니다.

    1. dbxlooper에 연결하려면 프로세스 ID를 확인해야 합니다. 백그라운드 프로세스로서 looper를 실행하지 않았으면, 다른 Xwindow를 열어 두어야 합니다. 이 Xwindow 창에서, 다음을 입력하십시오.
      ps -u UserID

      여기서 UserID는 로그인 ID를 말합니다. 사용자에게 속하는 사용 중인 모든 프로세스는 다음과 같이 표시됩니다.

      PID     TTY      TIME    COMMAND
      68      console   0:04    sh
      467     lft3     10:48    looper

      이 예제에서 looper와 관련된 프로세스 ID는 467입니다.

    2. dbxlooper에 연결하려면 다음을 입력하십시오.
      $ dbx -a 467

      시스템이 다음과 같은 메시지를 리턴합니다.

      Waiting to attach to process 467 . . .
      Successfully attached to /tmp/looper.
      dbx is initializing
      Type 'help' for help.
      reading symbolic information . . .
       
      attached in main at line 5
      5     for (i = 0; i < 10;);
      (dbx)

      프로세스가 처음에 dbx에 의해 시작된 것처럼 지금 프로세스를 조회하고 디버그할 수 있습니다.

  3. 실행 파일인 objefile의 소스 파일을 검색하기 위한 디렉토리 리스트에 디렉토리를 추가하려면, 다음을 입력하십시오.
    $dbx -I /home/user/src -I /home/group/src 
    objfile

    dbx를 시작하면 use 부속 명령을 이 기능에 사용할 수 있습니다. -I 플래그가 리스트에 디렉토리를 추가하는 것과는 달리 use 명령은 디렉토리 리스트를 재설정합니다.

  4. -r 플래그를 사용하려면 다음을 입력하십시오.
    $ dbx -r samp 

    시스템이 다음과 같은 메시지를 리턴합니다.

    Entering debug program . . .
    dbx version 3.1
    Type 'help' for help.
    reading symbolic information . . .
    bus error in main at line 25
      25   x[i] = 0;
    (dbx) quit

    -r 플래그는 사용자가 코어 이미지를 가지고 있지 않더라도 메모리에서 사용자의 프로세스 상태를 검사할 수 있도록 합니다.

  5. 디버그 프로그램에 대한 환경 변수를 지정하려면, 다음을 입력하십시오.
    dbx -E LIBPATH=/home/user/lib -E LANG=Ja_JP objfile

dbx 부속 명령

주: 부속 명령은 dbx 디버그 프로그램이 실행 중일 때만 사용할 수 있습니다.

/ 패턴의 현재 소스 파일에서 앞쪽으로 검색합니다.
? 특정 패턴에 대해 현재 소스 파일을 역방향으로 검색합니다.
alias dbx 부속 명령에 대한 별명을 작성합니다.
assign 변수에 값을 지정합니다.
attribute 전체 또는 선택된 속성 오브젝트에 관한 정보를 표시합니다.
call 이름이 지정된 프로시저 또는 기능과 관련된 오브젝트 코드를 실행합니다.
case dbx 디버그 프로그램이 기호를 해석하는 방법을 변경합니다.
catch 신호가 응용프로그램으로 보내지기 전에 신호의 트랩을 시작합니다.
clear 정해진 소스 행에서 정지점을 모두 제거합니다.
cleari 특정 주소에 지정되어 있는 중단점을 모두 제거합니다.
condition 전체 또는 선택된 조건 변수에 관한 정보를 표시합니다.
cont 프로그램이 종료되거나 다른 중단점과 만나게 될 때까지 현재의 정지 지점에서 응용프로그램 실행을 계속합니다.
corefile 코어 파일에 대한 상위 레벨 데이터를 표시합니다.
delete 지정된 이벤트 숫자에 해당하는 추적과 정지를 제거합니다.
detach 응용프로그램을 계속 실행하고 디버그 프로그램을 종료합니다.
disable 지정된 이벤트 숫자에 해당하는 추적 및 정지를 사용 불가능하게 합니다.
display memory 메모리 내용을 표시합니다.
down 스택 아래로 현재 기능을 이동합니다.
dump 지정된 프로시저에 있는 변수 이름과 값을 표시합니다.
edit 지정된 파일에서 편집기를 시작합니다.
enable 지정된 이벤트 숫자에 해당하는 추적 및 정지를 사용 가능하게 합니다.
fd 파일 설명자 정보를 표시합니다.
file 현재의 소스 파일을 지정된 파일로 변경합니다.
func 현재의 기능을 지정된 프로시저나 기능으로 변경합니다.
goto 지정된 소스 행이 다음 실행 행이 되도록 합니다.
gotoi 프로그램 계수기 주소를 변경합니다.
handler pthreads atfork 또는 취소 정리 처리기에 대한 정보를 표시합니다.
help dbx 부속 명령 및 주제에 대한 도움말 정보를 표시합니다.
ignore 신호가 응용프로그램으로 보내지기 전에 신호 트랩을 정지합니다.
kthread 커널 스레드에 대한 정보를 표시합니다.
list 현재 소스 파일의 행을 표시합니다.
listi 응용프로그램으로부터 명령어를 나열합니다.
malloc malloc 서브시스템의 프로그램 사용에 대한 정보를 표시합니다.
map 응용프로그램의 로드 특성에 관한 정보를 표시합니다.
move 다음 행이 표시되도록 변경합니다.
multproc 멀티프로세스 디버깅을 사용 가능하게 하거나 사용 불가능하게 합니다.
mutex 전체 또는 선택된 mutexes에 관한 정보를 표시합니다.
next 다음 소스 행까지 응용프로그램을 실행합니다.
nexti 다음 기계 명령어까지 응용프로그램을 실행합니다.
onceblock 1회 블록에 대한 정보를 표시합니다.
plugin 플러그인 부속 명령을 호출하거나 사용 가능한 플러그인의 이름을 표시합니다.
pluginload 플러그인을 로드합니다.
pluginunload 플러그인을 로드 해제합니다.
print 표현식 값을 인쇄하거나 프로시저를 실행하고, 그 프로시저의 리턴 코드를 인쇄합니다.
proc 프로세스에 대한 정보를 표시합니다.
prompt dbx 명령 프롬프트를 변경합니다.
quit dbx 디버그 프로그램을 정지합니다.
registers 모든 범용 레지스터, 시스템 제어 레지스터, 부동소수점 레지스터, 현재 명령어 레지스터의 값을 표시합니다.
rerun 이전 인수로 응용프로그램을 실행하기 시작합니다.
resource pthread가 소유하거나 대기하는 자원에 대한 정보를 표시합니다.
return 지정된 프로시저로 복귀할 때까지 응용프로그램 실행을 계속합니다.
rwlock Rwlocks에 대한 정보를 표시합니다.
run 응용프로그램 실행을 시작합니다.
screen dbx 명령과의 상호작용을 위해 Xwindow를 엽니다.
set dbx 디버그 프로그램 변수 값을 정의합니다.
sh 명령을 실행할 쉘로 전달합니다.
skip 현재의 정지 지점에서 응용프로그램 실행을 계속합니다.
source 파일로부터 dbx 부속 명령을 읽어들입니다.
status 사용 중인 trace와 stop 부속 명령을 표시합니다.
step 하나의 소스 행을 실행합니다.
stepi 하나의 기계 명령어를 실행합니다.
stophwp 하드웨어 경계점 정지를 설정합니다.
stop 응용프로그램 실행을 정지합니다.
stopi 지정된 위치에 정지를 설정합니다.
thread 스레드를 표시하고 제어합니다.
trace 추적 정보를 인쇄합니다.
tracehwp 하드웨어 경계점 추적을 설정합니다.
tracei 추적을 실행합니다.
unalias 별명을 제거합니다.
unset 변수를 삭제합니다.
up 스택 위로 현재 기능을 이동합니다.
use 소스 파일을 찾을 때 디렉토리 리스트를 찾도록 설정합니다.
whatis 응용프로그램 구성요소 선언을 표시합니다.
where 사용 중인 프로시저와 함수 리스트를 표시합니다.
whereis 이름이 지정된 ID와 일치하는 모든 기호에 대한 전체 조건을 표시합니다.
which 주어진 ID에 대한 전체 조건을 표시합니다.

/ 부속 명령

/ [ RegularExpression [ / ] ]

/ 부속 명령은 현재 소스 파일에서 앞쪽으로 RegularExpression 매개변수에서 지정한 패턴을 검색합니다. 인수 없이 / 부속 명령을 입력하면 dbx는 이전 정규식을 파일의 앞쪽으로 검색합니다. 검색은 파일의 끝을 만나면 다시 처음부터 검색하기 시작합니다.

예제
  1. 현재 소스 파일에서 12라는 숫자에 대해 앞쪽으로 검색하려면 다음을 입력하십시오.
    / 12
  2. 이전 검색을 반복하려면, 다음을 입력하십시오.
    /

? (search) 부속 명령 및 regcmp 서브루틴을 참조하십시오.

? 부속 명령

? [ RegularExpression [ ? ] ]

? 부속 명령은 RegularExpression 매개변수에서 지정한 패턴에 대해 현재 소스 파일의 역방향으로 검색합니다. 인수 없이 ? 부속 명령을 입력하면 dbx 명령은 이전 정규식을 뒷쪽(역방향)으로 검색합니다. 검색은 파일의 끝을 만나면 다시 처음부터 검색하기 시작합니다.

예제
  1. 현재 소스 파일에서 문자 z에 대해 뒤쪽으로 검색하려면, 다음을 입력하십시오.
    ?z
  2. 이전 검색을 반복하려면, 다음을 입력하십시오.
    ?

/(search) 부속 명령 및 regcmp 서브루틴을 참조하십시오.

alias 부속 명령

alias [ Name [ [ (Arglist) ] String | Subcommand ] ]

alias 부속 명령은 dbx 부속 명령에 대한 별명을 작성합니다. Name 매개변수는 작성되고 있는 별명입니다. String 매개변수는 일련의 dbx 부속 명령으로서 이 부속 명령을 실행한 다음 Name으로 참조할 수 있습니다. 매개변수 없이 alias 부속 명령을 사용하면 현재의 모든 별명이 표시됩니다.

예제
  1. rerunrr을 대체하려면 다음을 입력하십시오.
    alias rr rerun
  2. printandstep을 명령행에 입력할 때마다 두 개의 부속 명령 print nstep을 실행하려면 다음을 입력하십시오.
    alias printandstep "print n; step"
  3. alias 부속 명령을 제한된 매크로 기능으로 사용할 수도 있습니다. 예를 들면 다음과 같습니다.
    (dbx) alias px(n) "set $hexints; print n; unset $hexints"
    (dbx) alias a(x,y) "print symname[x]->symvalue._n_n.name.Id[y]"
    (dbx) px(126)
    0x7e

    이 예제에서 별명 px는 디버깅 환경에 영구적으로 영향을 미치지 않고 16진수로 값을 인쇄합니다.

assign 부속 명령

assign 변수=표현식

assign 부속 명령은 Expression 매개변수가 지정한 값을 Variable 매개변수가 지정한 변수에 지정합니다.

예제
  1. 5 값을 x 변수에 지정하려면 다음을 입력하십시오.
    assign x = 5
  2. 변수 y를 변수 x에 지정하려면 다음을 입력하십시오.
    assign x =  y
  3. 문자 값 'z'를 변수 z에 지정하려면 다음을 입력하십시오.
    assign  z  =  'z'
  4. 부울식 값 false를 논리적 형식 변수 B에 지정하려면 다음을 입력하십시오.
    assign  B  =  false
  5. "Hello World" 문자열을 문자 포인터에 지정하려면 다음을 입력하십시오. Y, enter:
    assign  Y  =  "Hello  World"
  6. 유형 검사 기능을 사용하지 않으려면, 다음과 같이 입력하여 dbx 디버그 프로그램 변수 $unsafeassign을 설정하십시오.
    set $unsafeassign

Displaying and Modifying Variables를 참조하십시오.

attribute 부속 명령

attribute [ AttributeNumber ... ]

Attribute 부속 명령은 사용자 스레드, mutex 또는 AttributeNumber 매개변수에 의해 정의된 조건 속성 오브젝트에 대한 정보를 표시합니다. 매개변수를 지정하지 않으면, 모든 속성 오브젝트가 나열됩니다.

나열된 각 속성 오브젝트에 다음과 같은 정보가 표시됩니다.

attr $aAttributeNumber 형식으로 속성 오브젝트의 기호 이름을 나타냅니다.
obj_addr 속성 오브젝트의 주소를 나타냅니다.
type 속성 오브젝트의 유형을 나타냅니다. 각각 thr, mutex 또는 사용자 스레드용 cond, mutexes 및 조건 변수 등이 될 수 있습니다.
state 속성 오브젝트 상태를 나타냅니다. validinval이 될 수 있습니다.
stack 스레드 속성 오브젝트의 스택 크기 속성을 나타냅니다.
scope 스레드 속성 오브젝트의 유효범위 속성을 나타냅니다. 이것은 스레드의 경합 유효범위를 결정하고, 자원을 서로 차지하려는 스레드 세트를 지정합니다. 시스템이나 프로세스 경합 유효범위에 대한 값은 syspro가 될 수 있습니다.
prio 스레드 속성 오브젝트의 우선순위 속성을 나타냅니다.
sched 스레드 속성 오브젝트의 스케줄 방식의 속성을 나타냅니다. 이 속성은 스케줄 방식을 제어하는데, fifo, rr (라운드 로빈) 또는 other가 될 수 있습니다.
p-shar mutex나 condition 속성 오브젝트의 프로세스 공유 속성을 나타냅니다. mutex나 condition은 다른 프로세스에 속하는 스레드가 여기에 액세스할 수 있으면, 프로세스를 공유합니다. 값은 yesno가 될 수 있습니다.
protocol mutex의 프로토콜 속성을 나타냅니다. 이 속성에서는 스레드 우선순위에서 mutex를 보류하는 효과를 결정합니다. 값은 no_prio, prio 또는 protect가 될 수 있습니다.
clock 조건 속성 오브젝트의 시계 속성을 표시합니다. 이 속성은 스레드가 시간종료에 지정된 대로 조건 변수에 대해 대기할 때 사용해야 하는 시계를 판별합니다. 값은 realtime 또는 monotonic이 될 수 있습니다.

주:
  1. dbx 디버그 프로그램의 print 부속 명령은 기호로 된 속성 이름을 인식하며, 해당 오브젝트의 상태를 표시하는 데 사용할 수 있습니다.
  2. 사용 가능한 속성은 POSIX 옵션 구현에 따라 달라집니다.
예제
  1. 모든 속성에 관한 정보를 나열하려면, 다음을 입력하십시오.
    attribute

    출력은 다음과 유사합니다.

    attr   obj_addr   type  state  stack   scope    prio 
    sched p-shar
    $a1   0x200035c8  mutex valid                                  no 
    $a2   0x20003628  cond  valid                                  no
    $a3   0x200037c8  thr   valid  57344    sys      126 other
    $a4   0x200050f8  thr   valid  57344    pro      126 other
      
  2. 속성 1과 3에 관한 정보를 나열하려면 다음을 입력하십시오.
    attribute 1 3
     

    출력은 다음과 유사합니다.

    attr   obj_addr   type  state  stack   scope    prio 
    sched p-shar
    $a1   0x200035c8  mutex valid                                  no 
    $a3   0x200037c8  thr   valid  57344    sys      126 other
      

dbx 명령의 condition 부속 명령, mutex 부속 명령, print 부속 명령 및 thread 부속 명령을 참조하십시오.

AIX 5L 버전 5.3 일반 프로그래밍 개념: 프로그램 작성 및 디버그Creating Threads, Mutexes 사용Using Condition Variables를 참조하십시오.

call 부속 명령

call Procedure ( [ 매개변수] )

call 부속 명령은 Procedure 매개변수에 지정된 프로시저를 실행합니다. 리턴 코드는 인쇄되지 않습니다. 매개변수를 지정하면 매개변수는 실행 중인 프로시저로 전달됩니다.

예제

dbx를 실행하는 중에 명령을 호출하려면 다음을 입력하십시오.

(dbx) call printf("hello")
hello

printf가 성공적으로 리턴합니다.

case 부속 명령

case [ default | mixed | lower | upper ]

case 부속 명령은 dbx 디버그 프로그램이 기호를 해석하는 방법을 변경합니다. 기호의 디폴트 처리 방법은 현재 언어에 따라 다릅니다. 현재 언어가 C, C++이거나 정의되지 않았으면, 기호는 대문자로 변환되지 않습니다. 현재 언어가 FORTRAN 또는 Pascal이면, 기호는 소문자로 변환됩니다. 기호가 현재 언어와 일치하지 않는 방법으로 해석되어야 하는 경우, 이 부속 명령을 사용하십시오.

매개변수 없이 case 부속 명령을 입력하면 현재 문자 모드가 표시됩니다.

플래그

default 현재 언어로 바뀝니다.
mixed 실제 나타나는 대로 기호를 해석합니다.
lower 기호를 소문자로 해석합니다.
upper 기호를 대문자로 해석합니다.

예제
  1. 현재 문자 모드를 표시하려면 다음을 입력하십시오.
    case
  2. 실제로 나타나는 대로 기호를 해석하도록 dbx를 지시하려면 다음을 입력하십시오.
    case mixed
  3. 기호를 대문자로 해석하도록 dbx를 지시하려면 다음을 입력하십시오.
    case upper

변수를 소문자와 대문자로 변환을 참조하십시오.

catch 부속 명령

catch [ SignalNumber | SignalName ]

catch 부속 명령은 신호가 응용프로그램으로 전송되기 전에 지정된 신호 트랩을 시작합니다. 이 부속 명령은 디버그되고 있는 응용프로그램이 인터럽트와 같은 신호를 처리할 때 유용합니다. 트랩될 신호는 각각 SignalNumber 또는 SignalName 매개변수를 사용하여 번호 또는 이름으로 지정할 수 있습니다. 신호 이름은 대소문자를 구별하지 않으며 SIG 접두어는 선택적입니다. SignalNumber 또는 SignalName 매개변수를 지정하지 않으면 기본적으로 SIGHUP, SIGCLD, SIGALARMSIGKILL 신호를 제외한 모든 신호가 트랩됩니다. 아무 인수도 지정하지 않으면, 찾으려고 하는 현재 신호 리스트가 표시됩니다.

예제
  1. dbx에서 트랩할 현재 신호 리스트를 표시하려면 다음을 입력하십시오.
    catch
  2. 신호 SIGALARM을 트랩하려면 다음을 입력하십시오.
    catch SIGALARM

ignore 부속 명령과 Handling Signals를 참조하십시오.

clear 부속 명령

clear SourceLine

clear 부속 명령은 주어진 소스 행에서 모든 정지(stop)를 제거합니다. SourceLine 매개변수는 두 가지 형식으로 지정될 수 있습니다.

  • 정수로 지정
  • :(콜론)과 정수 앞에 오는 파일 이름 문자열로 지정
예제

19 행에서 중단점 설정을 제거하려면 다음을 입력하십시오.

clear 19

cleari 부속 명령 및 delete 부속 명령. AIX 5L 버전 5.3 일반 프로그래밍 개념: 프로그램 작성 및 디버그에서의 Setting and Deleting Breakpoints를 참조하십시오.

cleari 부속 명령

cleariAddress

cleari 부속 명령은 Address 매개변수에서 지정한 주소의 모든 중단점을 지웁니다.

예제
  1. 주소 0x100001b4에서 중단점 설정을 제거하려면 다음을 입력하십시오.
    cleari 0x100001b4
  2. main() 프로시저 주소에서 중단점 설정을 제거하려면 다음을 입력하십시오.
    cleari &main

clear 부속 명령, delete 부속 명령, AIX 5L 버전 5.3 일반 프로그래밍 개념: 프로그램 작성 및 디버그에서의 Setting and Deleting Breakpoints를 참조하십시오.

condition 부속 명령

condition [ wait | nowait | ConditionNumber ... ]

condition 부속 명령은 하나 이상의 조건 변수에 대한 정보를 표시합니다. 하나 이상의 ConditionNumber 매개변수가 주어지면, condition 부속 명령은 지정된 조건 변수에 대한 정보를 표시합니다. 플래그나 매개변수를 지정하지 않으면, condition 부속 명령은 모든 조건 변수를 나열합니다.

각 조건에 대해 나열되는 정보는 다음과 같습니다.

cv $cConditionNumber 형식으로 조건 변수의 기호 이름을 나타냅니다.
obj_addr 조건 변수의 메모리 주소를 나타냅니다.
clock 조건 변수의 시계 속성을 표시합니다.
num_wait 조건 변수에서 대기 중인 스레드의 갯수를 나타냅니다.
waiters 조건 변수에서 대기 중인 사용자 스레드를 나열합니다.

주: dbx 디버그 프로그램의 print 부속 명령은 기호로 된 조건 변수 이름을 인식하며, 해당 오브젝트의 상태를 표시하는 데 사용될 수 있습니다.
플래그

wait 대기 중인 스레드가 있는 조건 변수를 표시합니다.
nowait 대기 중인 스레드가 없는 조건 변수를 표시합니다.

예제
  1. 모든 조건 변수에 관한 정보를 표시하려면 다음을 입력하십시오.
    condition
  2. 대기 중인 스레드가 있는 모든 조건 변수에 관한 정보를 표시하려면 다음을 입력하십시오.
    condition wait
  3. 조건 변수 3에 관한 정보를 표시하려면 다음을 입력하십시오.
    condition 3

    출력은 다음과 유사합니다.

    cv      obj_addr     num_wait  waiters
     $c3     0x20003290         0

attribute 부속 명령, mutex 부속 명령, print 부속 명령 및 thread 부속 명령을 참조하십시오.

또한, AIX 5L 버전 5.3 일반 프로그래밍 개념: 프로그램 작성 및 디버그Using Condition Variables를 참조하십시오.

cont 부속 명령

cont [ SignalNumber | SignalName ]

cont 부속 명령은 프로그램이 종료되거나 다른 중단점에 도달할 때까지 현재 정지점에 있는 응용프로그램을 계속해서 실행합니다. 신호를 지정하면, 프로그램은 SignalNumber 매개변수에 지정된 숫자나 SignalName 매개변수에 지정된 이름에 의해 그 신호를 받은 것으로 간주하고 실행을 계속합니다. 신호 이름은 대소문자를 구분하지 않으며 SIG 접두어는 선택적입니다. 신호가 지정되지 않으면, 프로그램은 중단되지 않았던 것처럼 실행을 계속합니다.

예제

  1. 현재 정지점에서 프로그램 실행을 계속하려면 다음을 입력하십시오.
    cont
  2. SIGQUIT 신호를 받은 것처럼 프로그램 실행을 계속하려면 다음을 입력하십시오.
    cont SIGQUIT

dbx 명령의 detach 부속 명령, dbx 명령의 goto 부속 명령, dbx 명령의 next 부속 명령, dbx 명령의 skip 부속 명령, dbx 명령의 step 부속 명령을 참조하십시오.

corefile 부속 명령

corefile 부속 명령은 실행 파일 이름, 코어 파일 형식 버전 정보, 사용 가능한 데이터를 표시하는 플래그, 고장을 야기한 신호, 코어를 덤프한 프로세스의 실행 모드를 비롯하여, 코어 파일의 헤더에 있는 정보를 표시합니다.

delete 부속 명령

delete { Number ... | all }

delete 부속 명령은 응용프로그램에 설명되어 있는 추적 및 정지를 해제합니다. 해제될 추적 및 정지는 Number 매개변수에 의해 지정될 수 있으며, 모든 추적 및 정지는 all 플래그를 사용하여 해제될 수 있습니다. dbx 프로그램별로 추적 및 정지에 연관된 숫자를 표시하려면 status 부속 명령을 사용하십시오.

플래그

all 추적과 정지를 모두 제거합니다.

예제

  1. 응용프로그램에서 모든 추적 및 정지를 해제하려면, 다음을 입력하십시오.
    delete all
  2. 이벤트 번호 4에 대한 추적 및 정지를 해제하려면, 다음을 입력하십시오.
    delete 4

clear 부속 명령, cleari 부속 명령, status 부속 명령 및 AIX 5L 버전 5.3 일반 프로그래밍 개념: 프로그램 작성 및 디버그에서의 Setting and Deleting Breakpoints를 참조하십시오.

detach 부속 명령

detach [ SignalNumber | SignalName ]

detach 부속 명령은 응용프로그램의 실행을 계속하고 디버그 프로그램을 종료합니다. 신호는 다음의 두 가지 방법 가운데 한가지로 지정될 수 있습니다.

  • SignalName 매개변수를 사용한 이름
  • SignalNumber 매개변수를 사용한 숫자

    신호 이름은 대소문자를 구분하지 않으며 SIG 접두어는 선택적입니다.

    신호를 지정하면, 프로그램은 그 신호를 받은 것으로 간주하고 실행을 계속합니다. 신호를 지정하지 않으면, 프로그램은 정지가 발생하지 않았던 것처럼 실행을 계속합니다.

예제

  1. 응용프로그램의 실행을 계속하고 dbx를 종료하려면 다음을 입력하십시오.
    detach
  2. 응용프로그램에서 SIGREQUEST 신호를 받더라도 dbx를 종료하고 응용프로그램 실행을 계속하려면 다음을 입력하십시오.
    detach SIGREQUEST

Using the dbx Debug Program을 참조하십시오.

disable 부속 명령

disable { Number ... all }

disable 부속 명령은 디버그 이벤트와 연관된 추적 및 정지를 사용 불가능하게 합니다. 사용 불가능하게 할 추적 및 정지는 Number 매개변수를 통해 지정할 수 있으며, 모든 추적 및 정지는 all 플래그를 사용하여 사용 불가능하게 할 수 있습니다. dbx 디버그 프로그램에 의해 추적 및 정지에 연관된 이벤트 숫자를 표시하려면 status 부속 명령을 사용하십시오.

플래그

all 추적과 정지를 모두 제거합니다.

예제
  1. 응용프로그램에서 모든 추적 및 정지를 사용 불가능하게 하려면 다음을 입력하십시오.
    disable all
  2. 이벤트 번호 4에 대한 추적 및 정지를 사용 불가능하게 하려면 다음을 입력하십시오.
    disable 4

자세한 정보는 enable 부속 명령, delete 부속 명령, status 부속 명령을 참조하십시오.

또한, AIX 5L 버전 5.3 일반 프로그래밍 개념: 프로그램 작성 및 디버그에서의 Setting and Deleting Breakpoints를 참조하십시오.

display memory 부속 명령

{ Address,Address/ | Address/ [ Count ] } [ Mode ] [ >File ]

display memory 부속 명령에는 명령을 초기화하는 키워드가 없으며 다음과 같은 요인으로 제어되는 메모리의 일부분을 표시합니다.

표시되는 메모리 범위는 다음 중의 하나를 지정하면 제어됩니다.

  • 두 개의 Address 매개변수

    또는

  • 시작점을 나타내는 하나의 Address 매개변수와, 그 Address로부터 표시되는 행의 갯수를 결정하는 Count.

앞에 &(앰퍼샌드)를 가진 이름으로 기호 주소를 지정하십시오. 주소는 다른 주소 및 연산자 +(더하기 부호), -(빼기 부호), *로 이루어진 표현식이 될 수 있습니다. 괄호 안에 들어 있는 표현식은 주소로 해석합니다.

  • 메모리를 표시하는 형식은 Mode 매개변수가 제어합니다. Mode 매개변수의 디폴드는 현재 모드입니다. Mode의 초기값은 X입니다.

b 8진수로 바이트를 인쇄합니다.
c 문자로 바이트를 인쇄합니다.
d 10진수로 축약형 단어를 인쇄합니다.
D 10진수로 긴 단어를 인쇄합니다.
f 단일 정밀도의 실수를 인쇄합니다.
g 이중 정밀도 실수를 인쇄합니다.
h 16진수로 바이트를 인쇄합니다.
i 기계 명령어를 인쇄합니다.
lld 8바이트의 부호가 있는 10진수를 인쇄합니다.
llu 8바이트의 부호가 없는 10진수를 인쇄합니다.
llx 8바이트의 부호가 없는 16진수를 인쇄합니다.
llo 8바이트의 부호가 없는 8진수를 인쇄합니다.
o 8진수로 축약형 단어를 인쇄합니다.
O 8진수로 긴 단어를 인쇄합니다.
q 확장된 정밀도를 가진 부동소수점 수를 인쇄합니다.
s 널(null) 바이트로 종료되는 문자열을 인쇄합니다.
x 16진수로 축약형 단어를 인쇄합니다.
X 16진수로 긴 단어를 인쇄합니다.

플래그

>File 지정된 파일로 출력을 방향 재지정합니다.

예제
  1. 주소 0x3fffe460에서 16진수 문자열에 있는 메모리 내용 중 긴 단어 하나를 표시하려면 다음을 입력하십시오.
    0x3fffe460 / X
  2. 변수 y에서 시작하는 메모리 2바이트의 내용을 문자로 나타내려면 다음을 입력하십시오.
    &y / 2c
  3. FORTRAN 문자열 a_string에서 6-8번째 요소를 표시하려면 다음을 입력하십시오.
    &a_string + 5, &a_string + 7/c

AIX 5L 버전 5.3 일반 프로그래밍 개념: 프로그램 작성 및 디버그에서의 Examining Memory Addresses를 참조하십시오.

down 부속 명령

down [ Count ]

down 부속 명령은 현재의 함수를 Count 레벨 번호 아래로 이동시킵니다. 현재 함수는 이름을 분석하는 데 사용됩니다. Count 매개변수에 대한 디폴트는 1입니다.

예제
  1. 스택을 한 레벨 아래로 이동하려면 다음을 입력하십시오.
    아래로
  2. 스택을 세 레벨 아래로 이동하려면 다음을 입력하십시오.
    down 3

up 부속 명령, where 부속 명령 및 AIX 5L 버전 5.3 일반 프로그래밍 개념: 프로그램 작성 및 디버그에서의 Displaying a Stack Trace를 참조하십시오.

dump 부속 명령

dump [ Procedure ] [ >File ]

dump 부속 명령은 지정된 프로시저 내의 모든 변수 이름과 값을 표시합니다. Procedure 매개변수는 .(마침표)이며, 모든 사용 중에 있는 변수가 표시됩니다. Procedure 매개변수를 지정하지 않으면, 현재 프로시저가 사용됩니다. >File 플래그를 사용하면 출력은 지정된 파일로 방향 재지정됩니다.

플래그

>File 지정된 파일로 출력을 방향 재지정합니다.

예제
  1. 현재 프로시저에 있는 변수 이름과 값을 표시하려면 다음을 입력하십시오.
    dump
  2. add_count 프로시저에 있는 변수 이름과 값을 표시하려면 다음을 입력하십시오.
    dump add_count
  3. 현재 프로시저에 있는 변수 이름과 값을 var.list 파일로 방향 재지정하려면 다음을 입력하십시오.
    dump > var.list

Displaying and Modifying Variables AIX 5L 버전 5.3 일반 프로그래밍 개념: 프로그램 작성 및 디버그에서를 참조하십시오.

edit 부속 명령

edit [ Procedure | File ]

edit 부속 명령은 지정된 파일에서 편집기를 실행시킵니다. 파일은 File 매개변수 또는 Procedure 매개변수를 지정하여 지정할 수 있으며, 여기서 편집기는 해당 프로시저가 포함되어 있는 파일에서 호출됩니다. 파일을 지정하지 않으면, 현재 소스 파일에서 편집기가 실행됩니다. 디폴트는 vi 편집기입니다. EDITOR 환경 변수를 원하는 편집기의 이름으로 재설정하여 디폴트를 변경할 수 있습니다.

예제
  1. 현재 소스 파일에서 편집기를 시작하려면 다음을 입력하십시오.
    edit
  2. main.c 파일에서 편집기를 시작하려면 다음을 입력하십시오.
    edit main.c
  3. do_count() 프로시저가 포함된 파일에서 편집기를 시작하려면 다음을 입력하십시오.
    edit do_count

list 부속 명령, vi 또는 vedit 명령을 참조하십시오. AIX 5L 버전 5.3 일반 프로그래밍 개념: 프로그램 작성 및 디버그에서의 Changing the Current File or ProcedureDisplaying the Current File을 참조하십시오.

enable 부속 명령

enable { Number ... all }

enable 부속 명령은 디버그 이벤트와 연관된 추적 및 정지를 사용 가능하게 합니다. 사용 가능하게 할 추적 및 정지는 Number 매개변수를 통해 지정할 수 있으며, 모든 추적 및 정지는 all 플래그를 사용하여 사용 가능하게 할 수 있습니다. dbx 디버그 프로그램에 의해 추적 및 정지에 연관된 이벤트 숫자를 표시하려면 status 부속 명령을 사용하십시오.

플래그

all 추적과 정지를 모두 제거합니다.

예제
  1. 응용프로그램에서 모든 추적 및 정지를 사용 가능하게 하려면 다음을 입력하십시오.
    enable all
  2. 이벤트 번호 4에 대한 추적 및 정지를 사용 가능하게 하려면 다음을 입력하십시오.
    enable 4

자세한 정보는 disable 부속 명령, delete 부속 명령, status 부속 명령을 참조하십시오.

또한, AIX 5L 버전 5.3 일반 프로그래밍 개념: 프로그램 작성 및 디버그에서의 Setting and Deleting Breakpoints를 참조하십시오.

fd 부속 명령

fd [ raw ] [ start [ end ] ]

fd 부속 명령은 파일 설명자 정보를 표시합니다. raw 옵션을 사용하면 출력이 원시 16진 형식으로 표시됩니다. 다른 선택적 인수에는 startend 색인이 포함됩니다. 색인을 지정하지 않으면, 사용 가능한 모든 파일 설명자에 대한 정보가 표시됩니다. 하나의 색인을 사용하면 단일 파일 설명자가 표시되고 두 개를 사용하면 포함 범위가 표시됩니다.

예제
  1. 16진으로 된 모든 파일 설명자에 대한 정보를 보려면 다음을 입력하십시오.
    fd raw
  2. 3 - 5 범위의 파일 설명자에 대한 정보를 보려면 다음을 입력하십시오.
    fd 3 5

file 부속 명령

file [ File ]

file 부속 명령은 현재 소스 파일을 File 매개변수에서 지정한 파일로 변경합니다. 그 파일에 쓰지는 않습니다. File 매개변수에 파일에 대한 전체 경로 이름을 지정할 수 있습니다. File 매개변수에 경로가 지정되어 있지 않으면, dbx 프로그램은 사용 경로를 검색하여 파일을 찾으려고 합니다. File 매개변수를 지정하지 않으면, file 부속 명령은 현재 소스 파일의 이름을 표시합니다. 경로를 알 수 있는 경우, file 부속 명령은 파일의 전체 또는 상대 경로도 표시합니다.

예제
  1. 현재 소스 파일을 main.c 파일로 변경하려면 다음을 입력하십시오.
    file main.c
  2. 현재 소스 파일 이름을 표시하려면, 다음을 입력하십시오.
    file

func 부속 명령을 참조하십시오. AIX 5L 버전 5.3 일반 프로그래밍 개념: 프로그램 작성 및 디버그에서의 Changing the Current File or ProcedureDisplaying the Current File을 참조하십시오.

func 부속 명령

func [ Procedure ]

func 부속 명령은 현재 함수를 Procedure 매개변수에서 지정한 프로시저나 함수로 변경합니다. Procedure 매개변수를 지정하지 않으면, 디폴트 현재 함수가 표시됩니다. 현재 기능을 내재적으로 변경하면 현재 소스 파일은 새로운 함수가 포함된 파일로 변경됩니다. 이름 해석에 사용된 현재 유효범위도 변경됩니다.

예제
  1. 현재 함수를 do_count 프로시저로 변경하려면 다음을 입력하십시오.
    func do_count
  2. 현재 함수 이름을 표시하려면, 다음을 입력하십시오.
    func

file 부속 명령을 참조하십시오. AIX 5L 버전 5.3 일반 프로그래밍 개념: 프로그램 작성 및 디버그에서의 Changing the Current File or Procedure를 참조하십시오.

goto 부속 명령

gotoSourceLine

goto 부속 명령은 지정된 소스 행이 다음에 실행되도록 합니다. 일반적으로, 소스 행은 현재 소스 행과 동일한 함수 내에 들어 있어야 합니다. 이 제한사항을 대체하려면 set 부속 명령에 $unsafegoto 플래그를 사용하십시오.

예제

다음 행이 행 6에서 실행되도록 변경하려면 다음을 입력하십시오.

goto 6

cont 부속 명령, gotoi 부속 명령 및 set 부속 명령을 참조하십시오.

gotoi 부속 명령

gotoi Address

gotoi 부속 명령은 프로그램 계수기 주소를 Address 매개변수에서 지정한 주소로 변경합니다.

예제

주소를 0x100002b4로 변경하려면 다음을 입력하십시오.

gotoi 0x100002b4

goto 부속 명령을 참조하십시오.

handler 부속 명령

handler { atfork | cancel_cleanup [ all | pthread id ] }

handler 부속 명령은 각각 pthread_atforkpthread_cleanup_push를 사용하여 등록된 atfork 또는 취소 정리 처리기에 대한 정보를 표시합니다. atfork 옵션을 사용하면 pre, parentchild atfork 처리기로 등록된 루틴의 이름이 표시됩니다(비posix 준수 atfork 처리기의 경우 각각의 인수도 같이 표시됩니다). 특정 pthread를 지정하는 선택적 pthread id 매개변수나 모든 pthread를 지정하는 all 매개변수와 함께 cancel_cleanup 옵션을 사용하면 등록된 모든 취소 정리 처리기가 표시됩니다. 어느 매개변수도 지정하지 않으면, 현재 pthread의 취소 정리 처리기가 표시됩니다(있는 경우).

예제
  1. 등록된 모든 atfork 처리기에 대한 정보를 보려면 다음을 입력하십시오.
    handler atfork
  2. 현재 pthread에 대해 등록된 취소 정리 처리기에 대한 정보를 보려면 다음을 입력하십시오.
    handler cancel_cleanup
  3. $t2라고 하는 pthread 오브젝트에 대해 등록된 취소 정리 처리기에 대한 정보를 보려면 다음을 입력하십시오.
    handler cancel_cleanup 2

help 부속 명령

help [ Subcommand | Topic ]

help 부속 명령은 지정한 매개변수에 따라 dbx 부속 명령 또는 주제에 대한 도움말 정보를 표시합니다. help 부속 명령을 Subcommand 매개변수와 함께 입력하면 구문 명령과 지정된 부속 명령에 대한 설명이 표시됩니다. help 부속 명령을 Topic 매개변수와 함께 입력하면 지정된 주제에 대한 설명이 표시됩니다. 다음 주제가 사용 가능합니다.

startup dbx 시작 옵션을 나열합니다.
execution 프로그램 실행과 관련된 dbx 부속 명령을 나열합니다.
breakpoints 중단점 및 추적과 관련된 dbx 부속 명령을 나열합니다.
files 소스 파일에 액세스하기 위한 dbx 부속 명령을 나열합니다.
data 프로그램 변수와 데이터에 액세스하기 위한 dbx 부속 명령을 나열합니다.
machine 기계 레벨 디버깅을 위한 dbx 부속 명령에 대한 설명을 나열합니다.
environment dbx 구성설정 및 환경을 설정하기 위한 dbx 부속 명령을 나열합니다.
threads 스레드 관련 오브젝트에 액세스하기 위한 dbx 부속 명령을 나열합니다.
expressions dbx 표현식 구문과 연산자를 설명합니다.
scope dbx가 유효범위가 다른 이름을 어떻게 결정하는지를 설명합니다.
set_variables 사용법 설명과 함께 dbx 디버그 변수를 나열합니다.
usage 간략한 설명과 함께 일반 dbx 부속 명령을 나열합니다.

예제
  1. 사용 가능한 dbx 부속 명령과 주제를 모두 나열하려면 다음을 입력하십시오.
    도움말
  2. dbx 부속 명령 리스트 설명을 표시하려면 다음을 입력하십시오.
    help list
  3. dbx 항목 set_variables의 설명을 표시하려면 다음을 입력하십시오.
    help set_variables

ignore 부속 명령

ignore [ SignalNumber | SignalName ]

ignore 부속 명령은 신호가 응용프로그램으로 전송되기 전에 지정된 신호의 트랩을 정지합니다. 이 부속 명령은 디버그되고 있는 응용프로그램이 인터럽트와 같은 신호를 처리할 때 유용합니다.

다음 사항이 트랩되는 신호를 지정합니다.

  • SignalNumber 매개변수를 사용한 숫자
  • SignalName 매개변수를 사용한 이름

신호 이름은 대소문자를 구분하지 않습니다. SIG 접두어는 생략 가능합니다.

SignalNumber 또는 SignalName 매개변수 중 아무것도 지정하지 않으면, 디폴트로 SIGHUP, SIGCLD, SIGALRMSIGKILL 신호를 제외한 모든 신호가 트랩됩니다. dbx 디버그 프로그램은 디버거 외부의 프로세스에서 생긴 SIGTRAP 신호를 무시할 수 없습니다. 아무 인수도 지정하지 않으면, 현재 무시된 신호의 리스트가 표시됩니다.

예제

dbx가 응용프로그램으로 송신된 제한시간 초과 신호를 무시하도록 하려면 다음을 입력하십시오.

ignore alrm

catch 부속 명령을 참조하십시오. AIX 5L 버전 5.3 일반 프로그래밍 개념: 프로그램 작성 및 디버그에서의 Handling Signals를 참조하십시오.

kthread 부속 명령

kthread [ raw ] [ info | ru ] [ tid ]

kthread 부속 명령은 커널 스레드에 대한 정보를 표시합니다. raw 옵션을 사용하면 사용자가 읽기 쉬운 형식으로 표시 가능한지 여부에 관계없이 모든 출력이 16진으로 표시됩니다. 인수를 사용하지 않으면 모든 커널 스레드에 대한 요약 정보가 표시됩니다. 숫자 스레드 ID를 제공하면 dbx는 단일 스레드에 대한 정보를 표시합니다. info 옵션은 사용자 스레드 구조를 통해 스레드에 대한 자세한 출력을 생성합니다. ru 옵션을 사용하면 ti_ru 데이터 멤버를 표시합니다. 여기에는 사용 정보가 포함됩니다.

사용자 스레드에 대한 자세한 정보는 thread 부속 명령을 참조하십시오.

예제
  1. 현재 실행 중인 스레드에 대한 정보를 찾으려면, 먼저 명령행에 다음과 같이 입력하여 모든 스레드에 대한 정보를 확보해야 합니다.
    kthread
    dbx가 프로세스를 정지하기 바로 전에 실행 중이었던(또는 실행 가능했던) 스레드에 별표가 표시됩니다. 출력을 기초로 올바른 스레드 ID를 선택하고 다음을 입력하십시오.
    kthread info tid
  2. 모든 스레드에 대한 자원 정보를 16진으로 보려면 다음을 입력하십시오.
    kthread raw ru

list 부속 명령

list [ Procedure | SourceLine-Expression [ ,SourceLine-Expression ] ]

list 부속 명령은 소스 파일 중 지정된 행을 표시합니다. 표시된 행 수는 두 가지 중 한 가지 방식으로 지정됩니다.

  • Procedure 매개변수를 사용하여 프로시저를 지정.

이 경우, list 부속 명령은 지정된 프로시저가 시작되기 전에 창의 크기만큼 여러 행을 보여줍니다.

  • SourceLine-Expression 매개변수를 사용하여 시작 및 종료 소스 행 번호를 지정.

SourceLine-Expression 매개변수는 +(더하기 부호)나 -(빼기 부호), 그리고 정수로 되어 있는 유효 행 번호로 구성되어야 합니다. 또한, $(달러 기호)인 SourceLine을 사용하여 현재 행 번호를 표시하고, @인 SourceLine을 사용하여 나열되는 다음 행 번호를 표시할 수도 있습니다.

그러면 지정된 첫 번째 행 번호에서부터 지정된 두 번째 행 번호에 이르기까지 모든 행이 표시됩니다.

두 번째 소스 행이 생략된 경우, 첫 번째 행만 출력됩니다.

list 부속 명령이 매개변수 없이 사용되면, 현재 소스 행에서부터 $listwindow에 지정된 행 만큼이 인쇄됩니다.

디폴트로 나열되는 행 번호를 변경하려면 특별한 디버그 프로그램 변수인 $listwindow를 사용자가 원하는 행 번호로 설정하십시오. 처음에는 $listwindow는 10으로 설정됩니다.

예제
  1. 현재 파일에서 행 1에서 10까지 나열하려면 다음을 입력하십시오.
    list 1,10
  2. main 프로시저 주위의 10 행이나 $listwindow 행을 나열하려면 다음을 입력하십시오.
    list main
  3. 현재 행 주위의 11행을 나열하려면, 다음을 입력하십시오.
    list $-5,$+5
  4. SourceLineExpression 표현식에 더하기와 빼기가 포함된 간단한 정수식을 사용할 수 있습니다. 예를 들면 다음과 같습니다.
    (dbx) list $
    4 {
    
    (dbx) list 5
    5 char i = '4';
    
    (dbx) list sub
    23 char *sub(s,a,k)
    24 int a;
    25 enum status k;  .  .  .  
    
    (dbx) move 
    25
    (dbx) list @ -2
    23 char *sub(s,a,k)

edit 부속 명령, listi 부속 명령 및 move 부속 명령을 참조하십시오. AIX 5L 버전 5.3 일반 프로그래밍 개념: 프로그램 작성 및 디버그에서의 Displaying the Current File을 참조하십시오.

listi 부속 명령

listi [ Procedure | at SourceLine | Address [ , Address ] ]

listi 부속 명령은 소스 파일에 있는 명령어 세트를 표시합니다. 표시된 명령은 다음과 같이 지정됩니다.

  • Procedure 매개변수를 제공하면 listi 부속 명령은 리스트 창이 채워질 때까지 지정한 프로시저의 시작으로부터 명령을 나열합니다.
  • at SourceLine 플래그를 사용하면 listi 부속 명령은 지정한 소스 행에서 시작하는 명령을 표시하고 리스트 창이 채워질 때까지 계속합니다. SourceLine 변수는 정수 또는 뒤에 콜론(:)과 정수가 붙는 파일 이름 문자열로 지정할 수 있습니다.
  • Address 매개변수를 사용하여 시작 및 종료 주소를 지정하면 두 주소를 포함하여 그 사이의 모든 명령이 표시됩니다.

listi 부속 명령을 플래그나 매개변수 없이 사용하면, 다음 $listwindow 명령이 표시됩니다. 현재 리스트 창의 크기를 변경하려면, set $listwindow=Value 부속 명령을 사용하십시오.

디어셈블리 모드

dbx 프로그램은 POWER 제품군 또는 POWER PC 구조의 명령을 디어셈블할 수 있습니다. 디폴트 모드에서는 dbx 프로그램이 실행 중인 구조에 대한 명령을 표시합니다.

dbx 명령에 대한 set 부속 명령의 $instructionset 변수와 $mnemonics 변수를 사용하면 기본 디어셈블리 모드를 겹쳐쓸 수 있습니다. 자세한 정보는 dbx 명령의 set 부속 명령을 참조하십시오.

플래그

at SourceLine 나열하기 위해 시작 소스 행을 지정합니다.

예제
  1. 다음 10이나, $listwindow, 명령을 나열하려면 다음을 입력하십시오.
    listi
  2. 소스 행 10에 있는 기계 명령어를 나열하려면 다음을 입력하십시오.
    listi at 10
  3. 파일 sample.c에 있는 소스 행 5에서 시작하는 기계 명령어를 나열하려면 다음을 입력하십시오.
    listi at "sample.c":5
  4. 주소 0x100004000x10000420 사이에 있는 명령을 나열하려면 다음을 입력하십시오.
    listi 0x10000400, 0x10000420

list 부속 명령과 set 부속 명령을 참조하십시오. 또한, AIX 5L 버전 5.3 일반 프로그래밍 개념: 프로그램 작성 및 디버그에서의 Debugging at the Machine Level with dbx를 참조하십시오.

malloc 부속 명령

malloc [ > File ]

옵션이 없는 malloc 부속 명령은 프로세스가 시작한 이후의 malloc 사용 통계 요약과 사용 가능하게 된 옵션 및 할당 정책 리스트를 인쇄합니다.

malloc [ allocation [ { address | size | heap | pid | tid | time } { "<" | "==" | ">" "!=" ] } Value ] ] [ > File ]

malloc 부속 명령에 대한 allocation 옵션은 프로세스가 현재 보유하는 모든 할당을 분류된 리스트로 표시합니다. 선택적 attribute RELOP value 인수를 사용하면 활성 할당 선택 범위가 좁혀집니다.

malloc [ freespace [ { address | size | heap } { "<" | "==" | ">" | "!=" ] } Value ] ] [ > File ]

malloc 부속 명령에 대한 freespace 옵션은 프로세스 힙에서 사용 가능한 모든 여유 공간을 분류된 리스트로 표시합니다. 선택적 attribute RELOP value 인수를 사용하면 여유 공간 노드 선택 범위가 좁혀집니다.

플래그

> File 지정된 파일로 출력을 방향 재지정합니다.

자세한 정보는 AIX 5L 버전 5.3 일반 프로그래밍 개념: 프로그램 작성 및 디버그에서 malloc 서브시스템을 사용한 시스템 메모리 할당을 참조하십시오.

map 부속 명령

map { [Format] [ entry ModuleNumber [ , ModuleNumber ] | Address | SymbolName ] [ > File ] }

map 부속 명령은 응용프로그램의 로드 부분에 대한 특징을 표시합니다. 이 정보에는 로드된 각 모듈의 모듈 이름, 멤버 이름, 텍스트 기점, 텍스트 끝, 텍스트 길이, 데이터 기점, 데이터 끝, 데이터 길이 및 파일 설명자가 포함될 수 있습니다. 표시할 항목은 다음 방식으로 지정할 수 있습니다.

  • ModuleNumber 매개변수를 사용하여 단일 항목 지정
  • 쉼표로 구분되는 두 개의 ModuleNumber 매개변수를 사용하여 항목 범위 지정
  • Address 매개변수를 사용하여 로드된 모듈로 해석될 주소 지정
  • SymbolName 매개변수를 사용하여 로드된 모듈로 해석될 기호 이름 지정

위의 스펙을 전혀 사용하지 않고 호출한 경우, map 부속 명령은 응용프로그램의 모든 로드 부분에 대한 정보를 표시합니다.

Format 인수는 로드된 모듈 설명에 대한 출력 모드를 지정합니다. 다음 리스트에 가능한 Format 인수 값이 있습니다.

abbr 축약된 출력 모드를 지정합니다. 이 출력은 로드된 모듈마다 해당 모듈의 항목 번호, 모듈 이름 및 선택적 멤버 이름을 포함하는 단일 행으로 구성됩니다.
normal 정상적인 출력 모드를 지정합니다. 이 출력은 로드된 각 모듈의 이름, 항목 번호, 모듈 이름, 멤버 이름, 텍스트 기점, 텍스트 길이, 데이터 기점, 데이터 길이 및 파일 설명자로 구성됩니다.
raw 원시 출력 모드를 지정합니다. 이 출력은 모듈마다 항목 번호, 선택적 멤버 이름이 같이 있는 모듈 이름, 텍스트 기점, 텍스트 끝, 텍스트 길이, 데이터 기점, 데이터 끝, 데이터 길이 및 파일 설명자 필드들을 공백으로 구분하여 포함하는 형식화되지 단일 행으로 구성됩니다.
verbose 상세 출력 모드를 지정합니다. 이 출력은 로드된 각 모듈의 이름, 항목 번호, 모듈 이름, 멤버 이름, 텍스트 기점, 텍스트 끝, 텍스트 길이, 데이터 기점, 데이터 끝, 데이터 길이 및 파일 설명자로 구성됩니다.

Format 매개변수를 지정하지 않으면, DBX는 $mapformat 내부 변수 값을 사용합니다. Format 매개변수를 지정하지 않고 $mapformat을 설정하지 않은 경우, DBX는 정규 모드로 로드된 모듈 정보를 표시합니다.

플래그

> File 지정된 파일로 출력을 방향 재지정합니다.
entry ModuleNumber [ , ModuleNumber ] 표시할 모듈 또는 모듈 범위를 지정합니다.

예제
  1. 로드된 모든 모듈을 축약 모드로 나열하려면 다음을 입력하십시오.
    map abbr
  2. 로드된 모듈 3 - 5를 상세 모드로 나열하려면 다음을 입력하십시오.
    map verbose entry 3,5
  3. 주소 0x20001000을 포함하는 로드된 모듈을 나열하려면 다음을 입력하십시오.
    map 0x20001000
  4. foo 변수를 포함하는 로드된 모듈을 나열하려면 다음을 입력하십시오.
    map foo

자세한 정보는 $mapformat 내부 변수를 참조하십시오. AIX 5L 버전 5.3 일반 프로그래밍 개념: 프로그램 작성 및 디버그에서에서 dbx로 시스템 레벨에서 디버깅도 참조하십시오.

move 부속 명령

moveSourceLine

move 부속 명령은 표시할 다음 행을 SourceLine 매개변수에서 지정한 행으로 변경합니다. 이 부속 명령은 @(at 기호) 변수의 값을 변경합니다.

SourceLine 변수는 :(콜론)과 정수가 뒤에 붙는 파일 이름 문자열로 또는 정수로 지정할 수 있습니다.

예제
  1. 나열할 다음 행을 12 행으로 변경하려면 다음을 입력하십시오.
    move 12
  2. 나열할 다음 행을 sample.c 파일에 있는 5 행으로 변경하려면 다음을 입력하십시오.
    move "sample.c":5

list 부속 명령을 참조하십시오. AIX 5L 버전 5.3 일반 프로그래밍 개념: 프로그램 작성 및 디버그에서의 Displaying the Current File을 참조하십시오.

multproc 부속 명령

multproc [ on |parent|child| off ]

multproc 부속 명령은 분기 실행되고 초과 프로세스가 작성되었을 때 dbx 디버그 프로그램의 작동을 지정합니다. on 플래그는 분기의 하위 경로를 디버그하기 위해 새로운 dbx 세션을 작성하도록 지정하는 데 사용됩니다. 원래 dbx는 상위 경로의 디버그를 계속합니다. parent 플래그와 child 플래그를 사용하여 수행해야할 분기의 단일 경로를 지정합니다. off 플래그를 제외한 모든 플래그를 사용하면 dbx는 초과 프로세스를 수행합니다. off 플래그는 멀티프로세스 디버깅을 사용 불가능하게 합니다. 플래그를 지정하지 않으면, multproc 부속 명령은 멀티프로세스 디버깅의 현재 상태를 리턴합니다.

dbx 프로그램은 멀티프로세스 디버깅을 위해 Xwindows를 사용합니다. dbx 프로그램은 다중 프로세스에 필요한 만큼의 창을 엽니다. 각 하위 창의 제목은 서브프로세스의 프로세스 ID(pid)입니다. 프로세스간을 전환하려면, Xwindows 처리 기법을 사용하여 dbx 세션이 표시된 창을 활성화하십시오. 시스템에서 Xwindows를 지원하지 않으면 디버거가 분기될 때 경고 메시지가 발행되고 dbx 프로그램은 상위 프로세스만 디버깅을 계속합니다. 멀티프로세스 디버깅은 다음과 같은 이유로 성공하지 못할 수도 있습니다.

  • dbx 프로그램이 Xwindows 환경에서 실행되지 않을 경우
  • Xwindows는 실행되지만 dbx 전역 변수 $xdisplay가 유효한 표시장치 이름으로 설정되지 않은 경우 $xdisplay 변수는 쉘 DISPLAY 환경 변수로 초기화됩니다. setName=Expressiondbx 부속 명령을 사용하여 표시장치 이름을 변경할 수 있습니다.
  • /tmp 디렉토리에서는 디버깅 프로그램에 대한 읽기나 쓰기 액세스를 허용하지 않습니다. dbx 프로그램은 Xwindow 환경을 제어할 때 이 디렉토리에 적은 공간을 필요로 합니다.
  • 시스템이 새로운 Xwindow를 수용할 자원을 충분히 가지고 있지 못한 경우.

$xdisplay가 원격 표시장치로 설정되면, 사용자는 새로 작성된 Xwindow를 보지 못할 수도 있습니다. $xdisplay 설정이 올바르지 못하면, Xwindows 또는 다른 시스템 자원이 장애의 원인을 알려줍니다.

dbx 프로그램은 서로 다른 장애 유형을 구별하지 못하지만, 부속 명령이 실패했을 때 다음과 같은 메시지를 수신합니다.

경고: dbx 부속 명령 다중 프로세스가 실패했습니다. 
dbx에서 사용 불가능한 다중 프로세스를 계속하려고 했습니다.

새로 작성되는 창을 사용자 정의로 구성하려면 .Xdefaults 파일에 있는 dbx_term 응용프로그램 이름으로 정의할 수 있습니다.

플래그

on 멀티프로세스 디버깅이 가능합니다.
off 멀티프로세스 디버깅이 불가능합니다.

예제
  1. 멀티프로세스 디버깅의 현재 상태를 검사하려면, 다음을 입력하십시오.
    multproc
  2. 멀티프로세스 디버깅을 사용하려면, 다음을 입력하십시오.
    multproc on
  3. 멀티프로세스 디버깅을 사용 불가능하게 하려면, 다음을 입력하십시오.
    multproc off 

screen 부속 명령과 fork 서브루틴을 참조하십시오. AIX 5L 버전 5.3 일반 프로그래밍 개념: 프로그램 작성 및 디버그에서의 Debugging Programs Involving Multiple Processes를 참조하십시오.

mutex 부속 명령

mutex [ lock | unlock | thnum | utid | MutexNumber ... ]

mutex 부속 명령은 mutex에 대한 정보를 표시합니다. MutexNumber 매개변수가 제공되면, mutex 부속 명령은 지정된 mutex에 대한 정보를 표시합니다. 플래그나 매개변수를 지정하지 않으면, mutex 부속 명령은 모든 mutex에 대한 정보를 표시합니다.

각 mutex에 나열되는 정보는 다음과 같습니다.

mutex $mMutexNumber 형식으로 mutex의 기호 이름을 나타냅니다.
type mutex의 유형, 즉 non-rec(비재귀), recursi(재귀) 또는 fast를 나타냅니다.
obj_addr mutex의 메모리 주소를 나타냅니다.
lock mutex의 잠금 상태, 즉 mutex가 잠겼으면 , 잠기지 않았으면 아니오를 나타냅니다.
owner mutex가 잠금 상태인 경우에 mutex를 갖는 사용자 스레드의 기호 이름을 나타냅니다.
blockers 이 mutex 변수에 블록화되어 있는 사용자 스레드를 나열합니다.

주: dbx 디버그 프로그램의 print 부속 명령은 기호로 된 mutex 이름을 인식하며, 해당 오브젝트의 상태를 표시하는 데 사용될 수 있습니다.
플래그

lock 잠금 상태인 mutex에 관한 정보를 표시합니다.
unlock 잠금 상태가 아닌 mutex에 관한 정보를 표시합니다.
thnum 특정 스레드가 보유하는 모든 mutex에 대한 정보를 표시합니다.
utid 사용자 스레드 id가 주어진 사용자 스레드 id와 일치하는 사용자 스레드가 보유하는 모든 mutex에 대한 정보를 표시합니다.

예제
  1. 모든 mutex에 관한 정보를 표시하려면 다음을 입력하십시오.
    mutex
  2. 잠금 상태인 모든 mutex에 관한 정보를 표시하려면 다음을 입력하십시오.
    mutex lock
  3. mutex 번호 4, 5, 6에 관한 정보를 표시하려면 다음을 입력하십시오.
    mutex 4 5 6

    출력은 다음과 유사합니다.

    mutex   obj_addr         type     lock owner  blockers
    $m4    0x20003274        non-rec   no
    $m5    0x20003280        recursi   no
    $m6    0x2000328a        fast      no
  4. thread 1이 보유하는 모든 mutex에 대한 정보를 표시하려면 다음을 입력하십시오.
    mutex thnum 1
  5. 사용자 스레드 id가 0x0001인 스레드가 보유하는 모든 mutex에 대한 정보를 표시하려면 다음을 입력하십시오.
    mutex utid 0x0001

attribute 부속 명령, condition 부속 명령, print 부속 명령, thread 부속 명령을 참조하십시오.

또한, AIX 5L 버전 5.3 일반 프로그래밍 개념: 프로그램 작성 및 디버그Using Mutexes를 참조하십시오.

next 부속 명령

next [ Number ]

next 부속 명령은 소스의 다음 행까지 응용프로그램을 실행합니다. Number 매개변수는 next 부속 명령이 실행될 횟수를 지정합니다. Number 매개변수를 지정하지 않으면, next는 한 번만 실행됩니다.

복수의 스레드 응용프로그램에서 next 부속 명령을 실행하면, 모든 사용자 스레드는 조작 중에 실행되지만 프로그램은 실행 중인 스레드가 지정된 소스 행에 도달할 때까지 계속 실행됩니다. 스레드만이 실행되도록 하려면, set 부속 명령을 사용하여 $hold_next 변수를 설정하십시오. 이 변수를 설정하면 실행 중인 스레드는 블록화된 스레드 중 하나가 보유 중인 잠금을 기다릴 수 있기 때문에 교착 상태가 발생할 수 있습니다.

예제
  1. 다음 소스 행까지 실행을 계속하려면 다음을 입력하십시오.
    next
  2. 현재 소스 행 다음의 세 번째 소스 행까지 실행을 계속하려면 다음을 입력하십시오.
    next 3

cont 부속 명령, goto 부속 명령, nexti 부속 명령, set 부속 명령 및 step 부속 명령을 참조하십시오.

nexti 부속 명령

nexti [ Number ]

nexti 부속 명령은 다음 명령까지 응용프로그램을 실행합니다. Number 매개변수는 nexti 부속 명령이 실행될 횟수를 지정합니다. Number 매개변수를 지정하지 않으면, nexti는 한 번만 실행됩니다.

복수의 스레드 응용프로그램에서 nexti 부속 명령을 실행하면, 모든 사용자 스레드는 조작 중에 실행되지만 프로그램은 실행 중인 스레드가 지정된 명령에 도달할 때까지 계속 실행됩니다. 스레드만이 실행되도록 하려면, set 부속 명령을 사용하여 $hold_next 변수를 설정하십시오. 이 변수를 설정하면 실행 중인 스레드는 블록화된 스레드 중 하나가 보유 중인 잠금을 기다릴 수 있기 때문에 교착 상태가 발생할 수 있습니다.

예제
  1. 다음 기계 명령어까지 실행을 계속하려면 다음을 입력하십시오.
    nexti
  2. 현재 기계 명령어 다음의 세 번째 기계 명령어까지 실행을 계속하려면 다음을 입력하십시오.
    nexti 3

gotoi 부속 명령, next 부속 명령, set 부속 명령 및 stepi 부속 명령을 참조하십시오. 또한, AIX 5L 버전 5.3 일반 프로그래밍 개념: 프로그램 작성 및 디버그에서의 Running a Program at the Machine Level을 참조하십시오.

onceblock 부속 명령

onceblock [ uninit | done ]

onceblock 부속 명령은 pthread_once 루틴을 사용하여 등록한 초기화 코드 블록에 대한 정보를 표시합니다. 인수가 없을 경우, 등록된 모든 1회 블록에 대한 정보가 표시됩니다. 선택적 uninitdone 플래그는 각각 실행하지 않았거나 이미 실행한 1회 블록만 표시합니다. 숫자 1회 ID를 제공하면 단일 1회 블록에 대한 정보가 표시됩니다.

주:
활성 프로세스를 디버깅하는 동안 onceblock 부속 명령이 작동되도록 하려면, 환경 변수 AIXTHREAD_ONCE_DEBUG를 ON과 동일하게 설정해야 합니다. 마찬가지로, 코어 파일을 디버깅할 경우 프로세스가 실행될 때 언급한 변수가 작동되지 않으면, onceblock 부속 명령은 어떤 정보도 확보할 수 없습니다.
예제
  1. 1회 블록이 아직 실행되지 않았는지 보려면 다음을 입력하십시오.
    onceblock uninit

플러그인 부속 명령

plugin [ Name [ Command ] ]

플러그인 부속 명령은 Command 매개변수로 지정한 명령을 Name 매개변수로 지정한 플러그인으로 전달합니다. 매개변수가 지정되지 않으면, 사용 가능한 모든 플러그인의 이름이 표시됩니다.

예제
  1. 사용 가능한 모든 플러그인을 나열하려면, 다음을 입력하십시오.
    plugin
  2. "sample"이라는 플러그인의 부속 명령 "help"를 호출하려면 다음을 입력하십시오.
    plugin sample help
  3. "xyz"라는 플러그인의 부속 명령 "interpret 0x20000688"을 호출하려면 다음을 입력하십시오.
    plugin xyz interpret 0x20000688

pluginload 부속 명령 및 pluginunload 부속 명령을 참조하십시오. AIX 5L 버전 5.3 일반 프로그래밍 개념에서 dbx 플러그인 프레임워크의 개발도 참조하십시오.

pluginload 부속 명령

pluginload File

pluginload 부속 명령은 File 매개변수로 지정된 플러그인을 로드합니다. File 매개변수는 플러그인에 대한 경로를 지정해야 합니다.

예제

"/home/user/dbx_plugins/libdbx_sample.so"에 있는 "sample"이라는 플러그인을 로드하려면 다음을 입력하십시오.

pluginload /home/user/dbx_plugins/libdbx_sample.so

plugin 부속 명령 및 pluginunload 부속 명령을 참조하십시오. AIX 5L 버전 5.3 일반 프로그래밍 개념에서 dbx 플러그인 프레임워크의 개발도 참조하십시오.

pluginunload 부속 명령

pluginunload Name

pluginunload 부속 명령은 Name 매개변수가 지정한 플러그인을 로드 해제합니다.

예제

"sample" 플러그인을 로드 해제하려면, 다음을 입력하십시오.

pluginunload sample

plugin 부속 명령 및 pluginload 부속 명령을 참조하십시오. AIX 5L 버전 5.3 일반 프로그래밍 개념에서 dbx 플러그인 프레임워크의 개발도 참조하십시오.

print 부속 명령

print Expression ...

printProcedure ( [ Parameters ] )

print 부속 명령은 다음 중의 한 가지를 수행합니다.

  • Expression 매개변수에서 지정한 표현식 리스트의 값을 인쇄합니다.
  • Procedure 매개변수에서 지정한 프로시저를 실행하고 해당 프로시저의 리턴값을 인쇄합니다. 매개변수는 프로시저로 전달됩니다.
예제
  1. 왼쪽으로 2비트 이동한 x 값과 y 값을 표시하려면 다음을 입력하십시오.
    print x, y << 2
  2. 인수 0과 함께 sbrk 루틴을 호출하여 리턴값을 표시하려면 다음을 입력하십시오.
    print sbrk(0)

assign 부속 명령, call 부속 명령 및 set 부속 명령을 참조하십시오.

proc 부속 명령

proc [ raw ] [ cred | cru | ru | sigflags | signal ]

proc 부속 명령은 프로세스에 대한 정보를 표시합니다. raw 옵션을 사용하면 사용자가 읽기 쉬운 형식의 해석 값보다는 16진으로 출력이 표시됩니다. 추가 인수 없이 proc 부속 명령을 사용하면 사용자 프로세스 데이터 구조에 저장된 대로, 프로세스에 대한 일반 정보를 출력합니다. cred 옵션은 프로세스 신임을 설명하는 pi_cred 데이터 멤버 내용을 표시합니다. cruru 옵션은 각각 자원 사용 정보를 포함하는 데이터 멤버 pi_crupi_ru를 표시합니다. sigflagssignal 옵션은 현재 신호 상태와 등록된 신호 처리기에 관련된 정보를 pi_sigflagspi_signal 데이터 멤버에 포함된 그대로 표시합니다.

예제
  1. 현재 프로세스(또는 코어 파일)에 대한 자원 사용 정보를 원시 16진으로 보려면 다음을 입력하십시오.
    proc raw ru
  2. 신호 처리기 정보를 보려면 다음을 입력하십시오.
    proc signal

prompt 부속 명령

prompt [ "String" ]

prompt 부속 명령은 dbx 명령 프롬프트를 String 매개변수가 지정한 문자열로 변경합니다.

예제

프롬프트를 dbx>로 변경하려면, 다음을 입력하십시오.

prompt "dbx>"

AIX 5L 버전 5.3 일반 프로그래밍 개념: 프로그램 작성 및 디버그에서의 Defining a New dbx Prompt를 참조하십시오.

quit 부속 명령

quit

quit 부속 명령은 dbx 디버깅 세션에서 실행 중인 모든 프로세스를 종료합니다.

detach 부속 명령을 참조하십시오.

registers 부속 명령

registers [ >File ]

registers 부속 명령은 범용 레지스터, 시스템 제어 레지스터, 부동소수점 레지스터, 현재 명령 레지스터를 표시합니다.

  • 범용 레지스터는 $rNumber 변수가 지정하는데, 여기서 Number 매개변수는 레지스터 번호를 나타냅니다.
    주: 레지스터 값을 0xdeadbeef 16진수의 값으로 설정할 수 있습니다. 0xdeadbeef 16진 값은 프로세스 초기화시 범용 레지스터에 지정된 초기 값입니다.
  • 부동소수점 레지스터는 $frNumber 변수로 표시됩니다. 디폴트로, 부동소수점 레지스터는 표시되지 않습니다. 부동소수점 레지스터를 표시하려면 unset $noflregs dbx 부속 명령을 사용합니다.
주: 현재 스레드가 커널 모드에 있는 경우에는 registers 부속 명령이 레지스터를 표시할 수 없습니다.
플래그

>File 지정된 파일로 출력을 방향 재지정합니다.

set 부속 명령과 unset 부속 명령을 참조하십시오. 또한, AIX 5L 버전 5.3 일반 프로그래밍 개념: 프로그램 작성 및 디버그에서의 Using Machine Registers를 참조하십시오.

rerun 부속 명령

rerun [ Arguments ] [ < File ] [ > File ] [ > > File ] [ 2> File ] [ 2> > File ] [ >& File ] [ > >& File ]

rerun 부속 명령은 오브젝트 파일의 실행을 시작합니다. Arguments는 명령행 인수로서 전달됩니다. Arguments 매개변수를 지정하지 않으면, 마지막 run 또는 rerun 부속 명령의 인수가 재사용됩니다.

플래그

<File File로부터 입력을 받게 입력을 방향 재지정합니다.
>File File로 출력을 방향 재지정합니다.
> >File File에 방향 재지정한 출력을 추가합니다.
2>File File로 표준 오류를 방향 재지정합니다.
2> >File File에 방향 재지정한 표준 오류를 추가합니다.
>&File File로 표준 오류 및 출력을 방향 재지정합니다.
> >&File File에 출력 및 표준 오류를 추가합니다.

run 부속 명령을 참조하십시오.

resource 부속 명령

resource { owner | waiter } [ all | pthread id ]

resource 부속 명령은 현재 보유하고 있거나 대기 중인 자원 pthread에 대한 정보를 표시합니다. 첫 번째 인수(필수)는 자원을 소유하거나 자원을 대기 중인 pthread를 보는 데 관심이 있는지 여부를 표시합니다. 두 번째 인수는 모든 pthread, 아니면 특정 pthread를 표시하기 위해 사용할 수 있습니다. 전혀 지정하지 않으면, 현재 pthread에 관련된 정보만 표시됩니다(적용 가능할 경우).

주:
resource 부속 명령은 ON으로 설정된 몇 개의 디버깅 환경 변수로 실행되는 디버깅 프로세스에 대해서만 유용합니다. 여기에는 AIXTHREAD_MUTEX_DEBUG, AIXTHREAD_COND_DEBUG, AIXTHREAD_RWLOCK_DEBUG, AIXTHREAD_READ_OWNER 및 AIXTHREAD_WAITLIST_DEBUG가 포함됩니다. 활성 프로세스를 디버깅하는 동안 이 변수들이 작동되지 않거나 디버깅되는 코어 파일이 생성될 때 이 변수들이 작동되지 않은 경우, resource 부속 명령은 정보를 덜 검색하거나 거의 검색하지 않습니다. 이 기능을 사용하면 성능이 저하될 수 있으므로 디버깅 목적으로만 활성화하도록 하십시오.
예제
  1. 현재 pthread가 자원을 보유하는지 확인하려면 다음을 입력하십시오.
    resource owner
  2. pthread가 대기 중인 자원을 보려면 다음을 입력하십시오.
    resource waiter all

return 부속 명령

return [ Procedure ]

return 부속 명령은 Procedure 매개변수에 지정된 프로시저로 리턴될 때까지 응용프로그램을 실행합니다. Procedure 매개변수를 지정하지 않으면, 현재 프로시저가 리턴할 때 실행이 중단됩니다.

예제
  1. 호출 루틴으로 실행을 계속하려면 다음을 입력하십시오.
    return
  2. main 프로시저로 계속 실행하려면 다음을 입력하십시오.
    return main 

rwlock 부속 명령

rwlock [read | write | RwlockNumber....]

rwlock 부속 명령은 rwlocks에 대한 정보를 표시합니다. RwlockNumber 매개변수를 제공하면, rwlock 부속 명령은 지정된 rwlocks에 대한 정보를 표시합니다. 플래그나 매개변수를 지정하지 않으면, rwlock 부속 명령은 모든 rwlocks에 대한 정보를 표시합니다.

rwlock에 대해 나열되는 정보는 다음과 같습니다.

rwl $rw RwlockNumber 형식으로 rwlock의 기호 이름을 나타냅니다.
flag_value 플래그 값을 표시합니다.
owner rwlock의 소유자를 나타냅니다.
status rwlock을 보류하고 있는 사용자를 나타냅니다. 값은 읽기(판독기에 의해 보류된 경우), 쓰기(작성자에 의해 보류된 경우), 사용 가능(사용 가능한 경우)입니다.
wsleep[#] 쓰기 상태에 있는 스레드입니다. #는 쓰기 상태에 있는 스레드의 총 수입니다.
rsleep[#] 읽기 상태에 있는 스레드입니다. #는 읽기 상태에 있는 스레드의 총 수입니다.

주: dbx 디버그 프로그램의 print 부속 명령은 기호로 된 rwlock 이름을 인식하며, 해당 오브젝트의 상태를 표시하는 데 사용될 수 있습니다.
플래그

read 상태가 읽기 모드에 있는 모든 rwlocks에 대한 정보를 표시합니다.
write 상태가 쓰기 모드에 있는 모든 rwlocks에 대한 정보를 표시합니다.

예제
  1. 모든 rwlocks에 대한 정보를 표시하려면 다음을 입력하십시오.
    rwlock

    출력은 다음과 유사합니다.

    rwl     flag_value    owner status
    $rwl        1         $t1    write
            rsleeps[     0]:
            wsleeps[     0]:
  2. 쓰기 모드에 있는 모든 rwlocks에 대한 정보를 표시하려면 다음을 입력하십시오.
    rwlock write

    출력은 다음과 유사합니다.

    rwl     flag_value    owner status
    $rwl        1         $t1    write
            rsleeps[     0]:
            wsleeps[     0]:

attribute 부속 명령, condition 부속 명령, mutex 부속 명령, print 부속 명령 및 thread 부속 명령을 참조하십시오.

run 부속 명령

run [ Arguments ] [ <File ] [ >File ] [ > >File ] [ 2>File ] [ 2> >File ] [ >&File ] [ > >&File ]

run 부속 명령은 오브젝트 파일을 시작합니다. Arguments는 명령행 인수로서 전달됩니다.

플래그

<File File로부터 입력을 받게 입력을 방향 재지정합니다.
>File File로 출력을 방향 재지정합니다.
2>File File로 표준 오류를 방향 재지정합니다.
> >File File에 방향 재지정한 출력을 추가합니다.
2> >File File에 방향 재지정한 표준 오류를 추가합니다.
>&File File로 표준 오류 및 출력을 방향 재지정합니다.
> >&File File에 출력 및 표준 오류를 추가합니다.

예제

blue12 인수를 사용하여 응용프로그램을 실행하려면 다음을 입력하십시오.

run blue 12

rerun 부속 명령을 참조하십시오.

screen 부속 명령

screen

screen 부속 명령은 dbx 명령 상호작용을 위한 Xwindow를 엽니다. 사용자는 프로세스가 시작된 창에서 작업을 계속합니다.

screen 부속 명령은 dbx 디버그 프로그램이 Xwindows 환경에서 실행되는 동안에 실행되어야 합니다. screen 부속 명령이 Xwindow가 아닌 환경에서 실행되면, dbx 프로그램은 경고 메시지를 표시하고 screen 부속 명령이 제공되지 않은 것처럼 디버깅을 계속합니다. screen 부속 명령은 다음과 같은 상황에서는 실행되지 않을 수 있습니다.

  • dbx 프로그램이 Xwindows 환경에서 실행되지 않을 경우
  • Xwindows는 실행되지만 dbx 전역 변수 $xdisplay가 유효한 표시장치 이름으로 설정되지 않은 경우 $xdisplay 변수는 DISPLAY 환경 변수로 초기화됩니다. dbx 부속 명령인 set Name=Expression은 표시장치 이름의 값을 변경합니다.
  • Xwindows가 실행되지만, TERM 환경 변수가 새로운 창을 호출하기 위해 설정한 명령이 유효하지 않은 경우.
  • /tmp 디렉토리에서는 프로그램에 대한 읽기나 쓰기 액세스를 허용하지 않습니다. dbx 프로그램은 screen 명령이 실행될 때 이 디렉토리에서 작은 공간을 필요로 합니다.
  • 시스템이 새로운 Xwindow를 수용할 만한 자원을 충분히 가지고 있지 못한 경우.

dbx 프로그램은 서로 다른 장애 유형을 구별하지 못하지만, 부속 명령이 실패했을 때 다음과 같은 메시지를 송신합니다.

경고: dbx 부속 명령 화면이 실패했습니다. dbx는 
계속 진행합니다.

$xdisplay가 원격 표시장치로 설정되면, 사용자는 새로 작성된 Xwindow를 보지 못할 수도 있습니다. $xdisplay 설정이 올바르지 못하면, Xwindows 또는 다른 시스템 자원이 문제점을 보고합니다.

새로 작성되는 창을 사용자 정의로 구성하려면 .Xdefaults 파일에 있는 dbx_term 응용프로그램 이름으로 정의할 수 있습니다.

예제

dbx 명령 상호작용을 위해 Xwindow를 열려면 다음을 입력하십시오.

screen

AIX 5L 버전 5.3 일반 프로그래밍 개념: 프로그램 작성 및 디버그에서의 Separating dbx Output From Program OutputAIX 5L Version 5.3 AIXwindows Programming GuideAIXwindows overview를 참조하십시오.

set 부속 명령

set [ Variable=Expression ]

set 부속 명령은 dbx 디버그 프로그램 변수의 값을 정의합니다. 값은 Expression 매개변수에 의해 지정되고 프로그램 변수는 Variable 매개변수에 의해 지정됩니다. 변수의 이름은 디버그 중인 프로그램내의 변수 이름과 충돌되어서는 안됩니다. 변수는 다른 명령 내의 해당 표현식으로 확장됩니다. set 부속 명령이 인수 없이 사용되면, 현재 설정되어 있는 변수가 표시됩니다.

set 부속 명령을 사용하면 다음과 같은 변수가 설정됩니다.

$catchbp 다음 명령이 실행되는 동안 중단점을 찾아냅니다.
$expandunions 상이한 레코드나 공용체의 각 부분에 대한 값을 표시합니다.
$frame 스택 추적 및 국지 변수 액세스를 위해 $frame 값에 의해 지정되어 있는 주소의 스택 프레임을 사용합니다.
$hexchars 16진수 값으로 문자를 출력합니다.
$hexin 16진수로 주소를 해석합니다.
$hexints 16진수 값으로 정수를 출력합니다.
$hexstrings 16진수로 문자 포인터를 인쇄합니다.
$hold_next cont, next, nextistep 부속 명령 중에 실행하는 스레드를 제외한 모든 스레드를 보류합니다. 이 변수를 설정하면 실행 중인 스레드는 블록화된 스레드 중 하나가 보유 중인 잠금을 기다릴 수 있기 때문에 교착 상태가 발생할 수 있습니다.
$ignoreifhandler 등록된 처리기가 있는 사용자 프로그램이 신호를 수신할 때는 정지하지 마십시오.
$ignoreload 프로그램에서 load , unload 또는 loadbind 서브루틴을 수행할 경우 정지하지 않습니다.
$ignorenonbptrap 사용자 프로그램에 비중단점 트랩 명령어가 있으며 등록된 SIGTRAP 처리기가 있으면 정지하지 마십시오.
$instructionset 디폴트 디어셈블리 모드를 대체합니다. 다음 리스트에는 가능한 Expression 매개변수 값이 포함되어 있습니다.
"default"
dbx 프로그램이 실행 중인 구조를 지정합니다.
"com"
POWER PC와 POWER 제품군 아키텍처의 공통 교차 모드에 대한 명령 세트를 지정합니다. dbx 프로그램의 디폴트는 POWER 기반 니모닉입니다.
"pwr"
POWER 제품군 구조에 대한 명령 세트와 니모닉을 지정합니다.
"pwrx"
AIX 5.1 이전 버전에 대하여 POWER 제품군 구조의 POWER2 구현에 대한 명령 세트와 니모닉을 지정합니다.
"601"
AIX 5.1 이전 버전에 대하여 PowerPC 601 RISC 마이크로프로세서에 대한 명령 세트와 니모닉을 지정합니다.
"603"
AIX 5.1 이전 버전에 대하여 PowerPC 603 RISC 마이크로프로세서에 대한 명령 세트와 니모닉을 지정합니다.
"604"
PowerPC 604 RISC 마이크로프로세서에 대한 명령 세트와 니모닉을 지정합니다.
"ppc"
선택사항인 명령을 제외한 POWER 기반 구조에 정의된 명령 세트와 니모닉을 지정합니다. 이 지시사항은 AIX 5.1 이전 버전에서 PowerPC 601 RISC 마이크로프로세서를 제외한 모든 POWER 기반 구현에 사용 가능합니다.
"any"
모든 유효한 POWER 기반 또는 POWER 제품군 명령을 지정합니다. 중첩되는 명령 세트의 경우, 디폴트는 POWER 기반 니모닉입니다.

Expression 매개변수에 대한 값을 설정하지 않은 경우 dbx 프로그램에서는 디폴트 어셈블리 모드를 사용합니다.

$java 설정 시, Java 응용프로그램을 디버그하기 위해 모드에 dbx를 위치시켜 다음 변수도 설정합니다. 설정 해제 시, 다음 변수도 설정 해제합니다.
$ignorenonbptrap
Java의 JIT(Java Just-In-Time) 컴파일러로 생성된 트랩 지시사항의 통지를 억제합니다.
$listwindow 함수의 주위에 있는 나열할 행 수와 list 부속 명령이 매개변수 없이 사용될 때 나열할 행 수를 지정합니다. 디폴트는 10행입니다.
$mapaddrs 주소 맵핑을 시작합니다. $mapaddrs를 설정하지 않으면 주소 맵핑이 정지됩니다.
$mapformat map 부속 명령의 디폴트 출력 모드를 지정합니다.
"abbr"
축약된 출력 모드를 지정합니다. 이 출력은 로드된 모듈마다 해당 모듈의 항목 번호, 모듈 이름 및 선택적 멤버 이름을 포함하는 단일 행으로 구성됩니다.
"normal"
정상적인 출력 모드를 지정합니다. 이 출력은 로드된 각 모듈의 이름, 항목 번호, 모듈 이름, 멤버 이름, 텍스트 기점, 텍스트 길이, 데이터 기점, 데이터 길이 및 파일 설명자로 구성됩니다.
"raw"
원시 출력 모드를 지정합니다. 이 출력은 모듈마다 항목 번호, 선택적 멤버 이름이 있는 모듈 이름, 텍스트 기점, 텍스트 끝, 텍스트 길이, 데이터 기점, 데이터 끝, 데이터 길이 및 파일 설명자 필드들을 공백으로 구분하여 포함하는 형식화되지 않은 단일 행으로 구성됩니다.
"verbose"
상세 출력 모드를 지정합니다. 이 출력은 로드된 각 모듈의 이름, 항목 번호, 모듈 이름, 멤버 이름, 텍스트 기점, 텍스트 끝, 텍스트 길이, 데이터 기점, 데이터 끝, 데이터 길이 및 파일 설명자로 구성됩니다.
Expression 매개변수에 값을 설정하지 않은 경우, dbx 프로그램은 "normal" 출력 모드를 사용합니다.
$mnemonics 디어셈블링할 경우 dbx 프로그램에서 사용할 니모닉 세트를 변경합니다.
"default"
지정된 명령 세트와 가장 근접하는 니모닉을 지정합니다.
"pwr"
POWER 제품군 구조에 대한 니모닉을 지정합니다.
"ppc"
선택사항인 명령을 제외한 POWER 기반 구조 책자에 정의된 니모닉을 지정합니다.

Expression 매개변수에 대한 값을 설정하지 않은 경우 dbx 프로그램에서는 지정한 명령 세트와 가장 가깝게 일치하는 니모닉을 사용합니다.

$noargs 부속 명령에서 where, up, down, dump와 같은 인수를 생략합니다.
$noflregs registers 부속 명령에서 부동소수점 레지스터의 표시를 생략합니다.
$octin 8진수로 주소를 해석합니다.
$octints 8진수로 정수를 인쇄합니다.
$pretty print 부속 명령과 함께 pretty printed 형식으로 복합 C 및 C++ 데이터 구조(strut, union, array)를 표시합니다.
"on"
각 행의 값과 값의 정적 유효 범위를 나타내는 들여쓰기를 사용하여 pretty printing을 지정합니다.
"verbose"
각 행의 값과 값의 정적 유효 범위를 나타내는 규정화된 이름을 사용하여 pretty printing을 지정합니다. 규정화된 이름은 값이 연관된 외부 블록을 점으로 구분한 리스트로 구성됩니다.
"off"
Pretty printing을 중단합니다. 이것은 디폴트입니다.
$repeat 입력된 명령이 없으면 이전 명령을 반복합니다.
$sigblock 사용자 프로그램으로 신호를 블록화합니다.
$stepignore 디버깅 정보를 사용할 수 없는 또다른 루틴을 호출하는 소스 행에서 step 명령이 실행될 때 dbx 명령의 작동을 제어합니다. 이 변수는 step 부속 명령이 디버깅 정보를 사용할 수 없는 대형 루틴으로 넘어갈 수 있도록 합니다. 다음 리스트에는 가능한 Expression 매개변수 값이 포함되어 있습니다.
"function"
dbx 명령에 대한 next 부속 명령의 함수를 수행합니다. 이것이 디폴트 값입니다.
"module"
함수가 디버그 정보(예:시스템 라이브러리)를 사용할 수 없는 로드 모듈에 있는 경우, next 부속 명령의 함수를 수행합니다.
"none"
백그라운드에서 소스 정보가 사용 가능한 명령에 도달할 때까지 dbx 명령에 대한 stepi 부속 명령 기능을 수행합니다. 그 시점에서 dbx는 실행이 정지되었던 위치를 표시합니다.
$thcomp $thcomp가 설정되면, th- 스레드 명령에 의해 표시되는 정보는 압축된 형태로 표시됩니다.
$unsafeassign assign 문의 양 면 사이의 엄격한 유형 검사를 중단합니다. $unsafeassign 변수가 설정되었더라도 assign문의 양 끝에는 크기가 다른 기억영역 유형이 포함되지 않을 수 있습니다.
$unsafebounds 배열의 첨자 검사를 중단합니다.
$unsafecall 서브루틴이나 함수 호출을 위한 인수에 대한 엄격한 유형 검사를 중단합니다.
$unsafegoto goto 부속 명령 대상 검사를 중단합니다.
$vardim 경계를 모르는 상태에서 배열을 인쇄하는 경우 사용할 차원 범위를 지정합니다. 디폴트 값은 10입니다.
$xdisplay multproc 부속 명령이나 screen 부속 명령과 함께 사용할 Xwindows 표시장치 이름을 지정합니다. 디폴트 값은 쉘 DISPLAY 변수의 값입니다.

$unsafe 변수는 오류 발견 시 dbx 디버그 프로그램의 사용을 제한합니다.

예제
  1. 나열될 디폴트 행 번호를 20으로 변경하려면 다음을 입력하십시오.
    set $listwindow=20
  2. assign 부속 명령에서 유형 검사를 사용하지 않으려면 다음을 입력하십시오.
    set $unsafeassign
  3. AIX 5.1 이전 버전에 대하여 PowerPC 601 RISC 마이크로프로세서에 대한 기계 명령어를 디어셈블하려면, 다음을 입력하십시오.
    set $instructionset="601"

unset 부속 명령을 참조하십시오. 또한, AIX 5L 버전 5.3 일반 프로그래밍 개념: 프로그램 작성 및 디버그에서의 Changing Print Output with Special Debug Program Variables를 참조하십시오.

set edit [vi, emacs] 또는 set -o [vi, emacs] 부속 명령

-o 또는 edit 옵션을 가진 set 부속 명령은 다음 편집 행 모드 중 하나를 작동하는 데 사용될 수 있습니다. set-o vi 또는 set edit vi 명령을 사용하면, vi 행 편집기의 입력 모드에 놓입니다. set -o emacs 또는 set edit emacs 명령을 사용하면, emacs 행 편집기의 입력 모드에 놓입니다.

예제
  1. vi 행 편집기를 작동하려면, 다음을 입력하십시오.
    set-o vi

    또는

    set edit vi

sh 부속 명령

sh [ Command ]

sh 부속 명령은 Command 매개변수에 지정된 명령을 실행 쉘로 전달합니다. SHELL 환경 변수는 사용될 쉘을 결정합니다. 디폴트는 sh 쉘입니다. 인수를 지정하지 않으면, 제어가 쉘로 이동됩니다.

예제
  1. ls 명령을 실행하려면 다음을 입력하십시오.
    sh ls
  2. 쉘로 나가려면 다음을 입력하십시오.
    sh
  3. SHELL 환경 변수를 사용하려면 다음을 입력하십시오.
    sh echo $SHELL

AIX 5L 버전 5.3 일반 프로그래밍 개념: 프로그램 작성 및 디버그에서의 Running Shell Commands from dbx를 참조하십시오.

skip 부속 명령

skip [ Number ]

skip 부속 명령은 현재 정지점으로부터 응용프로그램의 실행을 계속합니다. Number 매개변수의 값과 동일한 수의 중단점이 생략되고 다음 중단점에 도달하거나 프로그램이 종료될 때 실행이 중단됩니다. Number 매개변수를 지정하지 않으면 디폴트는 1이 됩니다.

예제

두 번째 중단점을 만날 때까지 계속 실행하려면 다음을 입력하십시오.

skip 1

cont 부속 명령도 참조하십시오.

source 부속 명령

sourceFile

source 부속 명령은 File 매개변수에서 지정한 파일로부터 dbx 부속 명령을 읽습니다.

예제

cmdfile 파일에서 dbx 부속 명령을 읽으려면 다음을 입력하십시오.

source cmdfile

AIX 5L 버전 5.3 일반 프로그래밍 개념: 프로그램 작성 및 디버그에서의 Reading dbx Subcommands from a File을 참조하십시오.

status 부속 명령

status [ >File ]

status 부속 명령은 모든 사용자 정의 중단점, 추적점 및 감시점을 표시합니다. status 부속 명령은 사용 가능하게 된 이벤트는 이벤트 번호를 대괄호로 묶어서 나열하고 사용 불가능하게 된 이벤트는 점으로 이벤트 번호를 묶어서 나열합니다. > 플래그는 status 부속 명령의 출력을 File 매개변수에 지정한 파일로 전송합니다.

플래그

>File File로 출력을 방향 재지정합니다.

예제
  1. 모든 사용자 정의 중단점, 추적점 및 감시점을 표시하려면 다음을 입력하십시오.
    status
    출력은 다음과 유사합니다.
    [1] stop at 13
    [2] stop at 14
    .3. stop at 15
    .4. stop at 16
    [5] stop at 17
    위의 예제 출력에서, 이벤트 3 및 4는 사용 불가능합니다.

dbx명령의clear 부속 명령, delete 부속 명령, stop 부속 명령 및 trace 부속 명령을 참조하십시오.

또한, AIX 5L 버전 5.3 일반 프로그래밍 개념: 프로그램 작성 및 디버그에서의 Setting and Deleting Breakpoints를 참조하십시오.

step 부속 명령

step [ Number ]

step 부속 명령은 응용프로그램의 소스 행을 실행합니다. Number 매개변수를 사용하여 실행될 행의 수를 지정하십시오. Number 매개변수를 생략하면, 디폴트는 1이 됩니다.

복수 스레드 응용프로그램에서 step 부속 명령을 사용하면, 모든 사용자 스레드는 조작 중에 실행되지만 프로그램은 실행 중인 스레드가 지정된 소스 행에 도달할 때까지 계속 실행됩니다. 스레드만이 실행되도록 하려면, set 부속 명령을 사용하여 $hold_next 변수를 설정하십시오. 이 변수를 설정하면 실행 중인 스레드는 블록화된 스레드 중 하나가 보유 중인 잠금을 기다릴 수 있기 때문에 교착 상태가 발생할 수 있습니다.

주: step 부속 명령의 작동을 제어하려면 set 부속 명령의 $stepignore 변수를 사용합니다. $stepignore 변수는 step 부속 명령이 디버깅 정보를 사용할 수 없는 대형 루틴으로 넘어갈 수 있도록 합니다.
예제
  1. 한 개의 소스 행 실행을 계속하려면, 다음을 입력하십시오.
    step
  2. 5개의 소스 행 실행을 계속하려면, 다음을 입력하십시오.
    step 5
  3. 다음 예제 코드
    60 printf ("hello world ₩n")에서 설명한 것처럼
    dbx 프로그램에서 printf 함수를
    단일 단계처리하지 못하게 하려면

    다음을 입력하십시오.

    set $stepignore="function"; step

cont 부속 명령, goto 부속 명령, next 부속 명령, set 부속 명령, stepi 부속 명령을 참조하십시오.

stepi 부속 명령

stepi [ Number ]

stepi 부속 명령은 응용프로그램의 명령을 실행합니다. Number 매개변수를 사용하여 실행될 명령의 수를 지정하십시오. Number 매개변수를 생략하면 디폴트는 1이 됩니다.

복수 스레드 응용프로그램에서 사용될 경우, stepi 부속 명령은 실행 중인 스레드만을 진행합니다. 다른 모든 사용자 스레드는 정지된 채 남아 있습니다.

예제
  1. 한 개의 기계 명령 실행을 계속하려면, 다음을 입력하십시오.
    stepi 
  2. 5개의 기계 명령 실행을 계속하려면 다음을 입력하십시오.
    stepi 5

gotoi 부속 명령, nexti 부속 명령, step 부속 명령을 참조하십시오.

stop 부속 명령

stop { [Variable] [ at SourceLine | in Procedure | on load ["ModuleName"] ] [ if Condition ]}

stop 부속 명령은 특정 조건이 충족되면 응용프로그램을 정지합니다. 다음과 같은 경우에 프로그램이 정지됩니다.

  • if Condition 플래그를 사용하면 Condition이 참이 됩니다.
  • in Procedure 플래그를 사용하면 Procedure가 호출됩니다.
  • Variable 매개변수를 지정하면 Variable 매개변수가 변경됩니다.
  • at SourceLine 플래그를 사용하면 SourceLine 행 번호에 도달합니다.

    SourceLine 변수는 :(콜론)과 정수가 뒤에 붙는 파일 이름 문자열로 또는 정수로 지정할 수 있습니다.

  • ModuleName 로드 모듈은 on load 플래그를 사용하고 ModuleName 매개변수를 지정한 경우에 로드 또는 로드 해제됩니다.

    선택적 ModuleName 변수를 단일 모듈 이름으로, 또는 다음 형식과 같이 멤버 이름과 쌍을 이루는 모듈 이름으로 지정할 수 있습니다.

    ModuleName(MemberName)
  • 로드된 모듈은 on load 플래그를 사용하고 ModuleName 매개변수를 지정하지 않은 경우에 로드 또는 로드 해제됩니다.

이 명령 다음에 dbx 디버그 프로그램은 사용자 명령 결과로 구성한 이벤트를 보고하는 메시지로 응답합니다. 메시지에는 명령에 대한 설명과 함께 중단점에 연관된 이벤트 ID가 들어 있습니다. 설명 구문은 사용자 명령과는 동일하지 않을 수도 있습니다. 예를 들면 다음과 같습니다.

stop in main
[1] stop in main
stop at 19 if x == 3
[2] stop at "hello.c":19 if x = 3 

대괄호 안의 숫자는 중단점과 관련된 이벤트 ID입니다. dbx 디버그 프로그램은 이벤트 번호를 각 stop 부속 명령에 연관시킵니다. 이벤트 중 하나의 결과로 프로그램이 중단되면, 현재 행과 함께 이벤트 ID가 표시되어 어떤 이벤트가 프로그램을 정지시켰는지 알 수 있습니다. 사용자가 작성한 이벤트는 dbx가 작성한 이벤트와 합쳐져서, 이벤트 번호는 항상 순차적이지 않을 수 있습니다.

status 부속 명령을 사용하여 이 번호를 열람할 수 있습니다. status로부터의 출력을 파일로 방향 재지정할 수 있습니다. delete 또는 clear 부속 명령을 사용하여 stop 부속 명령을 정지시키십시오.

복수 스레드 응용프로그램에서 사용자 스레드가 중단점과 만나게 되면 모든 사용자 스레드가 정지됩니다. 아래 예제 9에서 설명한 것처럼 조건을 지정하지 않으면 행이나 함수를 실행하는 사용자 스레드에서 소스 행이나 함수의 중단점 설정을 히트합니다. 자동으로 조건을 지정하는 별명은 다음과 같습니다.

  • bfth(Function, ThreadNumber)
  • blth(SourceLine, ThreadNumber)

ThreadNumberthread 부속 명령이 보고한 대로의 기호로 된 스레드 이름의 숫자 부분입니다(예를 들어, 5는 thread 이름 $t5의 ThreadNumber입니다). 별명은 실제로 다음에 표시된 확장된 부속 명령을 작성하는 매크로입니다.

stopi at &Function    if ($running_thread == ThreadNumber)
stop at SourceLine  if ($running_thread == ThreadNumber)
플래그

at SourceLine 행 번호를 지정합니다.
if Condition 조건을 참으로 지정합니다.
in Procedure 호출할 프로시저를 지정합니다.
on load ModuleName 모니터할 로드된 모듈을 지정합니다.

예제
  1. main 프로시저의 첫 번째 문에서 실행을 정지하려면 다음을 입력하십시오.
    stop in main
  2. 변수 값 x가 실행 행 12에서 변경될 때 실행을 정지하려면, 다음을 입력하십시오.
    stop x at 12
  3. sample.c 파일의 행 5에서 실행을 정지하려면 다음을 입력하십시오.
    stop at "sample.c":5
  4. dbx 프로그램에서 func1 내의 서브루틴을 실행할 때마다 x 값을 확인하려면 다음을 입력하십시오.
    stop in func1 if x = 22
  5. dbx에서 func1 실행을 시작할 때마다 x 값을 확인하려면 다음을 입력하십시오.
    stopi at &func1 if x = 22
  6. Variable 값이 변경될 경우 프로그램을 정지하려면 다음을 입력하십시오.
    stop Variable
  7. Condition이 참으로 평가될 때마다 프로그램을 정지하려면 다음을 입력하십시오.
    stop if (x > y) and (x < 2000)
  8. 다음 예제에서는 사용 중인 이벤트를 표시하고 삭제하는 방법을 나타냅니다.
    status
    [1] stop in main
    [2] stop at "hello.c":19 if x = 3
    delete 1
    status
    [2] stop at "hello.c":19 if x = 3
    clear 19
    status
    (dbx)

    delete 명령은 이벤트 ID별로 이벤트를 삭제합니다. clear 명령은 행 번호별로 중단점을 삭제합니다.

  9. thread $t5가 실행될 때만 func1 시작에 중단점을 위치시키려면, 다음 해당 명령 중의 하나를 입력하십시오.
    stopi at &func1 if ($running_thread == 5)

    또는

    bfth(func1, 5)
  10. 모듈이 로드 또는 로드 해제될 때 프로그램을 정지하려면 다음을 입력하십시오.
    stop on load
  11. Module 모듈이 로드 또는 로드 해제될 때마다 프로그램을 정지하려면 다음을 입력하십시오.
    stop on load "Module"
  12. Module 모듈의 Member 멤버가 로드 또는 로드 해제될 때마다 프로그램을 정지하려면 다음을 입력하십시오.
    stop on load "Module(Member)"

clear 부속 명령, delete 부속 명령, stopi 부속 명령 및 trace 부속 명령을 참조하십시오. 또한, AIX 5L 버전 5.3 일반 프로그래밍 개념: 프로그램 작성 및 디버그에서의 Setting and Deleting Breakpoints를 참조하십시오.

stophwp 부속 명령

stophwp Address Size

stophwp 부속 명령은 지정된 메모리 영역에 대한 하드웨어 경계점 정지를 설정합니다. 프로그램은 영역의 내용이 변경될 때 정지됩니다.

주:
  1. stophwp 부속 명령의 성공은 하드웨어에 따라 다릅니다. 이 기능은 모델 630, PowerPC 시스템 이상에서만 사용 가능합니다.
  2. 단일 경계점만을 설정할 수 있는 하드웨어 제한의 결과로, 활성 경계점 이벤트가 stophwptracehwp를 사용하여 하드웨어 경계점 이벤트를 추가 작성하려고 시도할 때 충돌로 작용합니다. 따라서, 새로운 이벤트를 작성하기 전에 이전 이벤트를 삭제해야 합니다. 또한 활성 소프트웨어 경계점이 존재하므로써(일부 stoptrace 부속 명령 호출에 의해 작성되는) 하드웨어 경계점의 성능 이점이 무효화되므로, 이러한 종류의 이벤트 또한 하드웨어 경계점을 작성하기 전에 삭제해야 하는 충돌로 작용합니다.
예제
  1. 1. 주소 0x200004e8에서 시작하는 4바이트 메모리 영역의 내용이 변경될 때 프로그램을 정지하려면, 다음을 입력하십시오.
    stophwp 0x200004e8 4

tracehwp 부속 명령을 참조하십시오.

stopi 부속 명령

stopi { [Address] [ at Address | in Procedure ] [ if Condition ]}

stopi 부속 명령은 지정된 위치에 정지를 설정합니다.

  • if Condition 플래그를 사용하면 조건 참이 지정될 경우 프로그램이 정지합니다.
  • Address 매개변수를 사용하면 Address의 내용이 변경될 경우 프로그램이 정지합니다.
  • at Address 플래그를 사용하면 지정한 주소에 정지가 설정됩니다.
  • e inProcedure 플래그를 사용하면, Procedure가 호출될 때 프로그램이 정지합니다.
플래그

if Condition 조건을 참으로 지정합니다.
in Procedure 호출할 프로시저를 지정합니다.
at Address 기계 명령 주소를 지정합니다.

예제
  1. 주소 0x100020f0에서 실행을 정지하려면 다음을 입력하십시오.
    stopi at 0x100020f0
  2. 주소 0x100020f0 의 내용을 변경하려면 다음을 입력하십시오.
    stopi 0x100020f0
  3. 주소 0x100020f0의 내용을 스레드 $t1이 변경할 때 실행을 정지하려면 다음을 입력하십시오.
    stopi 0x200020f0 if ($running_thread == 1)

stop 부속 명령을 참조하십시오. 또한, AIX 5L 버전 5.3 일반 프로그래밍 개념: 프로그램 작성 및 디버그에서의 Debugging at the Machine Level with dbx를 참조하십시오.

thread 부속 명령

선택한 스레드 표시

thread { [ info ] [ - ] [ ThreadNumber ... ] } | current | run | susp | term | wait

개별 스레드 선택

thread current [ - ] ThreadNumber

스레드 보류 또는 해제

thread { hold | unhold } [ - ] [ ThreadNumber ... ]

표시된 옵션에 대한 도움말

thread {help}

thread 부속 명령은 사용자 스레드를 표시하고 제어합니다.

thread 부속 명령의 첫 번째 양식은 두 가지 형식으로 정보를 표시할 수 있습니다. thread 부속 명령이 th이면 표시되는 정보는 첫 번째 형식입니다. thread 부속 명령이 th -이면 표시되는 정보는 두 번째 형식입니다. 매개변수를 제공하지 않으면, 모든 사용자 스레드에 대한 정보가 표시됩니다. 하나 이상의 ThreadNumber 매개변수를 제공하면 해당 사용자 스레드에 대한 정보가 표시됩니다. thread 부속 명령이 스레드를 표시하면, 현재 스레드 행의 앞에는 >가 있습니다. 실행 중인 스레드가 현재 스레드와 동일하지 않으면, 그 행의 앞에는 *가 나타납니다. thread 부속 명령에 의해 두 가지 형식으로 표시되는 정보는 다음과 같습니다.

첫 번째 형식으로 thread 부속 명령에서 표시하는 정보는 다음과 같습니다.

thread $tThreadNumber 형식으로 사용자 스레드의 기호로 된 이름을 나타냅니다.
state-k 사용자 스레드가 커널 스레드에 접속되어 있는 경우, 커널 스레드 상태를 나타냅니다. 각 상태는 실행 중이면 실행, 대기 중이면 wait, 일시 중단된 경우면 susp, 종료되면 term입니다.
wchan 커널 스레드가 대기 또는 정지 상태인 이벤트를 나타냅니다(사용자 스레드가 커널 스레드에 연결되어 있는 경우).
state-u 사용자 스레드 상태입니다. 가능한 상태는 실행 중, 블록, 종료입니다.
k-tid 커널 스레드 ID를 나타냅니다(사용자 스레드가 커널 스레드에 연결되어 있는 경우).
mode 사용자 스레드가 정지된 모드(커널 또는 사용자)임을 나타냅니다(사용자 스레드가 커널 스레드에 연결되어 있는 경우).
held 사용자 스레드가 유지되고 있는지를 나타냅니다.
scope 사용자 스레드의 경합 유효범위를 나타냅니다. 시스템이나 프로세스 경합 유효범위의 경우, 이것은 각각 syspro가 됩니다.
function 사용자 스레드 함수 이름을 나타냅니다.

두 번째 형식의 thread 부속 명령으로 표시되는 정보는 다음과 같습니다. 디폴트로, thread 부속 명령 th -의 경우, 정보는 long 양식으로 표시됩니다.

thread $tThreadNumber 형식으로 사용자 스레드의 기호로 된 이름을 나타냅니다.

커널 스레드 관련 정보

tid 사용자 스레드 ID입니다(사용자 스레드가 커널 스레드에 접속되어 있는 경우).
pri 커널 스레드의 우선순위입니다.
sched 커널 스레드의 스케줄링 정책입니다. 이는 스케줄링 방식에 따라 fifo는 fif, other는 oth, 라운드 로빈(round robin)은 rr로 표시됩니다.
state 사용자 스레드가 커널 스레드에 접속되어 있는 경우, 커널 스레드 상태를 나타냅니다. 각각의 상태에 따라 실행 중일 때는 run, 대기 중일 때는 wait, 일시 중단일 때는 susp, zombie 상태일 때는 zomb로 표시됩니다.

사용자 스레드 관련 정보

tid 사용자 스레드 ID입니다.
pri userl 스레드의 우선순위입니다.
sched 사용자 스레드의 스케줄 정책입니다. 이는 스케줄링 방식에 따라 fifo는 fif, other는 oth, 라운드 로빈(round robin)은 rr로 표시됩니다.
state 사용자 스레드 상태입니다. 이는 실행 중, 작성 중, 일시 중단, 블록, 실행 가능 또는 종료일 수 있습니다.
state 사용자 상태를 16진수로 나타냅니다.
flags pthread 플래그의 값을 16진수로 나타냅니다.
wchan 커널 스레드가 대기 또는 정지 상태인 이벤트를 나타냅니다(사용자 스레드가 커널 스레드에 연결되어 있는 경우).
mode 사용자 스레드가 정지된 모드(커널 또는 사용자)임을 나타냅니다(사용자 스레드가 커널 스레드에 연결되어 있는 경우).
held 사용자 스레드가 유지되고 있는지를 나타냅니다.
scope 사용자 스레드의 경합 범위를 나타냅니다. 이는 시스템 또는 프로세스 경합 범위의 경우 sys 또는 pro가 됩니다.
cancellation
pending
취소가 지연 중인지 여부를 나타냅니다.
state
취소의 모드 및 상태를 나타냅니다.

취소가 지연 중이 아니고 상태 및 모드가 각각 사용 가능 및 지연됨이면 ed로 표시되고, 취소 상태 및 모드가 사용 가능 상태이고 비동기이면 ea로 표시되며, 모드가 작동 불가능 상태이면 d로 표시됩니다.

취소가 지연 중이고 취소 상태 및 모드가 각각 사용 가능 및 지연됨이면 ED로 표시되고, 취소 상태 및 모드가 사용 가능이고 비동기이면 EA로 표시되며, 모드가 사용 가능 상태가 아니면 D로 표시됩니다.

joinable 스레드가 결합 가능한지 여부를 나타냅니다.
boosted 스레드에 사용된 값을 나타냅니다.
function 사용자 스레드 함수 이름을 나타냅니다.
cursig 현재 신호 값을 나타냅니다.

옵션 세트 $thcomp가 설정되면, 정보는 다음에 표시된 것과 같이 압축된 양식으로 표시됩니다.

m           mode           (k)ernel (u)ser
k           k-state        (r)unning (w)aiting (s)uspended (z)ombie
u           u-state        (r)unning (R)unnable (s)uspended (t)erminated

                           (b)locked (c)reating
h           held           (yes) (n)o
s           scope          (s)ystem (p)rocess
c           cancellation   not pending:  (e)nabled &(d)eferred,
                                         (e)nabled &(a)sync, (d)isabled
                           pending    :  (E)nabled &(D)eferred,
                                         (E)nabled &(A)sync, (D)isabled
j           joinable       (yes) (n)o
b           boosted        value of boosted field in pthread structure
plk         kernel thread  (oth)er  (fif)o  (rr)-> round-robin
            policy
plu         user thread    (oth)er  (fif)o  (rr)-> round-robin
            policy
prk         kernel thread  hex number
            policy
pru         user thread    hex number
            policy
k-tid                      kernel thread id in hex
u-tid                      pthread id in hex
fl                         value of flags field in pthread structure in hex
sta                        value of state field in pthread structure in hex
cs                         value of the current signal
wchan                      event for which thread is waiting
function                   function name           

thread 부속 명령의 두 번째 양식은 현재 스레드를 선택하는 데 사용됩니다. dbx 디버그 프로그램의 print, registerwhere 부속 명령은 모두 현재 스레드에 따라 작업을 수행합니다. 현재 스레드가 커널 모드에 있는 경우 registers 부속 명령은 레지스터를 표시할 수 없습니다.

thread 부속 명령의 세 번째 양식은 스레드 실행을 제어하는 데 사용됩니다. 스레드는 hold 플래그를 사용하여 보류되거나 unhold 플래그를 사용하여 해제할 수 있습니다. 보류된 스레드는 보류가 해제될 때까지 재개되지 않습니다.

주: dbx 디버그 프로그램의 print 부속 명령은 기호로 된 스레드 이름을 인식하며, 해당 오브젝트의 상태를 표시하는 데 사용될 수 있습니다.
플래그

current ThreadNumber 매개변수가 제공되지 않으면, 현재 스레드를 표시합니다. ThreadNumber 매개변수가 제공되면, 지정된 사용자 스레드를 현재 스레드로 선택합니다.
help th - 명령이 사용될 때 표시된 스레드 옵션에 대한 모든 정보를 표시합니다.
hold ThreadNumber 매개변수가 제공되지 않은 경우, 모든 사용자 스레드를 보류하고 표시합니다. 하나 이상의 ThreadNumber 매개변수가 제공되면 지정된 사용자 스레드를 보류하고 표시합니다.
unhold ThreadNumber 매개변수가 제공되지 않은 경우, 이전에 보류했던 모든 사용자 스레드를 해제하여 표시합니다. 하나 이상의 ThreadNumber 매개변수가 제공되면 지정된 사용자 스레드를 해제하여 표시합니다.
info ThreadNumber 매개변수가 제공되지 않은 경우, 모든 사용자 스레드를 long 양식으로 표시합니다. 하나 이상의 ThreadNumber 매개변수가 제공되면 지정된 사용자 스레드 리스트를 long 양식으로 표시합니다.

위의 모든 플래그는 [-] 옵션을 취합니다. 이 옵션을 지정할 경우, set $thcomp 옵션을 설정하지 않으면 표시되는 스레드 정보는 두 번째 형식 및 long 양식으로 표시됩니다.

run run 상태에 있는 스레드를 표시합니다.
susp susp 상태에 있는 스레드를 표시합니다.
term term 상태에 있는 스레드를 표시합니다.
wait wait 상태에 있는 스레드를 표시합니다.

예제
  1. 대기 상태에 있는 스레드에 대한 정보를 표시하려면, 다음을 입력하십시오.
    thread wait
    출력은 다음과 유사합니다.
    thread  state-k   wchan  state-u   k-tid  mode  held  scope  function 
     $t1     wait            running   17381    u    no    pro   main
     $t3     wait            running    8169    u    no    pro   iothread
  2. 제공된 여러 스레드에 대한 정보를 표시하려면, 다음을 입력하십시오.
    thread 1 3 4

    출력은 다음과 유사합니다.

    thread  state-k   wchan  state-u   k-tid  mode  held  scope  function
     $t1     wait            running   17381    u    no    pro   main
     $t3     wait            running    8169    u    no    pro   iothread
    >$t4     run             running    9669    u    no    pro   save_thr
  3. thread 4를 현재 스레드로 하려면, 다음을 입력하십시오.
    thread current 4
  4. thread 번호 2를 보류하려면, 다음을 입력하십시오.
    thread hold 2
  5. 두 번째 형식으로 대기 상태에 있는 thread에 대한 정보를 표시하려면, 다음을 입력하십시오.
    thread wait -

    출력은 다음과 유사합니다.

    thread m k u h s c  j b  kpl  upl  kpr upr k_tid   u_tid   fl  sta wchan function
    *$t1   u r w n p ed y 0  oth  oth  61   1  0043e5  000001  51  004       main
     $t3   u r w n p ed y 0  oth  oth  61   1  001fe9  000102  51  004        iothread
    >$t4   u r r n p ed y 0  oth  oth  61   1  0025c5  000203  50  064       save_thr  
  6. 두 번째 형식으로 여러 주어진 thread에 대한 정보를 표시하려면, 다음을 입력하십시오.
    thread - 1 2 3

    출력은 다음과 유사합니다.

    thread m k u h s c  j b  kpl  upl  kpr upr k_tid   u_tid   fl  sta wchan function
    *$t1   u r w n p ed y 0  oth  oth  61   1  0043e5  000001  51  004       main
     $t3   u r w n p ed y 0  oth  oth  61   1  00fe9   000102  51  004       iothread
    >$t4   u r r n p ed y 0  oth  oth  61   1  0025c5  000203  50  064       save_thr

attribute 부속 명령, condition 부속 명령, mutex 부속 명령, print 부속 명령, registers 부속 명령 및 where 부속 명령을 참조하십시오.

또한, AIX 5L 버전 5.3 일반 프로그래밍 개념: 프로그램 작성 및 디버그Creating Threads를 참조하십시오.

trace 부속 명령

trace [ SourceLine | Expression at SourceLine | Procedure | [ Variable ] [ at SourceLine | in Procedure ] | on load ModuleName ] [ if Condition ]

trace 부속 명령은 프로그램이 실행할 때 지정된 프로시저, 기능, 소스 행, 표현식 또는 변수에 대한 추적 정보를 인쇄합니다. SourceLine 변수는 :(콜론)과 정수가 뒤에 붙는 파일 이름 문자열로 또는 정수로 지정할 수 있습니다. 조건을 지정할 수 있습니다. dbx 디버그 프로그램은 번호를 각 trace 부속 명령에 연관시킵니다. status 부속 명령을 사용하여 이 번호를 열람할 수 있습니다. 추적을 중단하려면 delete 부속 명령을 사용하십시오.

trace 부속 명령은 디버그된 프로세스에서 모듈을 로드하거나 로드 해제할 때 추적 정보를 표시할 수 있습니다. 선택적 ModuleName 매개변수를 단일 모듈 이름으로, 또는 다음 형식과 같이 멤버 이름과 쌍을 이루는 모듈 이름으로 지정할 수 있습니다.

ModuleName(MemberName)

on load 플래그를 ModuleName 매개변수 없이 사용할 경우, dbx는 모든 모듈의 로드 및 로드 해제를 추적합니다.

디폴트로서 추적은 프로세스에 기반을 두고 있습니다. 스레드 기반 추적을 하려면 아래 예제 8에서 설명한 것처럼 조건에 스레드를 지정합니다.

플래그

at SourceLine 추적 중인 표현식이 있는 소스 행을 지정합니다.
if Condition 추적 시작 조건을 지정합니다. ifCondition이 참일 때만 추적을 시작합니다.
in Procedure 사용할 프로시저를 지정하여 프로시저 또는 추적 중인 변수를 찾습니다.
on load ModuleName 모니터할 로드 모듈을 지정합니다.

예제
  1. 각 호출을 printf 프로시저로 추적하려면 다음을 입력하십시오.
    trace printf
  2. hello.c 파일의 행 22 실행을 모두 추적하려면 다음을 입력하십시오.
    trace "hello.c":22
  3. main 프로시저의 x 변수에 대한 변경 사항을 추적하려면 다음을 입력하십시오.
    trace x in main
  4. 데이터 주소 0x2004000을 추적하려면 다음을 입력하십시오.
    set $A=0x2004000
    trace $A
    주: tracei 부속 명령은 주소를 추적하기 위해 만든 것입니다.
  5. 지정된 Procedure가 사용 중일 때 사용자가 소스 행의 출력을 제한할 수 있습니다. 추적 정보를 만들어야 할 때 선택사항인 Condition을 지정하여 제어할 수 있습니다. 예를 들면 다음과 같습니다.
    (dbx) trace in sub2
    [1] trace in sub2
    (dbx) run
    trace in hellosub.c:  8  printf("%s",s);
    trace in hellosub.c:  9  i = '5';
    trace in hellosub.c:  10  }
  6. 프로시저가 호출되거나 복귀될 때마다 메시지를 표시할 수 있습니다. 프로시저가 호출되면, 정보에는 전달된 매개변수 및 호출 루틴 이름 등이 포함됩니다. 복귀하는 경우, 정보에는 Procedure의 리턴값이 들어 있습니다. 예를 들면 다음과 같습니다.
    (dbx) trace sub
    [1] trace sub
    (dbx) run
    calling sub(s = "hello", a = -1, k = delete) from function main
    returning "hello" from sub
  7. 프로그램이 지정된 소스 행에 도달할 때 Expression 값을 출력할 수 있습니다. 행 번호 및 파일 이름은 출력되지만, 소스 행은 출력되지 않습니다. 예를 들면 다음과 같습니다.
    (dbx) trace x*17 at "hellosub.c":8 if (x > 0)
    [1] trace x*17 at "hellosub.c":8 if x > 0
    (dbx) run
    at line 8 in file "hellosub.c": x*17 = 51
     
    (dbx) trace x
    [1] trace x
    initially (at line 4 in "hello.c"):  x = 0
    after line 17 in "hello.c":  x = 3
  8. $t1 스레드에서 만든 x 변수에 대한 변경 사항을 추적하려면 다음을 입력하십시오.
    (dbx) trace x if ($running_thread == 1)
  9. 모든 모듈의 로드 또는 로드 해제를 추적하려면 다음을 입력하십시오.
    trace on load
  10. Module 모듈의 specificity 또는 로드 해제를 추적하려면 다음을 입력하십시오.
    trace on load "Module"
  11. Module 모듈에서 Member 멤버의 로드 또는 로드 해제를 추적하려면 다음을 입력하십시오.
    trace on load "Module(Member)"

또한 tracei 부속 명령을 참조하십시오.

tracehwp 부속 명령

tracehwp Address Size

tracehwp 부속 명령은 지정된 메모리 영역에 대한 하드웨어 경계점 정지를 설정합니다. dbx 디버그 프로그램은 영역의 내용이 변경될 때 추적 정보를 인쇄합니다.

주:
  1. tracehwp 부속 명령의 성공은 하드웨어에 따라 다릅니다. 이 기능은 모델 630, PowerPC 시스템 이상에서만 사용 가능합니다.
  2. 단일 경계점만을 설정할 수 있는 하드웨어 제한의 결과로, 활성 경계점 이벤트가 stophwptracehwp를 사용하여 하드웨어 경계점 이벤트를 추가 작성하려고 시도할 때 충돌로 작용합니다. 따라서, 새로운 이벤트를 작성하기 전에 이전 이벤트를 삭제해야 합니다. 또한 활성 소프트웨어 경계점이 존재하므로써(일부 stoptrace 부속 명령 호출에 의해 작성되는) 하드웨어 경계점의 성능 이점이 무효화되므로, 이러한 종류의 이벤트 또한 하드웨어 경계점을 작성하기 전에 삭제해야 하는 충돌로 작용합니다.
예제
  1. 주소 0x200004e8에서 시작하는 4바이트 메모리 영역의 내용이 변경될 때마다 추적하려면, 다음을 입력하십시오.
    tracehwp 0x200004e8 4 

stophwp 부속 명령을 참조하십시오.

tracei 부속 명령

tracei [ [ Address ] [ at Address | in Procedure ] | Expression at Address ] [ if Condition ]

tracei 부속 명령은 다음과 같은 경우에 추적을 합니다.

  • Address 플래그가 포함되어 있는 경우 Address 플래그에서 지정한 주소의 내용이 변경되었을 때.
  • at Address 매개변수를 지정한 경우 at Address 명령이 실행되었을 때.
  • inProcedure 플래그가 포함되어 있는 경우 Procedure에서 지저안 프로시저가 활성화되었을 때.
  • ifCondition 플래그가 포함된 경우 Condition 매개변수에서 지정한 조건이 참일 때.
플래그

at Address 주소를 지정합니다. 이 주소에서 명령이 실행될 때 추적이 가능합니다.
if Condition 조건을 지정합니다. 이 조건이 부합될 때 추적이 가능합니다.
in Procedure 프로시저를 지정합니다. 이 프로시저를 사용 중일 때 추적이 가능합니다.

예제
  1. 실행된 각 명령을 추적하려면 다음을 입력하십시오.
    tracei
  2. 주소 0x100020f0에서 명령이 실행될 때마다 추적하려면 다음을 입력하십시오.
    tracei at 0x100020f0
  3. main 프로시저가 활성화되어 있는 동안 0x20004020 메모리 위치의 내용이 변경된 경우를 모두 추적하려면 다음을 입력하십시오.
    tracei 0x20004020 in main
  4. thread $t4가 주소 0x100020f0에서 명령을 실행될 때마다 추적하려면 다음을 입력하십시오.
    tracei at 0x100020f0 if ($running_thread == 4)

trace 부속 명령을 참조하십시오. 또한, AIX 5L 버전 5.3 일반 프로그래밍 개념: 프로그램 작성 및 디버그에서의 Debugging at the Machine Level with dbx를 참조하십시오.

unalias 부속 명령

unaliasName

unalias 부속 명령은 Name 매개변수가 지정한 별명을 삭제합니다.

예제

printx라는 이름의 별명을 삭제하려면 다음을 입력하십시오.

unalias printx

alias 부속 명령을 참조하십시오. 또한, AIX 5L 버전 5.3 일반 프로그래밍 개념: 프로그램 작성 및 디버그에서의 Creating Subcommand Aliases를 참조하십시오.

unset 부속 명령

unsetName

unset 부속 명령은 Name 매개변수가 지정한 이름과 관련된 dbx 디버그 프로그램 변수를 삭제합니다.

예제

부동소수점 레지스터 표시를 금지하는 변수를 삭제하려면 다음을 입력하십시오.

unset $noflregs

set 부속 명령을 참조하십시오. 또한, AIX 5L 버전 5.3 일반 프로그래밍 개념: 프로그램 작성 및 디버그에서의 Changing Print Output With Special Debugging Variables를 참조하십시오.

up 부속 명령

up [ Count ]

up 부속 명령은 현재 함수를 스택에서 Count 레벨 번호만큼 위로 이동시킵니다. 현재 함수는 이름을 분석하는 데 사용됩니다. Count 매개변수에 대한 디폴트는 1입니다.

예제
  1. 현재 함수를 스택 레벨 2보다 위쪽으로 이동하려면, 다음을 입력하십시오.
    up 2
  2. 스택에서 현재 기능을 표시하려면 다음을 입력하십시오.
    up 0

down 부속 명령을 참조하십시오. 또한, AIX 5L 버전 5.3 일반 프로그래밍 개념: 프로그램 작성 및 디버그에서의 Changing the Current File or ProcedureDisplaying a Stack Trace를 참조하십시오.

use 부속 명령

use [ { + | Directory | '['RegularExpression = NewPath']' } ... ]

use 부속 명령은 dbx 디버그 프로그램이 소스 파일을 찾을 때 검색할 디렉토리 리스트와 적용할 경로 맵핑을 설정합니다. 인수 없이 use 부속 명령을 지정하면, 검색할 현재 디렉토리 리스트와 적용될 경로 맵핑이 표시됩니다.

@(at 기호)는 dbx 프로그램이 오브젝트 파일(있는 경우)에 있는 전체 경로 이름 정보를 찾도록 하는 특수 디렉토리입니다. 사용자가 @라는 상대적인 디렉토리를 찾도록 하려면, 검색 경로에 ./@를 사용해야 합니다.

use 부속 명령은 +(더하기 부호)를 사용하여 검색할 디렉토리 리스트에 디렉토리나 맵핑을 추가합니다. +use 부속 명령에 입력으로 지정한 경우 디렉토리 및 맵핑의 현재 리스트를 나타냅니다. 디렉토리나 맵핑을 현재 리스트 끝에 추가하려면, +를 새 디렉토리나 맵핑 이전에 지정해야 합니다. 디렉토리를 현재 리스트의 맨 앞에 추가하려면, +를 새 디렉토리나 맵핑 다음에 지정해야 합니다. +라는 디렉토리가 있으면, 디렉토리의 전체 경로 이름을 지정하십시오(예: ./+ 또는 /tmp/+).

use 부속 명령은 [](대괄호)로 묶인 문자열을 해석합니다. 이 문자열에는 경로 맵핑으로 =(등호)가 있습니다. 이 경로 맵핑은 특수 @ 디렉토리와 함께 사용됩니다. 이 맵핑을 사용하면 소스 파일의 전체 디렉토리 구조가 컴파일 후 다시 할당된 경우에 사용자가 소스 파일 위치를 쉽게 표시할 수 있습니다.

디버깅 중 소스 파일을 찾을 때 다음 규칙이 적용됩니다.

  • 리스트의 디렉토리는 지정된 순서대로 평가됩니다.
  • 리스트에 있는 디렉토리를 평가할 때, 디렉토리에서 지정된 파일을 검색합니다. 파일이 디렉토리에 있고 읽기 가능하면 이 파일이 사용됩니다.
  • 특수 @ 디렉토리를 평가할 때, 하나 이상의 경로 맵핑을 지정할 경우, 경로 맵핑의 RegularExpression 부분이 오브젝트 파일에서 파일의 전체 경로 이름 정보 중 처음 n자와 일치하고 경로 맵핑의 NewPath 부분 대체로 읽기 가능한 파일이 생성되면, 이 파일이 사용됩니다.
  • 특수 @ 디렉토리를 평가할 때, 경로 맵핑을 지정하지 않았거나 일치사항이 전혀 없으면, 파일의 전체 경로 이름 정보에 해당되는 디렉토리를 검색합니다. 파일이 디렉토리에 있고 읽기 가능하면 이 파일이 사용됩니다.
  • 둘 이상의 경로 맵핑에서 읽기 가능 파일을 생성할 경우, RegularExpression이 파일의 전체 경로 이름 중 대부분의 문자(1 ... n)와 일치하는 경로 맵핑(즉, 가장 특정한 경로 맵핑)이 적용되고 해당 결과 파일이 사용됩니다.
  • 둘 이상의 경로 맵핑에서 읽기 가능 파일을 생성하고 각 경로 맵핑의 특수성이 동일할 경우, 리스트의 맨 앞에 가까운 경로 맵핑이 적용되고 해당 결과 파일이 사용됩니다.
주:
특수 @ 디렉토리가 리스트 멤버가 아니면, 지정한 경로 맵핑은 완전히 무시됩니다.
예제
  1. 검색할 디렉토리 리스트를 현재 디렉토리(.), 상위 디렉토리(..), /tmp 디렉토리로 변경하려면 다음을 입력하십시오.
    use . .. /tmp
  2. 검색할 디렉토리 리스트를 현재 디렉토리(.), 컴파일 시간에 소스 파일이 위치했던 디렉토리(@), ../source 디렉토리로 변경하려면 다음을 입력하십시오.
    use . @ ../source
  3. /tmp2 디렉토리를 검색할 디렉토리 리스트에 추가하려면 다음을 입력하십시오.
    use + /tmp2
  4. /tmp3 디렉토리를 검색할 디렉토리 리스트의 맨 앞에 추가하려면 다음을 입력하십시오.
    use /tmp3 +
  5. 전체 경로 이름 정보가 /home/developer로 시작하는 소스 파일이 현재 /mnt에 있음을 표시하려면 다음을 입력하십시오.
    use + [/home/developer=/mnt]
  6. dbx 프로그램이 /latest에서 처음 찾도록 지시했는데 파일이 해당 위치에 없을 경우 /stable에서 /home/developer로 시작하는 전체 경로 이름 정보를 갖는 파일을 찾도록 하려면 다음을 입력하십시오.
    use + [/home/developer=/latest] [/home/developer=/stable]

또한, edit 부속 명령과 list 부속 명령을 참조하십시오.

whatis 부속 명령

whatisName

whatis 부속 명령은 Name의 선언을 표시하고, Name 매개변수는 변수, 프로시저 또는 함수 이름을 지정합니다.

주: dbx 프로그램을 실행하는 중에만 whatis 부속 명령을 사용합니다.
예제
  1. 변수 x의 선언을 표시하려면 다음을 입력하십시오.
    whatis x
  2. 프로시저 main의 선언을 표시하려면, 다음을 입력하십시오.
    whatis main
  3. main 함수내의 x 변수 선언을 표시하려면 다음을 입력하십시오.
    whatis main.x
  4. 열거, 구조 또는 통합 태그(또는 Pascal의 해당 태크)의 선언을 인쇄하려면, $$TagName을 사용합니다.
    (dbx) whatis $$status
    enum $$status { run, create, delete, suspend };

where 부속 명령

where [ >File ]

where 부속 명령은 활동 중인 프로시저 및 함수 리스트를 표시합니다. >File 플래그를 사용하여, 이 부속 명령에 대한 출력을 지정된 파일로 방향 재지정할 수 있습니다.

플래그

>File 지정된 파일로 출력을 방향 재지정합니다.

up 부속 명령과 down 부속 명령을 참조하십시오. 또한, AIX 5L 버전 5.3 일반 프로그래밍 개념: 프로그램 작성 및 디버그에서의 Displaying a Stack Trace를 참조하십시오.

whereis 부속 명령

whereisIdentifier

whereis 부속 명령은 이름이 지정된 ID와 일치하는 모든 기호의 전체 규정을 표시합니다. 기호가 인쇄되는 순서는 중요하지 않습니다.

예제

이름이 x인 모든 기호에 대해 규정화된 이름을 표시하려면 다음을 입력하십시오.

whereis x

which 부속 명령을 참조하십시오.

which 부속 명령

which Identifier

which 부속 명령은 주어진 ID의 전체 규정을 표시합니다. 전체 규정은 ID가 연관된 외부 블록 리스트로 구성됩니다.

예제

x 기호의 전체 규정을 표시하려면 다음을 입력하십시오.

which x

whereis 부속 명령을 참조하십시오. 또한, AIX 5L 버전 5.3 일반 프로그래밍 개념: 프로그램 작성 및 디버그에서의 Scoping of Names를 참조하십시오.

파일

a.out 오브젝트 코드를 포함하고 있는 오브젝트 파일.
core 코어 덤프를 포함합니다.
.dbxinit 초기화 명령을 포함합니다.

관련 정보

adb 명령, cc 명령.

a.out 파일, core 파일

AIX 5L 버전 5.3 일반 프로그래밍 개념: 프로그램 작성 및 디버그에서의 dbx Symbolic Debug Program OverviewUsing the dbx Debug Program.

dbx 사용자 메뉴얼.docx

반응형

'UTIL > Debugging' 카테고리의 다른 글

Windbg를 이용한 메모리 릭 검사(영문)  (0) 2014.12.26
Windows Wingdb를 이용한 MEMORY LEAK 대처법  (0) 2014.12.26
windbg 사용법 (WinDebug)  (0) 2014.05.26
gdb 사용법 안내  (0) 2012.08.01
반응형

dspmqver - 엠큐 버젼 확인

0.큐 매니저 관리
crtmqm -옵션 큐매니저명 - 큐관리자 생성 (-q 디폴트 큐매니져, -c 디스크립션, -u 데드큐 지정(데드큐는 해당 DQ 생성 해줘야함), )
strmqm 큐매니저명 - 큐 관리자 시작
strmqscv 큐매니저명 - 큐 관리자 커맨드 서버 시작
endmqm -i 큐매니저명 - 큐 관리자 정지
runmqsc 큐매니저명 - 큐관리자 명령모드
dsqmq - 현재 큐매니저 나열
runmqlsr -옵션 -m 큐매니저명 - 큐매니저 리스너 시작 (-t 프로토콜, -p 포트, -i 아이피, -m 큐매니저명)

윈도우
netstat -nap TCP | find " 포트명" => 리스너 띄운뒤 netstat으로 리스너 시작여부 확인.
유닉스
netstat -na tcp | grep 포트명

1. 명령행 모드
dsp qmgr - WMQ Object들을 확인 (dsp -> display)
dis q(*) - 큐 보기
dis chl(*) - 채널 보기

define qlocal(TEST.LQ) => def ql(TEST.LQ) => 해당 큐 정의
dis ql(TEST*) - 해당 큐보기
alter qmgr deadq(TEST.DQ) - 데드레터큐 등록

def ql(TEST.XQ) usage(XMITQ) -> Transmission Queue 정의

def qr(TEST2.TEST2.RQ) rname(TEST2.LQ) rqmname(TEST2) xmitq(TEST2.XQ) - Remote Queue 정의(큐 관리자 TEST1에서 실행)

def chl(TEST1.TO.TEST2) chltype(SDR) +
conname('127.0.0.1(1415)') trptype(TCP) xmitq(TEST2.XQ) - 송신채널 정의

def chl(TEST1.TO.TEST2) chltype(SCVR) - 수신채널 정의
ping channel(TEST1.TO.TEST2) - 채널 ping을 수행. (큐관리자 TEST1에서 실행)
start chl(TEST1.TO.TEST2)
runmqchl -c TEST1.TO.TEST2 -m TEST1
display chstatus(*)

1. 계정 최고 관리자
UNIX 계열 : mqm
WINDOWS 계열 : MUSR_MQADMIN

- 해당 큐에 접속 가능하도록 큐 관리자 등록(의미가 맞나 ㅡㅡ?) -
ALTER CHANNEL(SYSTEM.DEF.SVRCONN) CHLTYPE(SVNCONN) MCAUSER(계정 최고 관리자)

mqsc 에서 리스너 띄우기
dis listener(*) - 리스너 세부사항 표시.
alter LISTENER(SYSTEM.DEFAULT.LISTENER.TCP) TRPTYPE(TCP) CONTROL(QMGR) PORT(1414) - 리스너 변경
start LISTENER(SYSTEM.DEFAULT.LISTENER.TCP) - 리스너 시작 요청
반응형
반응형

1) PATH & LIB PATH 환경변수 추가
공통 : export PATH=$PATH:/opt/mqm/bin:/opt/mqm/samp/bin 또는 $PATH:/usr/mqm/bin:/usr/mqm/samp/bin
export EAI_HOME=$EAI_HOME_DIR
export JAVA_HOME=/opt/$java_installed_dir

HP-UX : export SHLIB_PATH=$SHLIB_PATH:/opt/mqm/lib:/opt/mqm/java/lib (32bit) 또는
export SHLIB_PATH=$SHLIB_PATH:/opt/mqm/lib64:/opt/mqm/java/lib64 (64bit)

SunOS : export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/mqm/lib:/opt/mqm/java/lib (32bit) 또는
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/mqm/lib64:/opt/mqm/java/lib64 (64bit)

AIX : export LIBPATH=$LIBPATH:/usr/mqm/lib:/usr/mqm/java/lib (32bit) 또는
export LIBPATH=$LIBPATH:/usr/mqm/lib64:/usr/mqm/java/lib64 (64bit)

2) Java Class Path 추가

export CLASSPATH=/opt/mqm/java/lib/com.ibm.mq.jar
export CLASSPATH=/opt/mqm/java/lib/connector.jar
export CLASSPATH=$EAI_HOME/java/lib/$user_class.jar...

3) MQ QMGR Create / Object Attribute 주의 사항

- crtmqm -lf 16384 -ls 20 -lp 5 -u $Qmgr_name.DQ -q $Qmgr_name (TX 고려 WMQ Log Sizing 필요)

- Local Queue
DEFINE QLOCAL($LOCALQ.LQ) +
MAXDEPTH(999999999) +
MAXMSGL(4194304) +
DEFPSIST(YES)

- Remote Queue
DEFINE QREMOTE($REMOTEQ.RQ) +
RQMNAME(REMOTEQMgr) +
RNAME(REMOTEQ.LQ) +
XMITQ(TRANSMIT.XQ) +
DEFPSIST(YES)

- Alias Queue
DEFINE QALIAS(ALIASQ.AQ) +
TARGQ(MTE.RQ) +
DEFPSIST(YES)

- Transmission Queue
DEFINE QLOCAL($TR.XQ) +
MAXDEPTH(999999999) +
MAXMSGL(4194304) +
DEFPSIST(YES) +
USAGE(XMITQ) REPLACE

- Cluster Queue
DEFINE QLOCAL($CLUSTERQ.LQ) +
CLUSTER(CLA) +
MAXDEPTH(999999999) +
MAXMSGL(4194304) +
DEFPSIST(YES) +
DEFBIND(NOTFIXED)

- Sender Channel
DEFINE CHANNEL($SENDERCHANNEL)+
CHLTYPE(SDR)+
XMITQ(TRANSMITTIONQ.XQ)+
CONNAME(HOSTNAME(1414)')+
MAXMSGL(104857600)+
BATCHSZ(1) BATCHINT(0) DISCINT(0)+
TRPTYPE(TCP)

* online BATCHSZ(100)정도

- Receiver Channel
DEFINE CHANNEL(EAI01P.WNETIS3T.N1) +
CHLTYPE(RCVR) +
MAXMSGL(104857600)

- Request Channel
DEFINE CHANNEL(EAI01P.WNETIS3T.N1) +
CHLTYPE(RQSTR) +
CONNAME(HOSTNAME(1414)')+
MAXMSGL(4194304)

- Svrconn Channel
DEFINE CHANNEL(SYSTEM.ADMIN.SVRCONN) +
CHLTYPE(SVRCONN) +
MCAUSER('mqm') +
TRPTYPE(TCP) +
MAXMSGL(104857600)

- 하트비트 간격 -> DEFAULT

- Default XQ 설정 여부 YES

- CCSID
Windows & Unix: ALTER QMGR CCSID(1208)

- 기타
alter chl(SYSTEM.DEF.SVRCONN) CHLTYPE(SVRCONN) MCAUSER('mqm')
def chl(SYSTEM.ADMIN.SVRCONN) CHLTYPE(SVRCONN) MCAUSER('mqm')

def listener(LISTENER_NAME) TRPTYPE(TCP) IPADDR(ipaddr) PORT(port_number) CONTROL(STARTONLY)


- Configmgr 권한 문제 시
mqsicreateaclentry ConfigMgr_Name -u User_name -a -x F -p

반응형
반응형
-----------------------------------------------------------------------------------------
./mqlicense.sh -accept

Licensed Materials - Property of IBM

 5724-H72

 (C) Copyright IBM Corporation 1994, 2009 All rights reserved.

US Government Users Restricted Rights - Use, duplication or disclosure
restricted by GSA ADP Schedule Contract with IBM Corp.


./mqlicense.sh: ./lap/jre/jre/bin/java: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory

ERROR:  Installation will not succeed unless the license
        agreement can be accepted.

        If the error was caused by a display problem,
        read the license agreement file  (LA_xx, where
        xx represents your language ) in the 'licenses'
        directory, and then run the following command:

            mqlicense.sh -accept

        Only use this command if you accept the license
        agreement.

        For other errors, contact your IBM support centre.



이럴 경우 대비책

1) config 값을 바꾼다.
You need to disable Selinux.
Go to /etc/selinux directory, open the file config, which would look like:

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - SELinux is fully disabled.
SELINUX=disabled
# SELINUXTYPE= type of policy in use. Possible values are:
# targeted - Only targeted network daemons are protected.
# strict - Full SELinux protection.
SELINUXTYPE=targeted

Change the line SELINUX=enforcing to
SELINUX=disabled

2) java bin가 연결이 안되어 있을수도 있다..
./mqlicense.sh -accept -jre /usr/bin/java

이렇게 둘중에 하나 하면 될지도... ㅡㅡ
개인적으로 난 2번째껄로 하니깐 해결됨.
-----------------------------------------------------------------------------------------

MQ Requirement
검증이된 OS
Red Hat Enterprise Linux AS V3.0 및 Update 2
SuSE Linux Enterprise Server(SLES) V8 및 Service Pack 3

WebSphere MQ 파일 시스템 작성
제품 코드에 대한 설치 디렉토리(바이너리)는 /opt/mqm이고, 작업 데이터(오브젝트)는 /var/mqm에 저장됩니다.
해당 위치를 변경 할 수는 없고, GSKit도 디폴트 위치에 설치 되어야 합니다.
파일 시스템이 제품을 포함하기에 너무 작아서 제품 코드를 설치할 수 없는 경우는 다음중 하나를 수행 할 수 있습니다.
/bigdisk/mqm 에 설치를 하고 싶다면 다음과 같이 bigdisk로의 심볼릭 링크를 작성해 줍니다.
ln -s /bigdisk/mqm /opt/mqm
커널 구성
공유 세그먼트의 최대 크기를 256MB 이상 설정을 해야 합니다.
확인방법은 cat /proc/sys/kernel/shmmax
설정 방법은 echo 268435456 > /proc/sys/kernel/shmmax
시스템 로드가 큰 경우 열린 파일의 최대 개수를 늘려야하는데 32768 이상 설정합니다.
확인방법은 cat /proc/sys/fs/file-max
설정 방법은 echo 32768 > /proc/sys/fs/file-max
시스템을 다시 시작할 때마다 이러한 값을 구성하려면 이 명령을 /etc/rc.d/...의 시동 스크립트에 추가하는 것이 좋습니다.

리눅스 32bit mq 설치
1. root로 로그인
2. mqm그룹과 mqm그룹에 속하는 mqm 계정 생성
3. mq라이센스 승인
./mqlicense.sh -accept
4. rpm -ivh rpm파일명.rpm 로 하면 설치가 된다.
MQSeriesRuntime-6.0.0-0.i386.rpm
MQSeriesServer-6.0.0-0.i386.rpm 이 두개가 기본
MQSeriesClient-6.0.0-0.i386.rpm
MQSeriesMsg_ko-6.0.0-0.i386.rpm
MQSeriesMan-6.0.0-0.i386.rpm
MQSeriesSamples-6.0.0-0.i386.rpm
MQSeriesSDK-6.0.0-1.i386.rpm
그리고 나서 mq 설치와 동일한 방법으로 픽스를 설치를 한다.

리눅스 64bit mq 설치
1. root로 로그인
2. mqm그룹과 mqm그룹에 속하는 mqm 계정 생성
3. mq라이센스 승인
./mqlicense.sh -accept
4. rpm -ivh rpm파일명.rpm 로 하면 설치가 된다.
MQSeriesRuntime-6.0.1-0.x86_64.rpm
MQSeriesServer-6.0.1-0.x86_64.rpm 이 두개가 기본
MQSeriesClient-6.0.1-0.x86_64.rpm
MQSeriesMsg_ko-6.0.1-0.x86_64.rpm
MQSeriesMan-6.0.1-0.x86_64.rpm
MQSeriesSamples-6.0.1-0.x86_64.rpm
MQSeriesSDK-6.0.1-0.x86_64.rpm
그리고 나서 mq 설치와 동일한 방법으로 픽스를 설치를 한다.
QMGR을 만들때는 /var/mqm/mqs.ini의 파일에 정의 되어있는 값들을 기본으로 생성을 합니다.
로그 사이즈는 하루 얼마나 쌓이는지 확인하고, 대략 한달치 정도 쌓이도록 저장을 합니다.
로그파일 사이즈는 16384가 최대 큰 값이고, 16384*4KB 하면 64MB 이다.

리눅스 mq 삭제 방법
1. root로 로그인
2. dspmq 명령을 사용하여 시스템에 있는 모든 큐 관리자의 상태를 표시
3. endmqm 명령을 사용하여 실행 중인 모든 큐 관리자를 정지
3. 리스너 정지, 트리거모니터링.. 기타 등등 동일.
endmqlsr -m {QMgrName}
4. ps -ef | grep mq MQ프로세스 모두 정지 했는지 확인.
amq 또는 runmq로 시작하여 명령행을 실행 중인 프로세스가 나열되지 않는지 점검, amqi로 시작하는 프로세스는 무시하여도 됩니다.
5. 설치 제거하기 전에 현재 설치되어 있는 패키지(구성요소)의 이름을 알아야함
rpm -q -a | grep MQSerise
rpm -q -a | grep gsk
*설치에 FIX가 적용이 되어있는 경우에는 기본 설치를 제거하기 전에 FIX 부터 먼저 제거 하여야 한다.
6. rpm 명령은 해당 패키지에 다른 패키지가 종속된 경우 이를 제거하지 않습니다.
이러한 이유로, 다른 패키지에 종속되지 않은 순서로 각 패키지를 설치 제거해야 합니다.
예를 들어, 런타임, 서버 및, SDK구성요소를 제거하려면 다음을 입력하십시오.
rpm -ev MQSeriseRuntime MQSeriesServer MQSeriesSDK
7. 설치가 제거된 후에는 오브젝트 디렉토리는 삭제가 되지 않고 남아 있습니다.
마이그레이션 혹은 재 설치를 할때 자동으로 이러한 오브젝트를 그대로 가져와 사용을 합니다.
기존의 QMGR과 동일하게 생성을 할려면 /var/mqm/qmgrs/{QMgrName}/qm.ini 의 파일 속성을 그대로 mqs.ini파일에 설정을 한 다음에 생성하면 됩니다.(%메모장등에 복사 필요)
반응형
반응형



사실 모든 Path를 외우지 않는 이상 창을 분할해서 열어서 편집할 때 그 파일이 어디에 위치해 있는지 알기 어렵다.
그래서 Vim에서는 윈도우 탐색기와 같이 디렉터리 탐색기 플러그인 툴을 기본적으로 제공하는데 netrw 라는 툴이다.
이 기능은 창을 분할하여 탐색하고 동시에 편집도 가능하게 해주는 강력한 Vim의 툴로써 그 사용법을 알아두면 매우 이로울 것이다.

------------------------------------------------------------------------------------------------------------------------------------

 명령어  설명  모드
 :e 디렉토리경로  명령행 모드에서 edit 또는 e를 한 다음 디렉토리 경로를 입력하면 해당 디렉토리에 대해서 netrw 툴이 실행된다.  명령행 모드
 <Enter>  해당 디렉토리 또는 파일을 연다.  netrw 명령어
 w 또는 j 또는 방향키 ↓  netrw 내에서 아래로 이동하는 방향키  netrw 명령어
 b 또는 k 또는 방향키 ↑  netrw 내에서 위로 이동하는 방향키  netrw 명령어

 i  파일을 표시할 방법을 변경한다.
(한줄 방식, 파일 정보 표시방식, 와이드 방식, 트리 방식)
 netrw 명령어
 s  정렬 방식을 바꿔준다 (time, size, name 방식)  netrw 명령어
 o  커서 위치의 파일을 수평 분할된 새창으로 열어준다.  netrw 명령어
 v  커서 위치의 파일을 수직 분할된 새창으로 열어 준다.  netrw 명령어
 p  커서 이취의 파일을 미리 보기 창으로 열어준다. (미리 보기 파일의 창 닫기는 일반 모드로 CTRL-w z 를 사용한다)  netrw 명령어
 P  커서 위치의 파일을 바로 이전에 생성된 창에 열어준다. 바로 이전에 생성된 창이 없을 시에는 수평 분할된 새 창으로 열어준다.  netrw 명령어
 R  커서위치의 파일의 파일명을 바꾼다.  netrw 명령어
 t  새로운 탭으로 분할하여 열어준다.  netrw 명령어
 -  상위 디렉토리로 이동한다. 디렉토리가 보이는 것에서 ../에 커서를 위치시키고 엔터를 눌러도 된다.  netrw 명령어



현재 수평분할해서 파일을 하나 열어 놓은것을 확인할 수 있다. (s 키)
수평분할된 창에서 아래창을 보면 Netrw 의 현재 상태를 알 수 있는데
/root 로 현재 위치를 표시하고
Sorted by 즉 정렬방식은 name으로 되어 있고
파일 표시 방식(i 키)를 이용하여 정보표시방식으로 되어 있다.
현재 커서의 위치는 하얀색 가로 줄로써 확인할 수 있다. 
Quick Help라고 써 져있는 부분을 보면 간단한 실행 단축키를 알 수 있다. 더욱 자세한 설명은 F1 키를 눌러 Help를 참고하자.



 






반응형
반응형


이제 Vim 에디터를 조금 더 고급스럽게 써보는 방법인 창분할 과 탭 사용법에 대해서 알아보도록 하자.
사실 본인의 경우는 창을 분할해서 사용하기 보단 여러개의 터미널로 접속해서 사용하였다. 물론 이렇게 하게 되면 각 창별로 내가 셋팅해서 사용할 수 있기 때문에 편하긴 하지만 서버에 터미널 접속 갯수의 제한이 있거나 동시에 파일을 여러개 띄어놓고 한개의 창에서 작업하기에는 창 분할을 사용하는게 더욱 효율적이다. 물론 어느 것이나 그렇지만 익숙해지면 정말로 훌룡한 기능이다. 비쥬얼 베이직이나 여러 다른 편집 툴 역시 탭이나 창분할을 지원하기도 하지만 Vim은 빠르고 사용법이 간단하다는 장점이 있으니 Vim 에디터의 창분할 기능을 적극적으로 사용해서 사용해보자.

------------------------------------------------------------------------------------------------------------------------------------

 명령어  설명   모드 
 :#sp filename  #에 숫자를 넣은 행의 크기 만큼 창이 수평 분할된다. filename을 넣게 되면 해당 파일을 오픈하거나 없으면 새파일을 만든다. 같은 파일에서는 일반모드로 #ctrl-w s 를 치면 #크기 만큼 창이 수평으로 분할된다.  명령행 모드
 :#vs filename  #에 숫자를 넣은 열의 크기 만큼 창이 수직 분할된다. filename을 넣게 되면 해당 파일을 오픈하거나 없으면 새파일을 만든다. 같은 파일에서는 일반모드로 #ctrl-w v 를 치면 #크기 만큼 창이 수직으로 분할된다.  명령행 모드
 :#new filename  #에 넣은 숫자만큼 상하로 창을 수평 분할하여 위쪽에 창에는 새로운 파일을 생성하여 표시한다. 일반모드에서 #ctrl-w n 를 치면 단축키로 사용할 수 있다.   명령행 모드
 :#vnew filename   #에 넣은 숫자만큼 좌우로 창을 수직 분할하여 왼쪽에 창에는 새로운 파일을 생성하여 표시한다.  명령행 모드
 ctrl-w ctrl-방향키
또는 ctrl-w 방향키
또는 ctrl-w ctrl-h,j,k,l (소문자)
 현재 창에서 해당 방향의 창으로 이동할 때 사용된다. 방향키 대신 소문자로 h,j,k,l 키를 사용할 수 있다. 대신 대문자를 사용하면 창을 해당으로 보내게 된다.  일반모드
 ctrl-w ctrl-w
 ctrl-w w
 현재 창에서 오른쪽 방향으로 이동합니다. 오른쪽 끝 창이라면 아래로 내려감.   일반모드
 ctrl-w ctrl-p
 ctrl-w p
 바로 이전에 사용한 창으로 이동.  일반모드
 ctrl-w =  모든 창의 크기를 동일하게 조절  일반모드
 ctrl-w #+  #크기만큼 창의 크기를 키운다. #이 생략되어 있을시에는 1로 판단.  일반모드
 ctrl-w #-   #크기만큼 창의 크기를 줄인다. #이 생략되어 있을시에는 1로 판단.  일반모드


아래의 다양한 크기로 조정된 창들이 수평 수직분할이 되어 있으며 맨 위에는 새로운 파일을 생성해서 다양하게 관리하고 있다.




또한 처음 vim을 시작할 때 여러 파일을 분할하여 창을 열고 싶다면 -o 또는 -O 옵션을 사용하여 열면 된다.
두 창을 상하로 분리하여 사용하고 싶다면 소문자 o를 좌우로 분리해서 사용하고 싶다면 대문자 O를 사용하면 된다.
먼저 위치는 것이 위쪽에 그리고 왼쪽에 위치하게 된다.

ex) vim -o John.txt set.x t.x 를 했을 때의 결과 화면




또한 창 분할의 강력한 기능을 소개하자면 바로 두 개의 파일을 비교하는 기능이다.
vim 을 처음 시작할 때 -d 옵션을 주고 vim -d filename.x filename2.x 와 같이 입력하게 되면 아래와 같이 두개의 수직분할된 창을 열어 서로 다른 내용을 표시해준다. 원본을 놔두고 수정사항을 체킹해야 하거나 디버깅 할 때, 혹은 버젼을 관리해야 할 때 유용하게 사용할 수 있을 것이다.



------------------------------------------------------------------------------------------------------------------------------------

창 분할의 경우는 생성할 수록 창의 크기가 n개의 갯수만큼 분할 되기 때문에 한번에 코드 내용을 많이 보면서 편집할 때는 적절하지 않다.
따라서 여타 편집기와 같이 vim에서는 tab 기능을 제공하는데 마우스가 아닌 모든 것을 키보드로 처리해야 한다. 명령어가 직관적이어서 크게 어렵지 않으니 한번 살펴보자.

 명령어  설명   모드 
 :#tabedit filename
또는 :#tabe filename
 #번째 탭에 filename에 해당 하는 파일을 엽니다. #이 생략되면 현재 열려 있는 탭 바로 뒤에 탭을 생성하여 파일을 엽니다. filename이 생략되면 빈 이름의 파일이 생성됩니다.  명령행 모드
 :#tabnew filename  #번째 탭에 파일을 생성합니다. #이 생략되면 현재 열려 있는 탭 바로 뒤에 탭을 생성하여 파일을 생성합니다. filename이 생략되면 빈 이름의 파일이 생성됩니다.  명령행 모드
 :#tabclose
또는 :#tabc
 #번째 탭의 파일을 닫습니다. #이 생략되면 현재의 탭을 닫습니다.  명령행 모드
 :#tabnext
또는 :#tabn
 #번째 다음 탭을 봅니다. #이 없으면 바로 다음 탭을 엽니다.  명령행 모드
 #gt  #번째 탭을 엽니다. #이 생략되면 바로 다음 탭을 엽니다.  일반 모드
 #ctrl-PageDown  #번째 탭을 엽니다. #이 생략되면 바로 다음 탭을 엽니다.  일반 모드
 :#tabprevious
또는 :#tabp
 #번째 이전 탭을 봅니다. #이 없으면 바로 이전 탭을 엽니다.  명령행 모드
 #gT  #번째 이전 탭을 엽니다. #이 생략되면 바로 이전 탭을 엽니다.  일반 모드
 #ctrl-pageUp  #번째 이전 탭을 엽니다. #이 생략되면 바로 이전 탭을 엽니다.  일반 모드
 :tabmove #
또는 :tabm #
 #번째 탭으로 이동합니다. #이 생략되면 가장 마지막 탭으로 이동합니다.  명령행 모드


아래 그림파일을 보면 t1.x 파일 즉 3번째 탭이 할성화 되어 있다. 또한 파일 명 바로 앞에 + 가 있는 건 수정내용이 있다는 것을 의미한다. 여러 파일을 동시에 열때와 달리 탭을 이용해서 열게 되면 굳이 저장하지 않아도 이동이 가능하다.

창을 분할할 때도 옵션을 줘서 파일을 열었듯이 탭 역시 처음 실행시 옵션을 주면 아래와 같이 탭을 가지고 실행 시킬 수 있다. 옵션은 -p 이다.
ex) vim -p filename.x filename1.x

 




 




반응형
반응형


이전의 내용은 Vim 에디터의 초급 단계의 내용으로 중급 단계로 가기 위한 작은 첫 걸음을 띄기 위해서는 파일 관련 기능을 필히 숙지해야 한다.
물론 파일 관련 기능을 알았다고 해서 중급사용자라고 할 순 없지만 그래도 Vim 에디터를 조금은 사용할 줄 알게 되는 수준은 되는 것 같다.

이번 파일 관련 기능1 에서는 다양하게 파일을 열고 닫는 법에 대해서 알아보도록 하자. 

------------------------------------------------------------------------------------------------------------------------------------

 명령어  설명   모드 
 :e #  추가로 편집하고자 하는 파일 이름 인 #을 넣으면 이전 편집하던 내용을 잠시 놔두고 다른 파일을 편집한다. 없으면 새롭게 생성한다.
대신 이전에 수정하던 파일은 반드시 수정하고 넘어가야 한다. 수정하지 않고 강제로 넘어가면 수정했던 내용은 지워진다.
어떠한 파일을 편집 할 수 있는 한개씩 확인하고 싶다면 tab을 누르면 되고 모두 확인하고 싶다면 ctrl-d 를 누르면 된다. 
 명령행 모드
 ctrl-6 또는 ctrl-^  이전에 편집했던 내용으로 돌아갈때 누르면 된다. 역시 현재 편집했던 내용은 저장하지 않으면 없어진다.  명령행 모드
 vim #1 #2 #3 #4....  vim 에디터는 여러개의 파일을 동시에 열 수 있다. vim 이후에 여러개의 파일명을 공백과 함께 입력하면 동시에 여러개의 파일을 편집할 수 있다.  명령행 모드
 :#n  여러개의 파일을 동시에 오픈했을 때, 현재 편집하던 파일이 아니라 #1 -> #2 로 가고자 할때
:n을 누르면 된다. 한번에 여러개를 건너 띌때는 # 숫자를 기업하면 된다.
ex) :2n 을 입력하면 #1 -> #3 으로 이동함.
 명령행 모드
 :#N  :n이 정방향으로 증가한다면 :#N은 뒤쪽으로 이동한다.
ex) 현재 편집하던 파일이 #4라면 :3N 을 입력하면 #4 -> #1 로 가게 된다.
 명령행 모드
 :qa  여러개의 파일이 열려 있을 때 다른 파일이 편집중이라 닫히지 않을때는 qa를 누르면 모두 닫히게 된다. 혹은 q! 를 눌러서 강제로 종료해도 된다.   명령행 모드
 :w #  #에 해당하는 파일 이름을 저장할 수 있다.
w는 write의 약자로 wrie라고 써도 된다.
 명령행 모드
 :sav #  #에 해당하는 파일을 다른 이름으로 저장한다.
sav는 saveas로 써도 된다.
 명령행 모드
 :up  현재 바뀐 내용만 저장하게 된다. w는 내용이 바뀌던 안 바뀌던 모두 저장하므로 서버에 터미널이 여러개 붙어 있을 과부하를 주게 되는데 up은 상대적으로 적은 과부하를 주게 되어 유리하다.  명령행 모드
 :x  기능은 up 을 한 다음에 q 를 동시에 한 것과 같다. 즉 wq와 같은 기능을 하지만 wq가 upq 와 같은 효과라서 wq보다 효율적인 명령이다. wq보다 x를 사용하기를 추천한다.  명령행 모드


------------------------------------------------------------------------------------------------------------------------------------

여러개의 파일을 동시에 열었을 때 해당 파일들을 동시에 편집하고 관리하는 좀 더 강력한 기능에 대해서 알아보자

 명령어  설명  모드
 :ls
 :buffers
 :files
 현재 열려 있는 파일 목록을 확인한다.  명령행 모드 
 숫자ctrl-6
 :e #숫자
 숫자번째 파일 목록을 연다.   일반모드 
 :0f  현재 파일을 목록에서 제거합니다.
연결된 파일이 있다면 해제하여 이름없음 파일로 바꿉니다. 
 명령행 모드 
 :r  해당파일을 목록에 끼워넣는다.   명령행 모드 
     


또한 비쥬얼 베이직 이나 기타 편집 툴에도 있는 기능에 대해서 소개하겠다.
바로 해당 함수나 헤더파일 등의 정의부로 이동하는 단축키인데, #include<stdio.h>의 경우 stdio.h 파일의 내용을 보고 싶을 때가 있다면 해당 부분에 커서를 옮기고 gf를 눌러보자. 해당 파일의 정의부로 이동할 수 있을 것이다. 물론 :e /usr/include/stdio.h 와 같은 방법으로도 열 수 있지만 좀 더 편리한 단축키 사용법을 알아놔서 나쁠 것 없으니 이 기회에 알아놓자.

 gf   현재 커서 위치의 파일명을 열어준다.
기본적으로 등록된 /usr/include 와 같은 검색 위치를 제외한 추가적인 위치를 등록하고 싶다면 :set path+=경로명을 쳐주거나 .vimrc 파일에 등록해서 사용하면 된다. 
 일반모드
 ctrl-w f   현재 커서 위치의 파일명을 분할된 창에 열어준다.  일반모드
 ctrl-w gf   현재 커서 위치의 파일명을 탭에서 열어준다.  일반모드






반응형
반응형


이전에 Vim 에디터로 편집을 할 때, 굉장히 알고 싶었던 내용이 많았는데 '손에 잡히는 Vim' 서적을 보다보니 알고 싶었던 내용이 제법 있다.
이런 기능만 알아도 엄청나게 빠르게 편집을 할 수 있었는데 예전에 그걸 몰랐다는 사실이 조금 아쉽게 느껴진다.
그렇게 어려운 내용은 아니지만 조금 더 부지런히 찾아보고 공부할 껄 하는 후회가 밀려온다.

하지만 시작이 반이고 가장 늦었다고 할때가 가장 빠르다고 누가 말했던가.
지금이라도 열심히 익혀보자.

------------------------------------------------------------------------------------------------------------------------------------

이번에는 문자열 교체하기에 대해서 알아보자.
크게 내용이 어렵지는 않고 간단하다.

 명령어  설명   모드 
 (범위)s,바뀌어야할 단어,바꿀내용,옵션

ex) 1,$s,man,boy,g
총 4개의 부분을 나뉘어져 있다.
가장 처음에는 문서에서 교체할 범위를 지정하고 s를 그 다음에는 구분자로 ,를 써주고 바꿀단어를 쓴 뒤 구분자를 써준다. 또 바꿀내용 뒤에도 구분자를 쓰고 옵션을 준다.
 
 명령행 모드
 
위의 예시에서 지정된 범위인 1,$ 는 첫 번째 줄에서 마지막행까지 즉 문서 전체인 %를 말한다.
s는 교체 명령어이다. s 다음에 나올 문자는 교체에 사용할 문자로 사용된다.
현재는 s 다음에 ,(콤마)를 사용하겠다고 표시했으며 다른 문자를 사용해도 무방하다.   
저번에 "Vim 에디터에 대해 알아보자 - 1 (기본 입력키2)"에서 간단히 포스핑 했었는데
Vim 에디터에서 사용하는 범위 지정에 쓰이는 특수기호(메타기호)에 대해서 복습해보자.

 .  현재 행을 의미.  메타기호
 $  마지막 행을 의미.  메타기호
 +#  현재 위치에서 #만큼 아래 행을 의미.  메타기호
 -#  현재 위치에서 #만큼 위 행을 으미.  메타기호
 %  문서(파일) 전체를 의미.  메타기호

즉 위의 1,$s,man,boy,g 는 %s,man,boy,g 와 같은 역할을 하게 된다.
매우 직관적으로 판단할 수 있다. 문제는 까먹지 않는게 .... ㅡㅡ

그럼 마지막에 붙는 옵션에 대해서 알아보자.
 옵션  설명   메타기호
 g  범위 내에 검색된 모든(global) 문자열을 교체.   메타기호
 i  대소문자를 무시함.  메타기호
 c  문자열을 교체하기 전 교체 여부를 확인.

y/n/a/q/l/^E/^Y 등의 답변을 해야 한다.
y:yes, n:no, a:all, q:quit, l:line 정도 알아두자.
 메타기호
 e  교체 과정 중 에러를 무시. 에러 표시도 안함.  메타기호

그럼 마지막으로 확인해보자.
%s,man,boy,gcie 이렇게 하면 모든 옵션을 붙여서 문서 전체에 man 문자를 교체하는데 교체할때마다 다 물어봐라 이 뜻이 된다.

------------------------------------------------------------------------------------------------------------------------------------

재미있는 팁

1. 어떠한 문자의 ASCII 코드 값을 알고 싶을 때 굳이 인터넷이나 표를 찾아보지 말고 원하는 문자에 커서를 위치시키고 명령행 모드로 :as를 입력해보자. 10진수 8진수 16진수로 표시할 때의 ASCII 코드 값을 알려준다.

2. 특수문자를 입력하고자 할때 입력모드에서 ctrl-v, V 를 입력하게 되면 특수문자 ^E, ^M ^Y 등을 입력할 수 있다.

반응형
반응형


Vim 에디터에는 문자열 검색기능을 지원한다.
아직은 잘 모르지만 Ctag라는 플러그 인을 사용하면 테크를 검색할 수 있다고 알고 있는데 예전에 선배가 사용하는 것을 보고 뭔가 멋지다라고 생각했던 기억이 난다. 하지만 우선 Vim에 내장되어 있는 간단한 문자열 검색 기능에 대해서 알아보자.


 명령어 설명  모드 
 f#  현재 행에서 문자열 #을 전방으로 검색할때 사용한다. 일반모드 
 F#  현재 행에서 문자열 #을 후방으로 검색할때 사용한다.  일반모드
 t#  현재 행에서 문자열 #을 전방으로 검색한 뒤, 검색어의 한 칸 앞으로 이동한다.  일반모드
 T#  현재 행에서 문자열 #을 후방으로 검색한 뒤, 검색어의 한 칸 뒤로 이동한다.  일반모드
 ;  가장 최근에 검색한 명령을 재 검색한다.  일반모드
 ,  가장 최근에 검색한 명령을 반대 방향으로
재검색한다.
 일반모드
 *  현재 커서가 위치한 곳에 단어를 검색하고 하이라이트 해준다.  일반모드 
/#  # 단어를 검색하고 하이라이트 해준다.  명령행 모드 
n  검색된 단어에서 다음 하이라이트 위치로 이동한다.  일반모드
 검색된 단어에서 반대방향의 하이라이트 된 단어로 이동한다.  일반모드
 /화살표  이전에 검색한 단어내역을 본다.  명령행 모드
 :set hls  검색하는 단어에 하이라이트를 지정한다.
nohls를 하게 되면 하이라이트가 해제된다.
 명령행 모드

------------------------------------------------------------------------------------------------------------------------------------

아래 그림 내용은 명령행 모드에서 /int 로 int 문자열을 가진 모든 부분을 검색해본 경우이다.
원래는 하이라이트가 꺼져 있어서 :set hls 를 사용하여 하이라이트를 줬더니 해당 내용 내에 int 내용은 모두 노란색으로 하이라이트가 표시되어 해당 내용이 어디에 있는지 확인할 수 있다. 이 상태에서 일반모드라면 n 이나 N 을 주면 다음 혹은 이전에 어디에 검색한 문자열이 있는지 커서를 이동시켜줘서 좀 더 편리하게 디버깅 혹은 코드 내용을 검색 할 수 있겠다.






반응형
반응형


Vim 에디터를 사용할 때 기본적으로 사용하는 옵션에 대해서 알아보자.

1. 편집기 좌측에 라인숫자 표시.
2. 편집기 사용시 기본적인 문법 검사.
3. 자동으로 들여쓰기
4. Tab의 크기, 블록 이동시 열의 넓이

 명령어  설명  모드
 :set  현재 에디터에 셋팅된 옵션 목록을 볼 수 있다.
:set all 라고 명령하게 될 때 vim에서 셋팅할 수 있는 모든 옵션의 종류를 볼 수 있다.
 명령행 모드
 :set #  # 써있는 속성을 on 할수 있다. no# 라고 할 경우 해당 속성을 off 시킬 수 있다.
 #! 이라고 할 경우 해당 값이 반전 된다(on/off)
 명령행 모드
 :set #=값  속성중에 특정 값을 갖는 속성들이 있다. #속성들의 특정한 value 값을 대입하기 위해서 사용한다.  명령행 모드

해당 옵션 값을 설정할 때 앞에 :set을 붙여야 한다.
ex) :set nu

 nu 또는 number  화면에 라인의 숫자를 표시한다.   명령행 모드
 ai 또는 autoindent  자동 들여쓰기를 쓴다. (sw로 설정한 값으로)   명령행 모드
 cindent  C언어 스타일의 들여쓰기를 사용.
(sw로 설정한 값으로)
  명령행 모드
 ts=값 또는 tablestop=값  탭(Tab) 크기를 지정하는 값으로 지정한다.   명령행 모드
 sw=값 또는 shiftwidth=값  블록 이동시 지정하는 열의 너비.   명령행 모드

해당 옵션을 셋팅할 때는 :set을 붙이지 않는다.
 :syntax enable  문법검사를 실시한다. (지정된 색깔테마로)  명령행 모드
 :syntax clear  문법검사를 해제한다.  명령행 모드
 :colorscheme  에디터에 색깔 테마를 지정한다.  명령행 모드

------------------------------------------------------------------------------------------------------------------------------------


아래의 그림 파일은 색깔 테마와 문법 검사 그리고 행 표시를 하지 않은 경우이다.




:set nu     (라인 표시)
:syntax enable     (문법 검사 on)
:colorscheme default      (색깔 테마 on)
(참고로 색깔 테마는 16가지 정도가 더 있으므로 colorscheme라고 친 뒤 한 칸을 띄고 ctrl+D를 치면 셋팅 가능한 다른내역을 확인할 수 있다)

를 한 뒤 확인해 보면 아래 문법이 틀린 부분은 색깔이 다르게 표시되거나 강조가 되어 있어서 편집과 동시에 확인할 수 있다.
또한 화면 좌측에 라인에 행별로 라인의 숫자가 표시 된 것을 확인 할 수 있다. 우분투의 경우 syntax와 colorscheme가 기본적으로 셋팅되어 있으니 별도로 셋팅해주지 않아도 괜찮다. 하지만 만약에 꺼져 있을 때 아래의 옵션 셋팅 내용을 기억해 두자.



또한 편집하다가 대괄호를 치고 Enter 키를 치면 행의 처음으로 돌아가게 때문에 자동으로 들여쓰기 등을 옵션으로 셋팅해놓으면 좀 더 편리하게 편집할 수 있다. 또한 그 값도 적당하게 조절해 놓으면 좀 더 손쉽고 편리하게 자신에게 최적화 하여 편집할 수 있게 된다.
이번에는 tablestop(ts) 값과 shiftwidth(sw) 값을 조정하면 어떻게 변화하는지 확인해보면

:set sw=20       (들여쓰기 값 20)
:set ts=2         (탭 크기 2)
:set cindent    (C언어 스타일의 들여쓰기)

일부로 printf 문만 들여쓰기로 하고 나머지는 tab으로 진행해 보았다. int나 for의 경우는 왼쪽 끝과 2칸 정도 밖에 차이나지 않지만 printf문 이후로는 엔터를 쳐서 들여쓰기를 했더니 중괄호로 부터 20의 넓이만큼 벌어져 있는 것을 확인할 수 있다.




:set 을 치면 현재 편집기에 셋팅된 옵션 내용을 확인 할 수 있는데
현재 확인해보면
cindent
tabstop=2
syntax=c
shiftwidth=20
등이 셋팅 되어 있는 것을 확인 할 수 있겠다.



------------------------------------------------------------------------------------------------------------------------------------
그럼 이렇게 편집기를 열때마다 해당 내역을 저장해야 하는가?
다행이 vim 에디터는 처음 실행될때 자신의 홈디렉토리에 .vimrc 파일을 로드하여 기록되어 있는 내용을 먼저 로드한다.
따라서 내가 항상 위의 내역을 저장해 놓고 사용하고 싶다면. 자신의 홈디렉토리로 가서 .vimrc 파일을 생성(혹은 수정)하여 위의 내용을 기록해서 사용하면 된다.

주의할 사항은 콜론은 사용하면 안됀다. 아래와 같이 셋팅하여 사용하면 되겠다.
파일명은 .vimrc 이다.   . 을 빼먹으면 안됀다.


 

반응형
반응형

------------------

알아두면 더욱 편리한 Vim 에디터 기본 입력키 2번째.
Advanced.


 명령어  설명 모드 
 ^  행의 맨 처음으로 이동 하지만 공백은 제외.  일반모드
 Home키  행의 맨 처음으로 이동.  일반모드
 $  행의 맨 끝으로 이동 (End 키와 같음).  일반모드
 ctrl + B  위로 한 화면 스크롤(PageUP키와 같음).  일반모드
 ctrl + F  아래로 한 화면 스크롤(PageDown키와 같음).  일반모드
 ctrl + U  위로 1/2 화면 스크롤.  일반모드
 ctrl + D  아래로 1/2 화면 스크롤.  일반모드
 #gg  #행으로 이동. 없을 시 맨 처음으로 이동.  일반모드
 #G  #행으로 이동. 맨 마지막으로 이동.  일반모드
 :#  #행으로 이동.  명령행 모드
 ctrl - G, g  현재 문서의 위치정보를 하단에 표시.  일반모드
 :d  현재 행을 잘라내기.  명령행 모드 
 D  현재 위치에서 현 행의 끝부분까지 잘라내기  일반모드
 J  아래 행을 현재 행의 끝에 붙임.
(아래행의 공백은 무시)
 일반모드
 :pu  p와 같은 기능. 현재 행에 붙여넣기.  명령행 모드
 P  현재 행 위에 붙여넣기.  일반모드
 :y  현재 행을 레지스터에 복사.  명령행 모드
 Y  현재 행을 레지스터에 복사.  일반모드
     


범위 지정에 사용하는 특수 기호와 사용법
 .  현재 행.  메타 문자
 $  마지막 행.  메타 문자
 %  문서 전체.  메타 문자
 +#  현재 위치에서 #만큼 아래 행을 의미.  메타 문자
 -#  현재 위치에서 #만큰 위의 행을 의미.  메타 문자
 :10, 25d  10행에서 25행까지 잘라내기.  명령행 모드
 :%y  문서 전체 복사. (%는 1,$와 동일하다)  명령행 모드
 :.,+20y  현재 행부터 아래로 20행을 복사.  명령행 모드
 :-10,+5d  현재 행부터 위로 10행, 아래로 5행 삭제.   명령행 모드
 :40pu  40번 행에서 레지스터의 내용을 붙여넣기.   명령행 모드

 v  일반 비주얼 모드로 현재 커서 위치에서 블록을 지정.  일반 모드
 V  비주얼 라인 모드. 현재 커서가 위치한 행에서 행 단위로 블록을 지정.  일반 모드
 ctrl-V  비주얼 블록 모드로, 열(Column) 단위로 블록을 지정. ctrl-Q로 대신 할 수 있음.  일반 모드



반응형

+ Recent posts