반응형

출처 : http://blog.naver.com/dalmagru?Redirect=Log&logNo=70068719762

 

wait(), waitpid() : 부모 프로세스가 자식 프로세스가 종료했음을 확인하는 함수.

waitpid() : 인자로 프로세스ID를 받음으로써 특정 자식 프로세스의 종료를 기다릴수 있다.

 

함수원형

#include <sys/types.h>
#include <sys/wait.h>

pid_t wait(int *status);
pid_t waitpid(pid_t pid, int *status, int options);

 


※ 자식 프로세스의 상태를 확인하는 매크로들

매크로

세부사항

WIFEXITED(status)

0이 아닌 값을 리턴하면 자식프로세스가 정상종료했다는 뜻이다.

WEXITSTATUS(status)

WIFEXITED(status)매크로를 통하여 자식 프로세스가 정상종료했음을 확인하면 이 매크로를 통하여 종료 코드를 확인할 수 있다. 이 종료 코드는 exit()나 _exit()에서 인자로 주는 값을 말한다. 즉 exit(0)으로 프로그램을 종료했다면 이 0 값이 WIFEXITED 매크로로 알수 있다. 단, 이 매크로는 하위 8비트 값만을 확인하므로 0부터 255까지의 값까지 확인할 수 있다.

WIFSIGNALED(status)

이 매크로가 참이라면 자식 프로세스가 비정상 종료했다는 뜻.

WTERMSIG(status)

SIFSIGNALED(status)매크로가 참일 경우 자식 프로세스를 종료시킨 시그널 번호를 얻는 매크로

WIFSTOPPED(status)

이 매크로가 참이면 자식 프로세스는 현재 멈춰있는(stopped) 상태이다. 다음에서 살펴볼 option인자에 WUNTRACED옵션이 설정되어 있는 경우 자식 프로세스의 멈춤 상태를 알아낼수 있다.

WSTOPSIG(status)

WIFSTOPPED(status)매크로가 참일 경우 자식 프로세스를 멈춤상태로 만든 시그널번호를 얻는다.

WCOREDUMP(status)

시스템에 따라서는 WIFSIGNALED(status)가 참일 경우 자식 프로세스가 core덤프 파일을 생성했는지를 확인하는 이 매크로를 제공해주기도 한다.

 

 

waitpid()에서 사용하는 pid인자값의 의미

pid의 값

세부사항

pid < -1

pid의 절대값과 동일한 프로세스 그룹ID의 모든 자식 프로세스의 종료를 기다린다.

pid == -1

모든 자식 프로세스의 종료를 기다린다.
만약 pid값이 -1이면 waitpid함수는 wait()함수와 동일하다.

pid == 0

현재 프로세스의 프로세스 그룹ID와 같은 프로세스 그룹ID를 가지는 모든 자식 프로세스의 종료를 기다린다.

pid > 0

pid값에 해당하는 프로세스 ID를 가진 자식 프로세스의 종료를 기다린다.

 

 

waitpid()에서 사용하는 option인자

인자

인자의 의미

WNOHANG

waitpid()를 실행했을 때, 자식 프로세스가 종료되어 있지 않으면 블록상태가 되지 않고 바로 리턴하게 해준다.

WUNTRACED

pid에 해당하는 자식 프로세스가 멈춤 상태일 경우 그 상태를 리턴한다.
즉 프로세스의 종료뿐 아니라 프로세스의 멈춤상태도 찾아낸다.

 

좀비 프로세스 (zombie process) : 자식 프로세스가 종료되었지만, 부모 프로세스가 아직 그 종료를 확인하지 않는 프로세스

고아 프로세스 : 자식보다 먼저 부모프로세스가 죽었을 경우의 자식 프로세스.

[출처] wait(), waitpid()|작성자 달마

 

반응형
반응형

이번엔 AIX... Thread Dump 분석 방법이다.

최근에 발견한 최고의 포스팅.

 

http://blog.naver.com/bumsukoh/110114573021

 

 

안녕하세요. 이번에는 AIX에서 제공하는 Thread 모니터링 관련 툴을 소개하겠습니다.

AIX에서 가장 유용하게 사용할 수 있는 프로세스와 Thread 모니터링 툴로는 ps 명령어입니다.

"왠 ps 명령어 !" 라고 하실 수 있을텐데요.

 

사실 ps 명령어는 생각보다 굉장히 많은 정보를 제공하고 있습니다. man page를 보시면 더욱 실남나게 느기실텐데요.

그래도 ps 하면 가장 많이 사용하는 명령어가 "ps -ef" 정도겠죠.

 

AIX에서는 ps 명령어를 통해 Thread 레벨의 정보를 확인할 수 있는 기능을 제공합니다.

Solaris의 prstat이나 HP-UX의 glance처럼 막강하지는 않지만 나름대로 프로세스의 Thread레벨에 대한 정보를 확인하는데는 유용하게 사용하실 수 있습니다.

 

ps를 통한 Thread 레벨 모니터링 방법은 다음과 같습니다.

# ps -mp [프로세스 IDs] -o THREAD

ps 명령어는 다들 잘 아실테니 옵션부분만 설명하도록 하겠습니다.

- "m" 은 프로세스 뿐만 아니라 Kernel Thread에 대한 리스트를 출력합니다.

"-o" 옵션과 같이 사용하면 다양한 정보를 출력할 수 있습니다.

- "p" 는 프로세스 ID를 설정합니다. ","를 사용하여 여러개의 프로세스 ID를 지정할 수 있습니다.

- "o" 는 Format 지정을 지정합니다. Thread는 "THREAD"로 지정합니다.

다음은 ps -mp 명령어의 출력 결과 예입니다.

 

 

위와 같이 프로세스의 전체 정보와 그 밑으로 Thread 별(TID)로 정보가 출력됩니다.

구분 설명
TID Kernel thread ID for threads
ST The state of the process or kernel thread
CP The CPU utilization of the process or kernel thread
PRI The priority of the process or kernel thread
SC The suspend count of the process or kernel thread

그외 WCHAN, F, TT, BND, COMMA 정보가 있습니다.

자세한 사항은 ps man page나 메뉴얼을 참조하시기 바랍니다.

명령어 결과에서 Thread 상태 항목인 "ST" 부분과 CPU 사용율 항목인 "CP" 부분, 그리고 Thread의 Suspend 횟수 항목인 "SC" 부분을 주의깊게 볼 필요가 있습니다. 그 이유는 성능에 관련된 항목들이기 때문입니다.

위의 항목 중 Thread 상태 항목인 "ST" 부분에는 다음과 같은 상태 코드가 있습니다.

 

- "O" 는 Nonexistent 상태입니다.

- "R" 은 Running 상태입니다.

- "S" 는 Sleeping 상태입니다.

- "W" 는 Swapped 상태입니다.

- "Z" 는 Canceled 상태입니다.

- "T" 는 Stopped 상태입니다.

Java 프로세스의 경우 대부분이 "R" 또는 "S" 상태입니다.

TID(Thread ID)는 Java Thread dump 분석 시 Java Thread와 매핑하기 위한 key가 됩니다.

이 부분은 차후에 Thread dump 분석 시 설명드리도록 하겠습니다.

그 다음으로는 Solaris와 HP-UX에서 살펴보았던 pstack과 유사한 procstack 명령어입니다.

procstack 은 Solaris와 HP-UX에서 프로세스의 Native Stack을 확인할 수 있듯이 AIX에서 프로세스의 Native Stack을 확인하기 위한 명령어 입니다.

Solaris와 HP-UX에서는 p로 시작하는 프로세스 명령어 대신 AIX에서는 proc로 시작하는 프로세스 명령어가 있습니다. 두 종류가 거의 비슷한 기능을 제공합니다.

자세한 사항은 다음 포스트를 참고하시면 됩니다. (http://blog.naver.com/bumsukoh/110098535739)

명령어 사용법은 다음과 같습니다.

 

# procstack [프로세스 ID]

 

출력 결과는 다음과 같습니다.

 

위와 같이 JVM을 구현한 Native Stack 입니다. Java 1.6(64bit) 버전의 Jeus 서버에 대한 Thread Native Stack 입니다.

각 Thread 별로 tid와 pthread id 에 대한 내용이 출력되며, 여기서의 tid는 위에서 "ps -mp"의 TID와 동일한 값을 나타냅니다.

 

"ps -mp"의 모니터링 결과 CPU 점유가 높은 Thread에 대해 procstack으로 Native Stack 확인이 가능하게 됩니다. 물론 Java 프로세스의 경우 procstack으로 Java Stack 확인이 불가능하지만 그런데로 도움은 됩니다. 그 이후에 필요하다면 Thread dump(javacore 파일)을 생성하여 Java Stack을 확인할 수 있습니다.

 

위의 Native Stack은 모두 Java의 SocketInputStream의 socketread() 부분에서 대기중(상태"SLEEP")이며, 최종 Native Stack은 poll() 함수인 것을 알 수 있습니다.

 

poll()함수는 Thread를 즉시 "SLEEP"시키고 해당 STREAM(파일 FD)에서 Data input event가 감지되면 Thread를 wake-up시켜 데이터를 처리할 수 있도록하는 기능을 하는 함수입니다.

 

즉, Java의 socket read는 내부적으로 poll() 함수로 구현되었다는것을 알 수 있는 부분입니다.

그 외에 프로세스에 대한 degugging을 위한 dbx나 프로파일 툴인 tprof등을 사용할 수 있습니다.

프로파일 툴인 tprof는 java 기반(java stack 제공)의 프로파일을 할 수 있어 전문적인 프로파일링 툴이 없을 경우 유용하게 사용할 수 있습니다. (tprof 참고 : http://blog.naver.com/bumsukoh/110104594318)

 

이것으로 AIX에서 유용하게 사용할 수 있는 Thread 관련 명령어에 대해 알아 보았습니다.

다음 포스트에서는 본격적으로 Thread dump에 대한 내용을 설명드리도록 하겠습니다.

어제 엄청난 호우로 많은 지역이 피해를 입은 것 같습니다. 저도 어제 비와 천둥소리로 잠을 설칠 정도 였습니다. 모두들 호우에 피해를 입지 않도록 각별히 신경 쓰셔야 할 것같습니다.

그럼 이만.. 다음에 뵙겠습니다.

 

반응형

'OS > AIX::' 카테고리의 다른 글

AIX의 2가지의 프로그래밍 모델  (0) 2014.01.09
AIX 컴파일 정보 2  (0) 2012.12.05
AIX 라이브러리 버전 확인  (0) 2012.07.12
AIX 컴파일 정보  (0) 2011.10.05
AIX malloc - free 시 혹은 new - delete 시의 메모리 반환  (0) 2011.08.21
반응형

너무 좋은 글들... 최근 dump 분석 때문에 골머리 썩고 있었는데 완전 딱 맞는 자료를 발견했다...

 

 

http://blog.naver.com/bumsukoh/110114008655

 

 

이번 포스트에서는 Thread dump를 분석하기 전에 Thread들에 대한 정보를 확인하기 위한 유용한 OS 툴들에 대한 내용을 다루어 보겠습니다.

각 OS별로 프로세스 및 Thread 레벨로 상태를 확인하기 위한 명령어들을 제공합니다. 멀티 Thread 기반으로 운영체제들이 변해가면서 제공하는 기능들이 생겨나게 되었습니다.

 

여기서 설명드리는 OS 툴들은 모두 프로세스에 대한 Native Stack 정보를 출력하는 것입니다.

물론 java stack을 볼 수 없지만 문제가 발생한 Thread에 대한 Native Stack 및 Thread ID를 확인할 수 있습니다. 일부 Java Thread dump에서는 Native Thread ID를 통해 해당 Thread를 찾기도 합니다.

첫번째로 Solaris에서 제공하는 명령어에 대해 알아 보겠습니다.

 

Solaris에서 가장 유용하게 사용할 수 있는 프로세스와 Thread 모니터링 툴로는 prstat 이 있습니다.

prstat은 생각보다 굉장히 강력한 기능을 가지고 있습니다. 프로세스와 Thread의 CPU 자원 사용율 및 메모리 사용율을 알 수 있지만, CPU 사용율에 대한 microstat 정보를 확인 할 수 있어 굉장히 유용합니다.

 

저의 경우 이 prstat의 microstat정보를 유용하게 활용하여 시스템의 CPU 자원 사용의 문제점을 확인하고 디버깅한 경험이 있습니다.

prstat 명령어 사용법은 다음과 같습니다.

 

# prstat -L -m -p [프로세스 ID] [refresh interval]

옵션은 다음과 같습니다.

 

- "-L" 은 Thread 레벨의 정보를 출력합니다.

- "-m" 은 microstat 정보를 출력합니다.

- "-p" 은 모니터링할 프로세스 ID입니다.

- "refresh interval" 은 모니터링 정보 갱신 주기입니다.

 

다음은 prstat 출력 결과 예입니다.

==============================================================================================

PID USERNAME USR SYS TRP TFL DFL LCK SLP LAT VCX ICX SCL SIG PROCESS/LWPID

----------------------------------------------------------------------------------------
24565 mspbpp 0.8 0.1 0.0 0.0 0.0 0.0 99 0.2 198 1 198 0 java/14
24565 mspbpp 0.8 0.1 0.0 0.0 0.0 0.0 99 0.2 198 1 198 0 java/19
24565 mspbpp 0.4 0.1 0.0 0.0 0.0 0.0 99 0.2 198 0 198 0 java/15
24565 mspbpp 0.4 0.1 0.0 0.0 0.0 0.0 99 0.2 198 0 198 0 java/21
24565 mspbpp 0.4 0.1 0.0 0.0 0.0 0.0 99 0.2 198 0 198 0 java/24
24565 mspbpp 0.1 0.0 0.0 0.0 0.0 100 0.0 0.0 2 0 3 0 java/2
24565 mspbpp 0.0 0.0 0.0 0.0 0.0 0.0 100 0.0 39 0 39 0 java/8
24565 mspbpp 0.0 0.0 0.0 0.0 0.0 0.0 100 0.0 2 0 4 0 java/9
24565 mspbpp 0.0 0.0 0.0 0.0 0.0 0.0 100 0.0 0 0 0 0 java/13
24565 mspbpp 0.0 0.0 0.0 0.0 0.0 0.0 100 0.0 0 0 0 0 java/12
24565 mspbpp 0.0 0.0 0.0 0.0 0.0 0.0 100 0.0 0 0 0 0 java/11
24565 mspbpp 0.0 0.0 0.0 0.0 0.0 0.0 100 0.0 0 0 0 0 java/10
24565 mspbpp 0.0 0.0 0.0 0.0 0.0 100 0.0 0.0 0 0 0 0 java/7
24565 mspbpp 0.0 0.0 0.0 0.0 0.0 100 0.0 0.0 0 0 0 0 java/6
24565 mspbpp 0.0 0.0 0.0 0.0 0.0 100 0.0 0.0 0 0 0 0 java/5
Total: 1 processes, 26 lwps, load averages: 0.15, 0.15, 0.14

==============================================================================================

위와 같이 프로세스의 Thread별(LWPID)로 CPU 사용에 대한 상세 정보가 출력됩니다.

다음은 prstat의 수행 결과 항목입니다. (여기서는 CPU에 대한 항목 만 설명합니다.)

구분 설명
USER The percentage of time the process has spent in user mode.
SYS The percentage of time the process has spent in system mode.
LCK The percentage of time the process has spent waiting for user locks.
SLP The percentage of time the process has spent sleeping.
LAT The percentage of time the process has spent waiting for CPU.

이외 TRP, TFL, DFL, VCX, ICX, SCL, SIG 정보가 있습니다.

위의 결과 내용을 추출하여 분석한 결과 그래프(예시)를 살펴 보도록 하겠습니다.

이 그래프는 동일한 어플리케이션에 대해 사용자 수를 높이며 CPU 자원에 대한 사용 추이입니다.

눈여겨 볼 부분은 사용자가 많아 질 수록 SLP와 LCK 부분이 낮아 지며 LAT 부분이 높아 지는 것을 알 수 있습니다. 즉 사용자 량이 많아 처리량이 많아 질수록 초기에 LCK인 user locks (Java에서 object block이겠죠)과 SLP인 sleep (이 sleep도 대기상태입니다)이 높았다가 점점 낮아 집니다. 이는 Thread들이 일을 쉬지않고 열심히 더 하고 있다는 말이겠죠. 그러다 보니 LAT (CPU 할당 대기)가 점점 높아 지게 되는 것입니다.

여기에서 해당 시스템의 총 사용가능한 사용자에 대한 수치를 알 수 있습니다. 사실 이 작업을 할때는 패키지 제품에서 CPU 과부하가 있다는 것을 보여주기 위해 한것입니다. 결론적으로는 패키지의 CPU 과부하 버그를 조치한 경우입니다.

이렇게 prstat은 유용하게 사용할 수 있는 Solaris의 툴입니다.

그 다음으로는 pstack 명령어입니다.

pstack 명령어는 Solaris에서 프로세스의 Native Stack을 확인 할 수 있는 명령어입니다.(HP-UX에서도 사용합니다.)

이 pstack은 Native Stack (C 코드)만 확인 할 수 있습니다. java stack 에 대한 내용을 확인이 불가능하죠. 아예 나오지 않습니다. (Java 버전 1.5 이상에서는 pstack하고 유사한 jstack이라는 명령어가 제공됩니다. java stack을 Thread dump 없이 볼 수 있답니다.)

이러한 pstack은 JVM 내부의 흐름을 파악하기 위한 방법으로 유용하며, JVM의 Bug 같은 경우를 확인할 때 사용되기도 합니다.(사용되는 빈도는 극히 드물지만요..)

 

명령어 사용법은 다음과 같습니다.

 

# pstack [프로세스 ID]

 

출력 결과는 다음과 같습니다.

=============================================================================================

----------------- lwp# 25 / thread# 25 --------------------
ff2cc7f4 lwp_cond_wait (189b848, 189b830, 0, 0)
feb54b78 __1cCosNPlatformEventEpark6M_v_ (189b830, 45754, fed35879, 7c400, 189b800, fee069ec) + 108
fe5df09c __1cNObjectMonitorGEnterI6MpnGThread__v_ (323df0, 230c00, 323e00, fedb2000, 323e00, 1) + 1cc
fe53879c __1cNObjectMonitorFenter6MpnGThread__v_ (323df0, 230c00, 230c00, 2, 18a4678, 230e78) + 358
fec03c60 __1cSObjectSynchronizerKfast_enter6FnGHandle_pnJBasicLock_bpnGThread__v_ (ddbff834, ddbff908, 1, 230c00, 34800, d6a244) + a4
febad568 __1cNSharedRuntimebAcomplete_monitor_locking_C6FpnHoopDesc_pnJBasicLock_pnKJavaThread__v_ (ec450a70, ddbff908, 230c00, fede68e1, 6, fedb2000) + dc
fc055754 * weblogic/socket/SocketMuxer.readReadySocketOnce(Lweblogic/socket/MuxableSocket;Lweblogic/socket/SocketInfo;)Z+337 (line 1954)
fc63b53c * *weblogic/socket/DevPollSocketMuxer.processSockets()V [compiled] +12 (line 184)
fc005868 * weblogic/socket/SocketReaderRequest.run()V+3 (line 58)
fc005868 * weblogic/socket/SocketReaderRequest.execute(Lweblogic/kernel/ExecuteThread;)V+1 (line 84)
fc005d88 * weblogic/kernel/ExecuteThread.execute(Lweblogic/kernel/ExecuteRequest;)V+19 (line 288)
fc005868 * weblogic/kernel/ExecuteThread.run()V+32 (line 224)
fc00021c * StubRoutines (1)
fe561bdc __1cJJavaCallsLcall_helper6FpnJJavaValue_pnMmethodHandle_pnRJavaCallArguments_pnGThread__v_ (fc0001c0, 230c00, 1, d6a230, e11c6fd8, ddbffe78) + 208
fe90aebc __1cJJavaCallsMcall_virtual6FpnJJavaValue_nLKlassHandle_nMsymbolHandle_4pnRJavaCallArguments_pnGThread__v_ (ddbffe70, d6a234, fee07100, d6a240, ddbffda0, 230c00) + ec
fe5f0adc __1cJJavaCallsMcall_virtual6FpnJJavaValue_nGHandle_nLKlassHandle_nMsymbolHandle_5pnGThread__v_ (d6a234, ddbffe6c, ddbffe68, ddbffe64, ddbffe60, fee07100) + 6c
fe603350 __1cMthread_entry6FpnKJavaThread_pnGThread__v_ (dfc33688, 230c00, 54c00, fee07434, fee07100, fee06dd4) + 110
fec2318c __1cKJavaThreadRthread_main_inner6M_v_ (230c00, 16, fedee064, 19, fedb2000, 0) + 48
feb4ccbc java_start (230c00, 234e, fedb2000, fed33c51, 18a4678, fee02a2c) + 22c
ff2c8a20 _lwp_start (0, 0, 0, 0, 0, 0)

=============================================================================================

위와 같이 JVM을 구현한 Native Stack 입니다. Java 1.6 버전상의 Weblogic 10g에 대한 Thread Native Stack입니다.

lwp# 25 / thread# 25 는 Thread의 ID입니다. lwp는 Light Weight Process라 하여 경량의 프로세스라 하여 Thread에 대한 통칭입니다.

이 Thread ID는 이후에 설명드릴 Thread dump에서 thread와 매핑할 수 있는 key가 됩니다.

 

위의 Thread Stack에서는 Weblogic Executor Thread에서 사용자 요청을 받기 위해 대기중인 것을 알 수있습니다. 그래서 stack의 최종 frame은 "lwp_cond_wait (189b848, 189b830, 0, 0)" 입니다.

그 외에 프로세스 debug를 위한 dbx 나 Solaris의 막강 프로파일 툴인 Dtrace등을 활용할 수 있으나, 굉장히 advanced한 내용으로 많은 지식을 필요로 합니다.

 

대부분은 위의 내용정도만 아셔도 트러블슈팅하는데 많은 도움이 됩니다.

다음 포스트에서는 "OS 툴을 잘 활용하라 !" HP-UX 에 대해 설명드리도록 하겠습니다.

장마가 끝나니 날씨가 장난이 아니네요. 다시 장마시즌이 점점 그리워지는건 왜일까요 ^^

몸 건강들 하시고 다음 포스트에서 뵙겠습니다.

그럼 이만

 

반응형
반응형

살펴보다가 너무 좋은 자료가 있어서 퍼왔다..

출처 : http://blog.naver.com/bumsukoh/110114572973

 

 

 

이전 포스트에 이어 프로세스 Thread 정보를 확인하기 위한 OS 명령어 활용법 그 두번째로 HP-UX에서 제공하는 명령어에 대해 알아 보도록 하겠습니다.

 

HP-UX에서는 glance로 프로세스에 대한 모든 것을 볼 수 있습니다.

glance 툴은 굉장히 많은 유용한 정보를 제공합니다. 우선 시스템에 대한 전반적인 상태 정보, 프로세스 정보, 네트웍, DISK, 메모리등등.. HP-UX 시스템에 대한 거의 모든 것을 모니터링 할 수 있는 툴이라 할 수 있습니다.

glance에서 java 프로세스와 관련하여 보아야할 주요항목이 프로세스와 프로세스의 Thread, 프로세스 메모리 정보들입니다.

Solaris prstat의 microstat 정보만큼은 아니지만 THREAD에 대한 각종 CPU 사용 정보(System, User, Cswitch, Interrupt, Nice, Nnice, Normal등)를 제공합니다.

 

이러한 glance는 text 모드와 gui 모드, 그리고 advisor 모드를 제공합니다.

터미널에서 바로 사용할 수 있는 text 모드가 가장 많이 사용됩니다. gui 모드는 X-Window 환경에서 사용하며 여러가지 정보를 각각의 창에서 볼 수 있다는 장점이 있습니다. advisor 모드는 필요한 정보를 특정 시간동안 일정한 간격으로 정보를 남길수 있습니다. advisor 모드는 "HP-UX Glance advisor를 통한 CPU 자원 모니터링 방법" (http://blog.naver.com/bumsukoh/110107086979) 포스트를 참조하시면 될 것 같습니다.

glance 명령어 사용법은 다음과 같습니다.

 

# glance -j [갱신간격(초)]

 

저는 개인적으로 "-j" 옵션을 선호합니다. 갱신 간격이 기본이 5초여서 신속한 정보를 보기가 힘든점이 있어 저는 "glance -j 1" 를 통해 1초 마다 갱신하도록 하여 모니터링합니다.

 

그럼 glance의 프로세스 정보와 Thread 정보를 확인하는 방법에 대해 설명하겠습니다.

=========================================================================================

다음은 glance를 수행 시 첫화면입니다.

 

상단에 전체적인 시스템 사용율 정보(CPU, Memory, Disk, Network등)가 나옵니다.

그리고 그 아래에 각 프로세스들에 대한 리스트와 간략한 CPU. Memory, Block 정보들이 나오게됩니다(다른 프로세스명과 User ID는 일부러 삭제했습니다.). 여기서는 java 프로세스(pid 9852)에 대한 모니터링을 설명하도록 하겠습니다.

 

자 그럼 해당 프로세스에 대한 상세 모니터링을 위해 "S" key를 누르고 프로세스 ID를 입력합니다.

 

그러면 위와 같이 해당 프로세스에 대한 상세정보가 출력됩니다.

보시면 아시겠지만 프로세스에 대한 다양한 정보들이 쭉 출력됩니다. 이러한 정보 중에서 다양한 CPU사용율정보(User, System, Interrupt 등), Memory 사용율 정보(RSS/VSS, Fault 등), Wait Reason 등의 정보를 눈여겨 보시면 좋을것 같습니다. 우선은 수치가 높은 부분은 확인을 해 볼 필요가 있겠죠.

 

그럼 여기서 각 Thread에 대한 정보를 확인 하기 위해 "G" key를 누릅니다.

위와 같이 각 Thread에 대한 리스트와 함께 CPU, I/O, Priority, Block 정보를 볼 수가 있습니다.

 

CPU의 경우 현재 사용율과 누적 사용율을 보실 수가 있습니다. 아무래도 누적 사용율이 높으면 일을 많이 하는 Thread라고 판단할 수 있습니다. 그럼 해당 Thread가 무엇인지 확인할 필요가 있습니다. 이렇때 Thread dump를 통해 TID와 매핑하여 확인할 수 있습니다.

위의 그림에서는 6949836 TID가 현재 CPU 사용을 많이 하고 있으며, CPU Time 누적치도 높게 보여집니다. 참고로 CPU Util과 CPU Time의 의미는 다음과 같습니다.

- CPU Util은 해당 모니터링 시간(glance interval이 3초라면 3초동안)동안 해당 Thread가 사용한 전체 CPU 용량(100 * CORE수의 %)에 대한 비율입니다.

- CPU Time은 해당 Thread가 실제로 CPU를 점유한 시간입니다. 보통 CPU의 Scheduling 시간(보통 1 tick이라함)이 10ms이므로 Thread가 한번에 점유할 수 있는 최대 시간은 10ms라고 볼 수 있습니다. 우선순위가 높은 Thread의 경우 CPU 점유 시간이 높을 수 밖에 없겠죠.

 

더욱 상세한 Thread 정보를 보기 위해서는 "I" key를 누르고 TID를 입력합니다.

위와 같이 해당 TID의 Thread에 대한 상세 정보가 출력됩니다. 프로세스의 상세정보 부분과 거의 유사한 정보들이 출력됩니다.

 

이렇게 glance를 통해 프로세스에 대한 전반적인 모니터링 방법에 대해 알아 보았습니다.

많은 분들이 glance 라는 툴은 잘아시는데 사용법, 특히 화면 key에 대한 부분을 잘 모르시더라고요.

저도 이러한 key를 모두 알고 있지는 않습니다. 대신 key help 화면을 위한 key는 꼭 기억하고 있습니다.^^ 화면에서 "h" key를 누르게 되면 다음과

같은 help 화면을 보실 수 있습니다.

 

 

help key만 알고있으며 필요시 key를 확인하며 사용해도 아무 지장이 없습니다.

추가적으로 프로세스에 대한 Memory 정보와 Open File정보, System call 정보에 대한 화면을 보여드리도록 하겠습니다.

 

- Memory 정보

 

프로세스에 할당된 메모리 block들에 대한 메모리 Type, 참조계수, RSS, VSS, 할당 File명등에 대한 정보를 확인하실 수 있으며, 아래에는 프로세스에 대한 유형별(Text, Data, Stack, Shared, Other) 전체적인 사용량이 출력됩니다.

- Open File 정보

 

프로세스가 Open한 FD(File Descriptor)에 대한 정보가 출력됩니다. 실제 File의 경로와 파일명이 잘 출력되지 않지만 Volumne과 inode정보가 있어 파일을 찾는(find -inum 명령 사용)데는 문제가 없습니다.

- System call 정보

 

프로세스가 수행시킨 System call 함수에 대한 항목과 그에 대한 정보들입니다.

위에서는 횟수로는 gettimeofday() 함수가 가장 많이 호출되었으며, Elapsed Time은 ksleep() 함수인것을 알 수 있습니다.

해당 프로세스가 시간과 관련된 내용을 많이 처리하는 프로세스인 것을 알 수 있으며, 이 부분이 염려할 수준은 아닌것으로 보여집니다. ksleep()은 프로세스가 SLEEP으로 빠지게 되면 호출되는 함수로 CPU JOB만 수행하는 프로세스는 아니며, I/O등의 BLOCK(임의적일수도 있음)으로 인해 SLEEP으로 빠지는 경우가 있는 것으로 보여집니다.

 

=========================================================================================

위와 같이 glance를 사용하면 프로세스에 대해 OS가 제공하는 거의 모든 정보를 모니터링 가능합니다.

참고로 glance는 HP-UX의 kernel trace 정보를 활용하여 보여줌으로 굉장히 막강한 기능을 제공합니다.

kernel trace를 위해 caliper나 ktrace등으로 별도로 하지 않아도 어느 정도의 정보는 제공하게 되며 이러한 정보는 시스템을 튜닝 및 trace하는데 상당한 도움이 되는 것이 사실입니다.

 

Solaris(DTrace)나 AIX(trace, curt등) 을 사용해 보셨다면 glance가 제공하는 실시간적인 상태 정보는 거의 환상이라고 할 수 있겠죠.

그 다음으로는 pstack 명령어입니다.

 

이 부분은 Solaris의 pstack과 동일하기 때문에 별도로 설명은 드리지 않겠습니다.

Solaris의 ptack 부분 (http://blog.naver.com/bumsukoh/110114008655)을 참고하시면 되겠습니다.

단, pstack은 HP Itanium 에서 사용가능한 명령어입니다.

 

그외 pfiles, pmap등과 같은 프로세스 관련된 유용한 명령어들이 있습니다만, 여기서는 Java 프로세스와 Thread에 대한 내용에 초점이 두었기에 다루지 않도록 하겠습니다.

 

(다음 기회에 HP-UX의 프로세스 관련 명령어를 통한 모니터링 방법에 대해 설명드리겠습니다.)

다음은 gdb인데요. 굳이 gdb까지 사용하여 뭔가 트러블슈팅하는 경우는 그렇게 많지 않을 것 같은데요.

알고 있으면 상당히 유용한건 사실입니다. (써먹을 기회가 별로 없어서 그렇지만요 ㅠ.ㅠ!)

자, 그럼 gdb를 어디에 써먹을 것인가? gdb는 Unix 프로세스를 debugging하기 위한 툴입니다.

이 툴은 보통 C 언어의 프로그램을 디버깅하는데 사용됩니다.(물론 C++, Fortran, Ada등도 가능합니다.)

Java 기반의 시스템과 프로그램이 많아지면서 HP-UX에서는 gdb에서 Java에 대한 분석도 가능하도록 하기 위한 기능을 제공하게 됩니다.

Java Unwind LIbrary라고 하는것인데.. 자세한 사항은 "HP-0UX 에서 gdb를 이용해 Java 프로세스 core 분석하기 !!" (http://blog.naver.com/bumsukoh/110112408842) 포스트를 참고하시면 될 것 같습니다.

그 외에 프로세스 프로파일링을 위한 막강 프로파일 툴인 caliper 등을 활용할 수 있으나, 굳이 Java기반에서는 이러한 프로파일링 툴까지 쓸 필요는 없을것 같고, 대신 Java를 위한 프로파일링 툴은 알아둘 필요가 있습니다. 이 부분은 이번 연재의 뒷부분에서 다루도록 하겠습니다.

다음 포스트에서는 "OS 툴을 잘 활용하라 !" AIX 에 대해 설명드리도록 하겠습니다.

그럼 건강하시고 다음 포스트에서 뵙도록 하겠습니다.

반응형

'OS > HP-UX::' 카테고리의 다른 글

HP-UX 에서 Glance와 ps로 보는 메모리 내용의 차이점.  (0) 2015.08.17
HP-UX depot 패키지 설치  (0) 2014.06.11
HP-UX 11.11 gcc 설치  (0) 2014.06.11
HP-UX 컴파일러 관련 정보  (0) 2011.12.01
반응형

출처 : http://minlove.tistory.com/4

 

1. AIX

shutdown -F
shutdown -Fr 0

2. HPUX
종료 shutdown -hy 0
리붓 shutdown –r 0

 

/sbin/shutdown [-h] [-r] [-y] grace

-h : halt

-r : reboot

-y : 사용자 대화 종료

grace : 시스템 종료 유예 시간 단위 Sec

 

/usr/sbin/reboot [-h] [-r] [-n] [-s] [-m mesg] [-t time]

-h : halt
-r : reboot
-n : no sync
-s : sync
-m : message 발송
-t : 시스템 종료 유예시간

참고 ) reboot은 싱글유저가 아니어도 실행이 가능하지만 shutdown 보다 덜 안정성이
있다..
이유는 프로세스 종료시 강제종료을 사용하기 때문..
권장은 시스템이 싱글모드일때 부득이 시스템을 빨리 종료해야할때 외에는
reboot 을 다중사용자 모드에서 사용하지 마세요...

[ 숙지 사항]
시스템 종료 : 반드시 / 에서 실행 (# cd / )

# who -r : 일반유저가 있다면 종료을 login out 하도록 함
# 모든 사용자 프로그램 종료
# cd
# shutdown -hy 0 : 시스템 즉시 종료

시스템 리부트
# shutdown -ry 0 : 시스템 즉시 리부트
싱글모드일때 종료 : # reboot -h
싱글모드일때 리부트 : # reboot -r or reboot


3. Solaris
종료 shutdown -y -i0 -g0
리붓 shutdown -y -i6 -g0

 
반응형
반응형

 

 

Language C - Libxml

 

libxml2을 설치하면 libxml 폴더에 각종 헤더 파일이 들어있다.

현재 내가 사용하는 header 파일은 아래 두개인데..

물론 더 많이 사용하는 법이 있겠지만 기본적으로 사용하는 법을 알아보자..

 

libxml/xmlmemory.h

libxml/parser.h

 

노드 타입은 아래와 같다

참고 할 것.

XML_ELEMENT_NODE= 1,
XML_ATTRIBUTE_NODE= 2,
XML_TEXT_NODE= 3,
XML_CDATA_SECTION_NODE= 4,
XML_ENTITY_REF_NODE= 5,
XML_ENTITY_NODE= 6,
XML_PI_NODE= 7,
XML_COMMENT_NODE= 8,
XML_DOCUMENT_NODE= 9,
XML_DOCUMENT_TYPE_NODE= 10,
XML_DOCUMENT_FRAG_NODE= 11,
XML_NOTATION_NODE= 12,
XML_HTML_DOCUMENT_NODE= 13,
XML_DTD_NODE= 14,
XML_ELEMENT_DECL= 15,
XML_ATTRIBUTE_DECL= 16,
XML_ENTITY_DECL= 17,
XML_NAMESPACE_DECL= 18,
XML_XINCLUDE_START= 19,
XML_XINCLUDE_END= 20

 

참고 : http://blog.naver.com/kdepirate?Redirect=Log&logNo=50033294493

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

[C] XML Parser (libxml)



간단한 사용법 및 자주 쓰이는 함수


○ 기본 데이타타입

ㅁxmlDoc, xmlDocPtr

ㅁxmlNode, xmlNodePtr

ㅁxmlAttr, xmlAttrPtr

ㅁxmlChar

 


○ XML문서 파싱할때

ㅁdoc = xmlParseDoc(string of docuement), xmlParseFile(filename) : XML문서 파싱

ㅁnode = xmlDocGetRootElement(doc) : 문서의 ROOT원소를 받음

ㅁnode = node->xmlChildrenNode : 그 밑의 노드로 감

ㅁnode->name : 노드의 이름

ㅁstr = xmlNodeGetContent(node) : 노드의 내용을 얻음

ㅁstr = xmlGetProp(node, property name) : 노드의 property내용을 얻어옴

-> xmlGetProp로 얻은 xmlChar * 내용은 xmlFree 또는 Free 해당 메모리영역을 해제 해줘야 한다.

    단 xmlFree의 경우 버그가 있다고 알려져 있는 듯한데 ... 그렇다고 free로 해제하면 SF가 날때가 있다...

    좀 더 여러가지로 사용해 봐야 할듯한데 우선 xmlFree로 하자.

ㅁnode = node->next : 다음 노드로 감

 

 

 

 

[출처] libxml을 사용하여 xml만들거 파싱하기 (Crazy For Computer) |작성자 coolpiece416

 

<함수>

xmlNewDoc //xml전체를 의미하는 document를 생성.

xmlNewNode //노드를 하나 추가하낟.

xmlDocSetRootElement //해당 노드를 root노드로 지정한다.

xmlNodeSetContent //생성된 노드에다가 내용을 넣는다.

xmlAddChild //한 노드를 다른 노드의 child로 단다.

xmlDocDumpMemory //생성된 xml전체를 가져온다. -> <root><aaa>qqqq</aaa><bbb>zzz</bbb></root> 이렇게 라인으로.

xmlParseDoc //xmlChar* 의 형태로 저장된 xml 데이터를 파싱되어 xmlNewDoc형태로 구성한다.

xmlDocGetRootElement //root 를 가져온다.

xmlNodeGetContent //해당 노드의 내용을 가져온다.

 

 

<xml 만들기>

xmlDocPtr doc;

xmlNodePtr rootNode;

xmlNodePtr subNode;

xmlChar* xmlData;

int size;

doc = xmlNewDoc((xmlChar*)"1.0"); //1.0 버전으로 생성

rootNode = xmlNewNode(NULL,(xmlChar*)"root"); //root라는 이름의 새 노드 생성

xmlDocSetRootElement(doc,rootNode); //rootNode를 root노드로 지정

subNode = xmlNewNode(NULL,(xmlChar*)"Company"); //Company라는 이름의 새 노드 생성

xmlNodeSetContent(subNode,(xmlChar*)"한국회사"); //Company노드의 내용 등록

xmlAddChild(rootNode,subNode); //rootNode에 subNode를 단다.

subNode = xmlNewNode(NULL,(xmlChar*)"location");

xmlNodeSetContent(subNode,(xmlChar*)"korea");

xmlAddChild(rootNode,subNode);

xmlDocDumpMemory(doc,&xmlData,&size); //xmlData에는 <Document version=1.0><root><Company>한국회사</Company><location>korea</location></root> 가 들어가 있다.

 

 

<xml 파싱>

xmlDocPtr doc;

xmlNodePtr node;

doc = xmlParseDoc((xmlChar*)xmlData); //xmlData = 위에서 xmlData안에 있는 내용의 형태를 가진 것

node = xmlDocGetRootElement(doc);

node = node->xmlChildrentNode;

xmlChar* data1 = xmlNodeGetContent(node);

xmlChar* data2 = xmlNodeGetContent(node);

xmlChar* data3 = xmlNodeGetContent(node);

...... 이런식으로 가져온다.

 

○ XML문서 생성할때 

ㅁdoc = xmlNewDoc("1.0") : 1.0버전의 xml문서객체 생성

rootnode = xmlNewNode(NULL, name of element) : 새로운 노드객체 생성

ㅁxmlDocSetRootElement(doc, rootnode) : 위에서 생성한 노드를 루트원소로 설정

ㅁnode = xmlNewNode(NULL, name of element) : 노드하나 더 생성

ㅁxmlNodeSetContent(node, 내용) : 노드에 내용 추가

xmlNewProp(node, name fo property, content of property) : 노드에 property추가

ㅁxmlAddChild(rootnode, node) : 루트노드 혹은 다른 노드의 하위노드로 추가

xmlDocPtr xmlParseDoc (const xmlChar * cur)

xmlNodePtr xmlDocGetRootElement (xmlDocPtr doc)

node = node->xmlChildrenNode : 그 밑의 노드로 감

node->name : 노드의 이름

str = xmlNodeGetContent(node) : 노드의 내용을 얻음

str = xmlGetProp(node, property name) : 노드의 property내용을 얻어옴

node = node->next : 다음 노드로 감

void xmlFreeDoc (xmlDocPtr cur)


Structure xmlNodestruct _xmlNode {
void * _private : application data
xmlElementType type : type number, must be second !
const xmlChar * name : the name of the node, or the entity
struct _xmlNode * children : parent->childs link
struct _xmlNode * last : last child link
struct _xmlNode * parent : child->parent link
struct _xmlNode * next : next sibling link
struct _xmlNode * prev : previous sibling link
struct _xmlDoc * doc : the containing document End of common p
xmlNs * ns : pointer to the associated namespace
xmlChar * content : the content
struct _xmlAttr * properties : properties list
xmlNs * nsDef : namespace definitions on this node
void * psvi : for type/PSVI informations
unsigned short line : line number
unsigned short extra : extra data for XPath/XSLT
}

 

 

 

makefile

구성 : xml_parser.c

xml_parser : xml_parser.o
gcc -o xml_parser xml_parser.o -L/usr/local/lib -lxml2

xml_parser.o : xml_parser.c
gcc -c xml_parser.c -I/usr/local/include/libxml2
clean :
rm -f ./xml_parser ./xml_parser.o


 

-c 옵션으로 .o 파일을 만들고

-o 옵션으로 바이너리 파일을 만든다.

 

따라서 include 하는 헤더파일들의 위치는 -c 옵션을 줄때 하고

라이브러리들을 사용할 때에는 -L 로 해당 라이브러리의 위치를 지정해주고 바로 뒤에 이에 해당하는 라이브러리를 입력한다.

이때 -lxml2의 실제 이름은 libxml2.a 이다. libxml2.a 에서 ib와 .a를 뺀것으로 lib중 l만, lib뒤에 붙는 이름만 쓰고 .a는 입력하지 않는다.

라이브러리가 여러 디렉토리에 있다면

 

-L라이브러리위치 -사용할 라이브러리 -L라이브러리위치 -사용할 라이브러리 ...

이렇게 해야 할 듯...

[출처] libxml 이것만 알면 될려나? 계속 업데이트하자...|작성자 kdepirate

 

 

 

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

libxml tutorial 한글번역

Libxml tutorial 원문 : http://xmlsoft.org/tutorial/index.html

출처 : http://kylesoft.blogspot.kr/2012/06/libxml-tutorial.html#!/2012/06/libxml-tutorial.html 


Abstract
Libxml은 자유롭게 사용할 수 있는 라이센스로 제공되고, 다양한 플랫폼에서 사용할 수 있는 XML을 다루기 위한 C언어 라이브러리이다. 이 문서에서는 기본적인 기능들의 예제를 제공한다.

Introduction
Libxml은 XML 데이터를 읽고, 쓰고, 다루기 위한 함수들을 구현한 C언어 라이브러리이다. 이 문서에서는 예제 코드와 기본적인 기능들에 대해서 설명한다. 완전한 문서와 더욱 자세한 사항에 대해서는 프로젝트 홈페이지에서 확인할 수 있다.
이 문서에서는 아래에 나열된 간단한 XML 프로그램들을 사용하여 설명한다.
  • XML 문서 해석
  • 특정 엘리먼트로부터 문자열 추출하기
  • 엘리먼트와 내용을 추가하기
  • 속성을 엘리먼트에 추가하기
  • 속성값 추출하기
예제 프로그램의 전체 소스코드는 Appendix에서 찾을 수 있다.

Data types
Libxml에서는 몇 가지 data type을 정의하고 있다.
  • xmlChar : UTF-8로 인코딩된 character type이다. UTF-8이 아닐 경우 반드시 UTF-8로 변환하여 사용해야한다.
  • xmlDoc : 해석된 XML 문서가 트리 구조로 저장될 수 있도록 마련된 구조체이다. xmlDocPtr은 xmlDoc 구조체의 포인터형이다.
  • xmlNode : 하나의 노드를 저장하기 위한 구조체. xmlNodePtr은 xmlNode 구조체의 포인터형이다. xmlDoc의 트리구조를 탐색하는데 사용된다.

Parsing the file
xml 파일을 불러와서 해석하고, 에러 검사를 하는데는 파일이름과 하나의 function만 있으면된다.
xmlDocPtr doc; // (1)
xmlNodePtr cur; // (2)
doc = xmlParseFile(docname); // (3)
if(doc == NULL) { // (4)
    fprintf(stderr, "Document not parsed successfully.\n");
    return;
}
cur = xmlDocGetRootElement(doc); // (5)
if(cur == NULL) { // (6)
    fprintf(stderr, "empty document\n");
    xmlFreeDoc(doc);
    return;
}
if(xmlStrcmp(cur->name, (const xmlChar *)"story")) { // (7)
    fprintf(stderr, "document of the wrong type, root node != story");
    xmlFreeDoc(doc);
    return;
}
(1) 해석된 문서를 가리킬 포인터 선언
(2) 노드를 가리키기 위한 포인터 선언
(3) docname의 문서를 불러와 해석한다.
(4) 문서가 정상적으로 로드/해석 되었는지 확인한다.
(5) root 엘리먼트를 찾는다.
(6) 문서에 내용이 있는지 확인한다.
(7) root 엘리먼트의 이름이 story인지 확인한다.
Note : 이 예제에서 에러가 발생할 수 있는 것은 적절하지 않은 인코딩이다. XML 표준에서는 문서가 UTF-8 또는 UTF-16이 아닌 다른 인코딩으로 저장되어 있을 경우 명시적으로 해당 인코딩 타입을 기술하도록 되어 있다. 문서에 인코딩 타입이 기술되어 있다면, libxml은 자동적으로 해당 인코딩 타입에서 UTF-8로 변환한다. 자세한 XML 인코딩 requirement에 대해서는 XML 표준을 참조하라.

Retrieving element content
엘리먼트의 내용을 추출하기 위해서는 문서 tree에서 해당 엘리먼트를 찾아야한다. 이 예제에서는 "story" 엘리먼트로부터 "keyword"라는 엘리먼트를 찾는다. 원하는 것을 찾기 위해서 tree를 하나하나 검색해야한다. doc(xmlDocPtr), cur(xmlNodePtr)은 이미 가지고 있다고 가정하고 설명한다.
cur = cur->xmlChildrenNode; // (1)
while(cur != NULL) { // (2)
    if((!xmlStrcmp(cur->name, (const xmlChar *)"storyinfo"))) {
        parseStory(doc, cur);
    }
    cur = cur->next;
}
(1) cur의 첫번째 자식 노드를 가져온다. 여기서 cur은 문서의 root 엘리먼트인 "story"이다. 즉, "story"의 첫번째 자식 엘리먼트를 가져오는 것이다.
(2) 이 loop에서는 "story" 엘리먼트의 자식들 중에서 "storyinfo"인 엘리먼트를 찾는다. "storyinfo"가 아니면 다음 자식 엘리먼트로 이동하고, 찾으면 parseStory()를 호출한다.

void parseStory(xmlDocPtr doc, xmlNodePtr cur) {
    xmlChar *key;
    cur = cur->xmlChildrenNode; // (1)
    while(cur != NULL) { // (2)
        if((!xmlStrcmp(cur->name, (const xmlChar *)"keyword"))) {
            key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1); // (3)
            printf("keyword: %s\n", key);
            xmlFree(key);
        }
        cur = cur->next;
    }
    return;
}
(1) 첫 번째 자식 노드를 가지고온다.
(2) 이전 코드의 loop 처럼 loop를 사용하여 자식 노드들 중에서 "keyword"라는 이름을 가진 노드를 찾는다.
(3) "keyword" 노드를 찾으면 내용을 xmlNodeListGetString()을 사용해서 가져와 출력한다.
xmlNodeListGetString()을 호출할때 cur->xmlChildrenNode를 인자로 넘겨주는데, XML에서는 내용이 엘리먼트의 자식 노드로 표현이 되기 때문에 "keyword"의 자식노드들 중에서 문자열 데이터를 가져오기 위해서 자식 노드들 중에서 검색하는 것이다.
Note. xmlNodeListGetString()은 메모리에 공간을 잡아서(할당하고) 문자열을 넣어 return하기 때문에 사용한 이후에 반드시 메모리를 해제해야만 한다.(xmlFree() 사용)

Using xpath to retrieve element content
Libxml2에서는 문서 tree에서 엘리먼트를 탐색하기 위한 추가적인 방법인 XPath라는 것을 포함하고 있다. XPath는 문서에서 특정 노드를 찾기위한 표준적인 검색 방법을 제공한다.
Note. XPath에 대해서 자세히 알고 싶다면 XPath 문서를 참고하자.

XPath를 사용하기 위해서는 xmlXPathContext를 설정하고, xmlXPathEvalExpression() 함수를 호출한다. 이 함수는 xmlXPathObjectPtr를 반환한다.
xmlXPathObjectPtr getnodeset (xmlDocPtr doc, xmlChar *xpath) {
    xmlXPathContextPtr context; // (1)
    xmlXPathObjectPtr result;
    context = xmlXPathNewContext(doc); // (2)
    result = xmlXPathEvalExpression(xpath, context); // (3)
    if(xmlXPathNodeSetIsEmpty(result->nodesetval)) { // (4)
        printf("No result\n");
        return NULL;
    }
    xmlXPathFreeContext(context);
    return result;
}
(1) 변수 선언
(2) context 변수 초기화
(3) XPath 표현식 적용
(4) 결과 확인 & 메모리 해제
위 함수에서 반환되는 xmlXPathObjectPtr은 노드들과 반복적인 동작을 위한 정보들의 집합을 포함하고 있다. 노드 집합은 엘리먼트 개수(nodeNr)와 노드들의 배열(nodeTab)을 가지고 있다.
for(i = 0; i < nodeset->nodeNr; i++) { // (1)
    keyword = xmlNodeListGetString(doc, nodeset->nodeTab[i]->xmlChildrenNode, 1); // (2)
    printf("keyword: %s\n", keyword);
    xmlFree(keyword);
}
(1) nodeset->nodeNr은 노드 집합이 가지고 있는 엘리먼트 개수이다.
(2) 각 노드의 내용을 추출하여 출력한다.

Writing element content
엘리먼트 내용을 추가하는 것은 이전에 이미 했던 과정들(문서를 해석하고, 노드들을 탐색)과 많은 부분이 동일하다. 문서를 불러와 해석하고, 원하는 노드를 찾고, 내용을 추가하면 된다. 여기서는 "storyinfo" 엘리먼트를 찾아서 keyword를 추가하고 파일로 저장한다.
void parseStory(mxlDocPtr doc, xmlNodePtr cur, char *keyword) {
    xmlNewTextChild(cur, NULL, "keyword", keyword); // (1)
    return;
}
(1) xmlNewTextChild 함수는 현재 노드에 새로운 자식 노드를 추가한다.
노드를 추가한 후에는 파일로 저장하기를 원할 것이다. 네임스페이스가 포함되어 저장되기를 원한다면 여기서 추가할 수 있다. 아래 예제에서는 네임스페이스가 NULL인 경우이다.
xmlSaveFormatFile(docname, doc, 1);
첫번째 인자는 파일 이름이다. 읽어들인 파일명과 동일한 파일명을 입력하면 덮어쓰게 된다. 두번째 인자는 xmlDoc 구조체의 포인터이다. 세번째 인자를 1로 설정하면 indenting하여 저장한다.

Writing attribute
속성을 추가하는 것은 새 엘리먼트를 추가하는 것과 비슷하다. 이 예제에서는 libxml tutorial 문서의 URI를 추가한다.
추가할 위치는 story 엘리먼트의 child이다. 따라서 새로운 엘리먼트와 속성을 추가할 위치를 찾는 것을 간단하다.
먼저 변수를 선언한다.
xmlAttrPtr newattr;
xmlNodePtr도 추가적으로 필요하다.
xmlNodePtr newnode;
root 엘리먼트가 story이면, 다른 노드를 탐색하기 전까지는 cur이 root 엘리먼트를 가리키고 있다. 따라서 cur에 새 엘리먼트와 속성을 추가하면 된다.
newnode = xmlNewTextChild(cur, NULL, "reference", NULL); // (1)
newattr = xmlNewProp(newnode, "uri", uri); // (2)
(1) 먼저 새로운 노드를 현재 노드의 child로 xmlNewTextChild 함수를 사용해서 생성한다.
(2) 생성된 노드에 새로운 속성을 추가한다.
앞의 예제와 같이 노드가 추가되면 파일에 저장한다.

Retrieving attributes
속성값을 추출하는 것은 노드에서 내용을 추출하는 이전의 예제와 거의 동일하다. 이 예제에서는 앞의 예제에서 추가했던 URI 속성의 값을 추출할 것이다.
void getReference(xmlDocPtr doc, xmlNodePtr cur) {
    xmlChar *uri;
    cur = cur->xmlChildrenNode;
    while(cur != NULL) {
        if((!xmlStrcmp(cur->name, (const xmlChar *)"reference"))) {
            uri = xmlGetProp(cur, "uri"); // (1)
            printf("uri: %s\n", uri);
            xmlFree(uri);
        }
        cur = cur->next;
    }
    return;
}
(1) 핵심 함수는 xmlGetProp()이다. 이 함수는 속성의 값을 xmlChar 형식으로 반환한다.
Note. 만약 고정으로 선언된 DTD를 사용하거나 속성의 기본 값이 설정되어 있다면, 이 함수는 값을 추출할 것이다.

Encoding conversion
데이터 인코딩 호환성 문제는 XML을 다루는데 있어 가장 어려운 문제중 하나이다. 이 문제를 회피하고 싶다면 어플리케이션을 디자인할때 내부적으로, libxml로 저장/관리되는 데이터에 대해서 UTF-8 사용을 고려하라. 프로그램에서 사용되는 다른 포맷으로 된 데이터(ISO-88590-1과 같은 데이터)는 libxml 함수들로 전달되기 전에 반드시 UTF-8로 변환되어야한다. 출력 데이터가 UTF-8이 아닌 다른 포맷을 원할 경우 역시 반드시 변환을 거쳐야 한다.
Libxml은 데이터 변환이 가능한 경우 iconv를 사용한다. iconv가 없을 경우 UTF-8과 UTF-16, ISO-8859-1만 사용될 수 있다. iconv가 있을 경우 어떤 포맷이라도 변환을 거쳐 사용할 수 있다. 현재 iconv는 150여가지의 포맷을 지원한다.
Warning. 일반적으로 저지르기 쉬운 실수 중의 하나는, 하나의 코드 내, 다른 부분에서 사용되는 내부 데이터에 서로다른 포맷을 사용하는 것이다. 가장 흔한 경우가 libxml에서는 내부 데이터를 UTF-8로 가정하는데 libxml를 사용하는 어플리케이션에서는 내부 데이터를 ISO-8859-1로 가정하는 경우이다. 그 결과 어플리케이션 내부 데이터를 각 코드에서 다르게 실행하게 되므로 잘못 해석하는 경우가 발생할 수 있다.
이 예제는 간단한 문서를 구성하고, command line에서 입력되는 내용을 root 엘리먼트에 추가하고, 그 결과를 적절한 인코딩으로 stdout으로 내보낸다. 여기서는 ISO-8859-1 인코딩을 사용한다. command line에서 입력된 문자열은 ISO-8859-1에서 UTF-8로 변환된다. 예제에서 변환과 캡슐화를 위해 사용된 함수는 xmlFindCharEncodingHandler이다.
xmlCharEncodingHandlerPtr handler; // (1)
size = (int)strlen(in) + 1; // (2)
out_size = size * 2 - 1;
out = malloc((size_t)out_size);
...
handler = xmlFindCharEncodingHandler(encoding); // (3)
...
handler->input(out, &out_size, in, &temp); // (4)
...
xmlSaveFormatFileEnc("-", doc, encoding, 1); // (5)
(1) xmlCharEncodingHandler 함수를 위한 handler 포인터 선언
(2) xmlCharEncodingHandler 함수는 입력과 출력의 크기를 필요로한다. 여기서 그 크기를 계산한다.
(3) xmlFindCharEncodingHandler 함수는 인자로 초기 데이터 인코딩 타입을 받아 built-in 변환 핸들러를 검색하여 있으면 핸들러를 반환하고, 찾지 못한 경우 NULL을 반환한다.
(4) 변환 함수는 인자로 입력과 출력 문자열에 대한 포인터와 각각의 크기를 필요로 한다. 크기정보는 반드시 이전에 계산 되어 있어야 한다.
(5) 출력으로 UTF-8이 아닌 특정 인코딩 타입으로 원할 경우 xmlSaveFormatFileEnc 함수를 사용한다.

Appendix
a. Compilation
Libxml에는 xml2-config 스크립트가 포함되어 있으며, 이것은 컴파일에 필요한 flag들을 생성해준다. pre-processor 및 컴파일 flags를 생성하기 위해서는 xml2-config --cflags를 사용하고, linking 작업에는 xml2-config --libs를 사용하라. 다른 옵션을 확인하고 싶으면 xml2-config --help를 입력하면 된다.

b. Sample document
<?xml version="1.0"?>
<story>
    <storyinfo>
        <author>John Fleck</author>
        <datewritten>June 2, 2002</datewritten>
        <keyword>example keyword</keyword>
    </storyinfo>
    <body>
        <headline>This is the headline</headline>
        <para>This is the body text.</para>
    </body>
</story>

c. Code for keyword example
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <libxml/xmlmemory.h>
#include <libxml/parser.h>

void parseStory(xmlDocPtr doc, xmlNodePtr cur) {
    xmlChar *key;
    cur = cur->xmlChildrenNode;
    while(cur != NULL) {
        if((!xmlStrcmp(cur->name, (const xmlChar *)"keyword"))) {
            key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
            printf("keyword: %s\n", key);
            xmlFree(key);
        }
        cur = cur->next;
    }
    return;
}

static void parseDoc(char *docname) {
    xmlDocPtr doc;
    xmlNodePtr cur;
    doc = xmlParseFile(docname);
    if(doc == NULL) {
        fprintf(stderr, "Document not parsed successfully.\n");
        return;
    }
    cur = xmlDocGetRootElement(doc);
    if(cur == NULL) {
        fprintf(stderr, "empty document\n");
        xmlFreeDoc(doc);
        return;
    }
    if(xmlStrcmp(cur->name, (const xmlChar *)"story")) {
        fprintf(stderr, "document of the wrong type, root node != story\n");
        xmlFreeDoc(doc);
        return;
    }
    cur = cur->xmlChildrenNode;
    while(cur != NULL) {
        if((!xmlStrcmp(cur->name, (const xmlChar *)"storyinfo"))) {
            parseStory(doc, cur);
        }
        cur = cur->next;
    }
    xmlFreeDoc(doc);
    return;
}

int main(int argc, char **argv) {
    char *docname;
    if(argc <= 1) {
        printf("Usage: %s docname\n", argv[0]);
        return(0);
    }
    docname = argv[1];
    parseDoc(docname);
    return(1);
}

d. Code for xpath example
#include <libxml/parser.h>
#include <libxml/xpath.h>

xmlDocPtr getdoc (char *docname) {
    xmlDocPtr doc;
    doc = xmlParseFile(docname);
    if (doc == NULL ) {
         fprintf(stderr,"Document not parsed successfully. \n");
        return NULL;
    }
    return doc;
}

xmlXPathObjectPtr getnodeset (xmlDocPtr doc, xmlChar *xpath) {
    xmlXPathContextPtr context;
    xmlXPathObjectPtr result;
    context = xmlXPathNewContext(doc);
    result = xmlXPathEvalExpression(xpath, context);
    if(xmlXPathNodeSetIsEmpty(result->nodesetval)) {
        printf("No result\n");
        return NULL;
    }
    xmlXPathFreeContext(context);
    return result;
}

int main(int argc, char **argv) {
    char *docname;
    xmlDocPtr doc;
    xmlChar *xpath = (xmlChar *)"//keyword";
    xmlNodeSetPtr nodeset;
    xmlXPathObjectPtr result;
    int i;
    xmlChar *keyword;
    if (argc <= 1) {
        printf("Usage: %s docname\n", argv[0]);
        return(0);
    }
    docname = argv[1];
    doc = getdoc(docname);
    result = getnodeset (doc, xpath);
    if (result) {
        nodeset = result->nodesetval;
        for (i=0; i < nodeset->nodeNr; i++) {
            keyword = xmlNodeListGetString(doc, nodeset->nodeTab[i]->xmlChildrenNode, 1);
            printf("keyword: %s\n", keyword);
            xmlFree(keyword);
        }
        xmlXPathFreeObject (result);
    }
    xmlFreeDoc(doc);
    xmlCleanupParser();
    return (1);
}

e. Code for add keyword example
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <libxml/xmlmemory.h>
#include <libxml/parser.h>

void parseStory (xmlDocPtr doc, xmlNodePtr cur, char *keyword) {
    xmlNewTextChild (cur, NULL, "keyword", keyword);
    return;
}

xmlDocPtr parseDoc(char *docname, char *keyword) {
    xmlDocPtr doc;
    xmlNodePtr cur;
    doc = xmlParseFile(docname);
    if (doc == NULL ) {
        fprintf(stderr,"Document not parsed successfully. \n");
        return (NULL);
    }
    cur = xmlDocGetRootElement(doc);
    if (cur == NULL) {
        fprintf(stderr,"empty document\n");
        xmlFreeDoc(doc);
        return (NULL);
    }
    if (xmlStrcmp(cur->name, (const xmlChar *) "story")) {
        fprintf(stderr,"document of the wrong type, root node != story");
        xmlFreeDoc(doc);
        return (NULL);
    }
    cur = cur->xmlChildrenNode;
    while (cur != NULL) {
        if ((!xmlStrcmp(cur->name, (const xmlChar *)"storyinfo"))) {
            parseStory (doc, cur, keyword);
        }
        cur = cur->next;
    }
    return(doc);
}

int main(int argc, char **argv) {
    char *docname;
    char *keyword;
    xmlDocPtr doc;
    if (argc <= 2) {
        printf("Usage: %s docname, keyword\n", argv[0]);
        return(0);
    }
    docname = argv[1];
    keyword = argv[2];
    doc = parseDoc (docname, keyword);
    if (doc != NULL) {
        xmlSaveFormatFile (docname, doc, 0);
        xmlFreeDoc(doc);
    }
    return (1);
}

f. Code for add attribute example
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <libxml/xmlmemory.h>
#include <libxml/parser.h>

xmlDocPtr parseDoc(char *docname, char *uri) {
    xmlDocPtr doc;
    xmlNodePtr cur;
    xmlNodePtr newnode;
    xmlAttrPtr newattr;
    doc = xmlParseFile(docname);
    if (doc == NULL ) {
        fprintf(stderr,"Document not parsed successfully. \n");
        return (NULL);
    }
    cur = xmlDocGetRootElement(doc);
    if (cur == NULL) {
        fprintf(stderr,"empty document\n");
        xmlFreeDoc(doc);
        return (NULL);
    }
    if (xmlStrcmp(cur->name, (const xmlChar *) "story")) {
        fprintf(stderr,"document of the wrong type, root node != story");
        xmlFreeDoc(doc);
        return (NULL);
    }
    newnode = xmlNewTextChild (cur, NULL, "reference", NULL);
    newattr = xmlNewProp (newnode, "uri", uri);
    return(doc);
}

int main(int argc, char **argv) {
    char *docname;
    char *uri;
    xmlDocPtr doc;
    if (argc <= 2) {
        printf("Usage: %s docname, uri\n", argv[0]);
        return(0);
    }
    docname = argv[1];
    uri = argv[2];
    doc = parseDoc (docname, uri);
    if (doc != NULL) {
        xmlSaveFormatFile (docname, doc, 1);
        xmlFreeDoc(doc);
    }
    return (1);
}

g. Code for retrieving attribute value example
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <libxml/xmlmemory.h>
#include <libxml/parser.h>

xmlDocPtr parseDoc(char *docname, char *uri) {
    xmlDocPtr doc;
    xmlNodePtr cur;
    xmlNodePtr newnode;
    xmlAttrPtr newattr;
    doc = xmlParseFile(docname);
    if (doc == NULL ) {
        fprintf(stderr,"Document not parsed successfully. \n");
        return (NULL);
    }
    cur = xmlDocGetRootElement(doc);
    if (cur == NULL) {
        fprintf(stderr,"empty document\n");
        xmlFreeDoc(doc);
        return (NULL);
    }
    if (xmlStrcmp(cur->name, (const xmlChar *) "story")) {
        fprintf(stderr,"document of the wrong type, root node != story");
        xmlFreeDoc(doc);
        return (NULL);
    }
    newnode = xmlNewTextChild (cur, NULL, "reference", NULL);
    newattr = xmlNewProp (newnode, "uri", uri);
    return(doc);
}

int main(int argc, char **argv) {
    char *docname;
    char *uri;
    xmlDocPtr doc;
    if (argc <= 2) {
        printf("Usage: %s docname, uri\n", argv[0]);
        return(0);
    }
    docname = argv[1];
    uri = argv[2];
    doc = parseDoc (docname, uri);
    if (doc != NULL) {
        xmlSaveFormatFile (docname, doc, 1);
        xmlFreeDoc(doc);
    }
    return (1);
}

h. Code for encoding conversion example
#include <string.h>
#include <libxml/parser.h>

unsigned char* convert (unsigned char *in, char *encoding) {
    unsigned char *out;
    int ret,size,out_size,temp;
    xmlCharEncodingHandlerPtr handler;
    size = (int)strlen(in)+1;
    out_size = size*2-1;
    out = malloc((size_t)out_size);
    if (out) {
        handler = xmlFindCharEncodingHandler(encoding);
        if (!handler) {
            free(out);
            out = NULL;
        }
    }
    if (out){
        temp=size-1;
        ret = handler->input(out, &out_size, in, &temp);
        if (ret || temp-size+1) {
            if (ret) {
                printf("conversion wasn't successful.\n");
            }
            else {
                printf("conversion wasn't successful. converted\n");
            }
            free(out);
            out = NULL;
        }
        else {
            out = realloc(out,out_size+1);
            out[out_size]=0; /*null terminating out*/
        }
    }
    else {
        printf("no mem\n");
    }
    return (out);
}

int main(int argc, char **argv) {
    unsigned char *content, *out;
    xmlDocPtr doc;
    xmlNodePtr rootnode;
    char *encoding = "ISO-8859-1";
    if (argc <= 1) {
        printf("Usage: %s content\n", argv[0]);
        return(0);
    }
    content = argv[1];
    out = convert(content, encoding);
    doc = xmlNewDoc ("1.0");
    rootnode = xmlNewDocNode(doc, NULL, (const xmlChar*)"root", out);
    xmlDocSetRootElement(doc, rootnode);
    xmlSaveFormatFileEnc("-", doc, encoding, 1);
    return (1);
}
반응형
반응형

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

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

 

원문 출처

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
반응형

 

AIX에서 각각의 라이브러리 버전을 확인하고자 할 때 어떻게 해야하는지 한참 찾다가 드디어 발견..

컴파일 후 다른 머신에서 실행시 발생하는 동적 라이브러리 버전 때문에 확인해야 할 경우 미리 확인하면 유용할 듯..

 

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

exec(): 0509-036 다음 오류 때문에 <프로그램 명> 프로그램을 로드할 수 없습니다.
0509-130 <프로그램 명>에 대한 기호 해상도가 다음 이유 때문에 실패했습니다.
0509-136 __pth_init(번호 134) 기호가 종속 모듈
/lib/libpthread.a[shr_xpg5_64.o]에서 반출되지 않았습니다.
0509-192 'dump -Tv' 명령으로 .loader 섹션 기호를
시험하십시오.

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

뭐 대략 이런 에러 .... ㅡㅡ... 산산조각 깨졌네요 허허허

해당 에러가 나올 때는 AIX 라이브러리 셋 을 570+으로 업그레이드 하라는데...

5.3.7.0 이상으로 하라는건가...? 뭐 어쨋든 컴파일한 머신과 라이브러리 버전이 같다면 큰 문제는 없을듯.

 

근데 어디서 어떻게 라이브러리를 업데이트 받는걸까..

혹시 지나가시다가 아시는 분 생기시면 댓글 달아주시면 정말 감사드릴텐데.. ㅋ

 

 

명령어

lslpp -al

옵션은 al 정도만 사용해도 충분하게 다 커버할 수 있는 듯하다 필요하다면 man으로 자세한 내용을 확인하자

아래는 실제로 커맨드시 출력되는 내용들

 

 

 

 

우선 OSLEVEL을 확인하시려면

#> oslevel -r

5300-04

 

와 같이 뜨구요.

xlC 컴파일러 라이브러리 파일셋을 보려면

 

#> lslpp -l xlC*rte

  파일 세트                     레벨  상태       설명
  ----------------------------------------------------------------------------
경로: /usr/lib/objrepos
  xlC.aix43.rte              4.0.2.2  확정됨     C Set ++ Runtime for AIX 4.3
  xlC.aix50.rte             10.1.0.0  확정됨     XL C/C++ Runtime for AIX 5.3
  xlC.rte                     10.1.0.0  확정됨     XL C/C++ Runtime

 

뭐 요렇게 나오네요..

또한 해당 라이브러리의 파일셋이 어디인지 알고 싶다면 -w 옵션을 사용.

#> lslpp -w /usr/lib/libpthreads.a

  파일                                        파일 세트             유형
  ----------------------------------------------------------------------------
  /usr/lib/libpthreads.a             bos.rte.libpthreads   Symlink

 

해당 라이브러리의 인스톨 및 언데이트 히스토리를 알고 싶다면 -h 옵션을 사용

 

#> lslpp -h bos.rte.libpthreads

  파일 세트       레벨      조치         상태         날짜         시간
  ----------------------------------------------------------------------------
경로: /usr/lib/objrepos
  bos.rte.libpthreads
                  5.3.8.0   확정         완료         09/07/09     01:20:56
                  5.3.9.0   확정         완료         10/03/25     14:55:11

이것도 요렇게 친절하게 나옵니다..

 

 

 

 

 

 

반응형
반응형

 

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

file [바이너리명]

: 몇 비트 파일인지 확인 할 수 있다.

 

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

nm 사용법 -> 알아봅시다.

 

 

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

- 해석되지 않은 심볼
현상 : ld: 0711-317 ERROR: Undefined symbol: .pow
ld: 0711-345 Use the -bloadmap or -bnoquiet option to obtain more information.
원인 : 심볼을 해석하지 못한 에러는 다양한 경우에 발생할 수 있지만 대부분의 이유는 필요한 파일을 제대로 주지 않은 경우이다.
조치 : 라이브러리에 들어있지 않은 라이브러리 함수를 호출하는 경우 해당하는 함수가 들어있는 라이브러리를 지정해주어야 한다.

- 동일한 심볼을 중복해서 정의할 경우 프로그래밍 에러가 발생.
현상 : ld: 0711-224 WARNING: Duplicate symbol:
.A<int>::f()
ld: 0711-345 Use the -bloadmap or -bnoquiet option to obtain more information.
원인 : 이 경우 링커는 첫번째 심볼 만을 인정하기 때문에 의도하지 않은 결과가 발생할 수 있다. 함수의 이름을 바꾸던가 정적(static) 함수를 사용해야 한다.
조치 : 심볼이 중복되어 똑같이 정의되어 있으므로 -bhalt:5 옵션을사용해서 링커에게 메시지를 보여주지 않도록 해야 한다.
-bhalt 링커 옵션은 링킹 과정 중 지정한 숫자보다 적은 에러메시지가 발생하면 이 메시지를 보여주지 않도록 한다.

- 링킹과정 중 메모리가 충분하지 않을 때
현상 : ld: 0711-101 fatal error, allocation of bytes fail in routine initsymtab_info.
There is not enough memory.
원인 : 대부분 원인은 페이징 공간이 너무 크기가 작거나, 링커명령을 사용한 사용자의 자원제한이 너무 낮아서 발생한다.
조치 : 위와 같은 에러가 발생하면 다음 사항을 체크해보고 가능하다면 페이징 공간을 늘리는 편이 좋다.
1.시스템 내의 가용한 페이징 공간
2.링커를 사용한 사용자가 사용할 수 있는 자원의 제한. 이 상황은 ulimit 명령으로 알아볼 수 있다.

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

-lm

/bin/sh ./libtool --silent --tag=CC --mode=link gcc -g -O2 -Wall -W -D_THREAD_SAFE -o utilities/animate utilities/animate.o magick/libMagick.la wand/libWand.la
ld: 0711-317 ERROR: Undefined symbol: .fmod
ld: 0711-317 ERROR: Undefined symbol: .cos
ld: 0711-317 ERROR: Undefined symbol: .sin
ld: 0711-317 ERROR: Undefined symbol: .pow
ld: 0711-317 ERROR: Undefined symbol: .ceil
ld: 0711-317 ERROR: Undefined symbol: .sqrt
ld: 0711-317 ERROR: Undefined symbol: .cexp
ld: 0711-317 ERROR: Undefined symbol: .exp
ld: 0711-317 ERROR: Undefined symbol: .floor
ld: 0711-317 ERROR: Undefined symbol: .atan2
ld: 0711-317 ERROR: Undefined symbol: .hypot
ld: 0711-317 ERROR: Undefined symbol: .tan
ld: 0711-317 ERROR: Undefined symbol: .log
ld: 0711-317 ERROR: Undefined symbol: .log10
ld: 0711-317 ERROR: Undefined symbol: .acos
ld: 0711-317 ERROR: Undefined symbol: .asin
ld: 0711-317 ERROR: Undefined symbol: .atan
ld: 0711-345 Use the -bloadmap or -bnoquiet option to obtain more information.
collect2: ld returned 8 exit status
make: 1254-004 The error code from the last command is 1.

에러 제거시

You're obviously missing libm.so (or libm.a or libm.sl or whatever the
extension for (shared) libraries is on your system).

You can check config.sh to see if Configure includes -lm in the 'libs='
line

libs='-lbind -lnsl -ldbm -ldb -ldl -lld -lm -lcrypt -lc -lbsd';

if it does, check to see if libm.a is in any of the path's shown for
libs

libdirs=' /usr/local/ppc64/lib64  /lib /pro/local/lib';
libpth='/usr/local/ppc64/lib64 /lib /usr/lib /usr/ccs/lib /usr/local/lib';
libsdirs=' /lib /usr/local/ppc64/lib64';
libld.a /lib/libm.a /lib/libcrypt.a /lib/libc.a /lib/libbsd.a';
libspath=' /usr/local/ppc64/lib64 /lib /usr/lib /usr/ccs/lib /usr/local/lib';

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

반응형

'OS > Common' 카테고리의 다른 글

Z 확장자 압축해제  (0) 2013.07.09
aix hpux solaris 특징 및 명령어 비교  (0) 2012.12.05
ftp 사용법 [명령어]  (0) 2011.10.20
Tar 와 Gzip Bzip2사용법  (0) 2011.10.20
unix/linux의 OS 32/64bit 확인 방법  (0) 2011.10.04
반응형

출처 : http://www.wowunix.com/cgi-bin/CrazyWWWBoard.cgi?mode=read&num=80&db=solaris&backdepth=1

프롬프트에 현재 디렉토리명을 넣으려면?


그것은 사용하는 쉘에 따라 다르다. 몇몇 쉘에서는 이것에 쉽지만
다른 쉘에서는 어렵거나 불가능 할 수도 있다.

C Shell (csh):
다음을 여러분의 .cshrc에 넣어서 프롬프트를 여러분이 원하는 대로 바꿀 수 있다.

alias setprompt 'set prompt="${cwd}% "'
setprompt # to set the initial prompt
alias cd 'chdir \!* && setprompt'

만약 pushd와 popd를 원하면 다음과 같이 하라

alias pushd 'pushd \!* && setprompt'
alias popd 'popd \!* && setprompt'

몇몇 C쉘은 $cwd 변수를 가지고 있지 않다. 그때는 `pwd`를 사용해야 한다.

여러분이 단지 현재 디렉토리의 마지막 구성요소만을 원한다면 여러분의 프롬프트에
다음과 같이 넣을 수 있다. 예를 들어("mail% ")

alias setprompt 'set prompt="$cwd:t% "'

몇몇 다른 옛날 csh은 &&와 ||를 반대의 의미로 사용하기도 한다.
다음을 사용해 보라.

false && echo bug

만약 "bug"라는 문자가 나오면 여러분은 &&와 ||를 바꾸어서 사용해야 한다.
그리고 더 나은 csh을 구해서 설치 하라.

Bourne Shell (sh):

만약 Bourne Shell의 새로운 버전을 가지고 있다면 여러분은 자신의 명령인
shell 함수를 만들 수 있다.

xcd() { cd $* ; PS1="`pwd` $ "; }

만약 Bourne shell의 옛날 버전을 가지고 있다면 좀 복잡하긴 하지만
불가능 한건 아니다. 여기 그 방법이 있는데, 다음을 .profile에 넣어라.

LOGIN_SHELL=$$ export LOGIN_SHELL
CMDFILE=/tmp/cd.$$ export CMDFILE
# 16 is SIGURG, pick a signal that's not likely to be used
PROMPTSIG=16 export PROMPTSIG
trap '. $CMDFILE' $PROMPTSIG

그리고나서 다음의 실행 가능 스크립트를 만들어서 여러분의 PATH에 해당하는
위치에 "xcd"라는 이름으로 넣도록 하라.

: xcd directory - change directory and set prompt
: by signalling the login shell to read a command file
cat >${CMDFILE?"not set"} < cd $1
PS1="\`pwd\`$ "
EOF
kill -${PROMPTSIG?"not set"} ${LOGIN_SHELL?"not set"}

그리고 나서 "xcd /some/dir"하면 디렉토리가 변경이 된다.

Korn Shell (ksh):

다음을 .profile에 넣어라:
PS1='$PWD $ '

단지 디렉토리의 마지막 구성요소를 원한다면 다음과 같이 하라
PS1='${PWD##*/} $ '

T C shell (tcsh)

Tcsh은 csh의 개선된 버전이며 몇가지 고유의 변수와 다른 몇몇 기능들을 가지고 있다

%~ 현재 디렉토리, $HOME에 대해 ~를 사용한다
%/ 현재 디렉토리의 full pathname
%c or %. 현재 디렉토리의 trailing component

그래서 이렇게 할 수 있다.

set prompt='%~ '

BASH (FSF's "Bourne Again SHell")

$PS1의 \w는 현재 디렉토리의 Full pathname을 뜻하며 ~는 $HOME에 대한 확장이다
그래서 위의 sh과 ksh 솔루션에 더하여 여러분은 다음을 사용할 수 있다.

PS1='\w $ '
또는
PS1='\W $ '

반응형
반응형


보통 gcc나 g++은 /user/bin에 있고 cc는 gcc의 링크가 걸려 있다. (내가 알기로는)

HP-UX에서 사용하는 c++ 컴파일러는 aCC인데 해당 컴파일러의 위치는
/opt/aCC/bin에 있다. 물론 /opt/aCC에 lib나 include 관련 내용도 찾아 볼 수 있다.

CC 파일의 경우는 /usr/ccs에 보면 cc 파일이 있다.

----------------------------------------------------------------------------------
어쨋거나 HP-UX에서 사용하는 aCC용 옵션들을 보면 아래와 같다.


컴파일 옵션:

aCC
HP aC++ 컴파일러
$EXTRA_CFLAG
7 HP-UX 플랫폼에서 IA64 및 64비트 지원이 사용 가능한 경우 이 플래그는7 7 +DD64 -AA 7 값을 포함하고, 32비트 지원이 사용 가능한 경우7 7 +DD32 -AA 7 값을 포함합니다. HP-UX 플랫폼에서 PA-RISC 및 64비트 지원이 사용 가능한 경우,7 +DA2.0W 값을 포함합니다. PA-RISC 플랫폼에서의 32비트 지원을 위해 이 플래그에는 값이 포함되지 않습니다.7 7
7
+DD64
7
IA64의 HP-UX용 64비트 코드를 생성하기 위해 사용되어야 합니다.7
7
+DD32
7
IA64의 HP-UX용 32비트 코드를 생성하기 위해 사용되어야 합니다.7
7 7
-AA
7
IA64에서 이름공간 std 및 C++ 표준 라이브러리와 같은 ANSI C++ 표준 기능을 허용합니다.7
7 7
+DA2.0W
7
PA-RISC의 HP-UX용 64비트 코드를 생성하기 위해 사용되어야 합니다.7
7
-ext
"long long" 지원을 포함하는 여러 C++ 확장자를 사용할 수 있게 합니다.
-I$DB2PATH/include
DB2 포함 파일의 위치를 지정합니다. 예를 들면, $HOME/sqllib/include와 같습니다.
-c
컴파일만 수행하고 링크는 수행하지 마십시오. 컴파일과 링크는 서로 다른 단계입니다.

링크 옵션

aCC
링커에 대한 프론트엔드로 HP aC++ 컴파일러를 사용합니다.
$EXTRA_CFLAG
7 HP-UX 플랫폼에서 IA64 및 64비트 지원이 사용 가능한 경우 이 플래그는7 7 +DD64 -AA 7 값을 포함하고, 32비트 지원이 사용 가능한 경우7 7 +DD32 -AA 7 값을 포함합니다. HP-UX 플랫폼에서 PA-RISC 및 64비트 지원이 사용 가능한 경우,7 +DA2.0W 값을 포함합니다. PA-RISC 플랫폼에서의 32비트 지원을 위해 이 플래그에는 값이 포함되지 않습니다.7 7
7
+DD64
7
IA64의 HP-UX용 64비트 코드를 생성하기 위해 사용되어야 합니다.7
7
+DD32
7
IA64의 HP-UX용 32비트 코드를 생성하기 위해 사용되어야 합니다.7
7 7
-AA
7
IA64에서 이름공간 std 및 C++ 표준 라이브러리와 같은 ANSI C++ 표준 기능을 허용합니다.7
7 7
+DA2.0W
7
PA-RISC의 HP-UX용 64비트 코드를 생성하기 위해 사용되어야 합니다.7
7
-o $1
실행 파일을 지정합니다.
$1.o
프로그램 오브젝트 파일을 지정합니다.
utilemb.o
Embedded SQL 프로그램의 경우, 오류 점검을 위한 Embedded SQL 유틸리티 오브젝트 파일을 포함합니다.
utilapi.o
non-Embedded SQL 프로그램의 경우, 오류 점검을 위한 DB2 API 유틸리티 오브젝트 파일을 포함합니다.
7 7
$EXTRA_LFLAG
7
런타임 경로를 지정합니다. 설정되어 있는 경우, 32비트에 대해서는 -Wl,+b$HOME/sqllib/lib32 값이 포함되며 64비트에 대해서는 -Wl,+b$HOME/sqllib/lib가 포함됩니다. 설정하지 않은 경우, 값을 포함하지 않습니다.7
7 7
-L$DB2PATH/$LIB
7
DB2 런타임 공유 라이브러리의 위치를 지정합니다. 7 32비트의 경우: $HOME/sqllib/lib32; 64비트의 경우:7 $HOME/sqllib/lib.7
-ldb2
DB2 라이브러리로 링크합니다.

추가 컴파일러 옵션에 대한 내용은 해당 컴파일러의 문서를 참조하십시오.



또한 HP-UX에서 사용하는 cc용 옵션들을 보면 아래와 같다. cc는 /usr/bin에 위치하고 있다.

컴파일 옵션:

cc
C 컴파일러
$EXTRA_CFLAG
7 HP-UX 플랫폼에서 IA64 및 64비트 지원이 사용 가능한 경우 이 플래그는7 +DD64 값을 포함하고, 32비트 지원이 사용 가능한 경우7 +DD32 값을 포함합니다. HP-UX 플랫폼에서 PA-RISC 및 64비트 지원이 사용 가능한 경우,7 +DA2.0W 값을 포함합니다. PA-RISC 플랫폼에서의 32비트 지원을 위해 이 플래그에는 값이 포함되지 않습니다.7 7
7
+DD64
7
IA64의 HP-UX용 64비트 코드를 생성하기 위해 사용되어야 합니다.7
7
+DD32
7
IA64의 HP-UX용 32비트 코드를 생성하기 위해 사용되어야 합니다.7
7
+DA2.0W
7
PA-RISC의 HP-UX용 64비트 코드를 생성하기 위해 사용되어야 합니다.7
7
-Ae
HP ANSI 확장 모드를 사용 가능하게 합니다.
-I$DB2PATH/include
DB2 포함 파일의 위치를 지정합니다.
-c
컴파일만 수행하고 링크는 수행하지 마십시오. 컴파일과 링크는 서로 다른 단계입니다.

링크 옵션

cc
링커에 대한 프론트엔드로 컴파일러를 사용합니다.
$EXTRA_CFLAG
7 HP-UX 플랫폼에서 IA64 및 64비트 지원이 사용 가능한 경우 이 플래그는7 +DD64 값을 포함하고, 32비트 지원이 사용 가능한 경우7 +DD32 값을 포함합니다. HP-UX 플랫폼에서 PA-RISC 및 64비트 지원이 사용 가능한 경우,7 +DA2.0W 값을 포함합니다. PA-RISC 플랫폼에서의 32비트 지원을 위해 이 플래그에는 값이 포함되지 않습니다.7 7
7
+DD64
7
IA64의 HP-UX용 64비트 코드를 생성하기 위해 사용되어야 합니다.7
7
+DD32
7
IA64의 HP-UX용 32비트 코드를 생성하기 위해 사용되어야 합니다.7
7
+DA2.0W
7
PA-RISC의 HP-UX용 64비트 코드를 생성하기 위해 사용되어야 합니다.7
7
-o $1
실행 파일을 지정합니다.
$1.o
프로그램 오브젝트 파일을 지정합니다.
utilemb.o
Embedded SQL 프로그램의 경우, 오류 점검을 위한 Embedded SQL 유틸리티 오브젝트 파일을 포함합니다.
utilapi.o
non-Embedded SQL 프로그램의 경우, 오류 점검을 위한 DB2 API 유틸리티 오브젝트 파일을 포함합니다.
7 7
$EXTRA_LFLAG
7
런타임 경로를 지정합니다. 설정되어 있는 경우, 32비트에 대해서는 -Wl,+b$HOME/sqllib/lib32 값이 포함되며 64비트에 대해서는 -Wl,+b$HOME/sqllib/lib가 포함됩니다. 설정하지 않은 경우, 값을 포함하지 않습니다.7
7 7
-L$DB2PATH/$LIB
7
DB2 런타임 공유 라이브러리의 위치를 지정합니다. 7 32비트의 경우: $HOME/sqllib/lib32; 64비트의 경우:7 $HOME/sqllib/lib.7
-ldb2
DB2 라이브러리로 링크합니다.

추가 컴파일러 옵션에 대한 내용은 해당 컴파일러의 문서를 참조하십시오.

반응형
반응형

원본 글 : http://blog.daum.net/hdongle/79096

저번 회사 재직중에는 오라클 접속프로그램 제작시에는 오라클 클라이언트 깔고 어쩌고 하는게 귀찮아서

jdbc thin driver로 접속을 했었죵

하지만 며칠전 MFC로 mssql 접속하는 프로그램을 만들 일이 있었는데 DB가 오라클이란다...젠장...

하여 어케 접속할까 하다가 OCI방식으로 접속하는 방법을 검색해서 한번 적용해 봤음...

1. 다운로드
1-1) 오라클 사이트 접속(http://www.oracle.com/index.html)
1-2) 다운로드 -> Instant Client
1-3) 개발하고자 하는 환경을 받는다
나는 Instant Client for Microsoft Windows (32-bit)
1-4) Accept License Agreement 라디오버튼 체크해주시고
1-5) 나는 오라클 10g 클라이언트 프로그램을 해야 하므로
1-5-1) instantclient-basic-win32-10.2.0.5.zip <= dll파일등
1-5-2) instantclient-sdk-win32-10.2.0.5.zip <= 라이브러리와 헤더파일

물론 다운로드 받을려면 계정은 있어야 한다. 물론 공짜다..ㅋㅋㅋ

2. 프로젝트 생성 및 라이브러리 설정
2-1) 프로젝트를 하나 만든다. 프로젝트 이름은 E:\Work\Test\폴더 아래에 "OciTest" 콘솔로 만들어보자


2-2) 프로젝트 내에 oci라는 폴더를 하나 만들자(여기서는 E:\Work\Test\OciTest\OciTest\oci)
2-2) (1-5-2)에서 다운로드 받았던 파일들 중에 압축을 해제하면 instantclient_10_2\sdk 폴더 아래에 include, lib 폴더를
방금 만들었던 oci 폴더에 복사하자


2-4) 1-5-1에서 다운로드 받았던 파일들중에 dll파일들을 E:\Work\Test\OciTest\OciTest폴더에 복사하자


2-5) 프로젝트 속성페이지에서
2-5-1) 구성속성 -> C/C++ -> General의 Additional Directory : "./oci/include"


2-5-2) 구성속성 -> Linker -> General의 Additional Library Directory : "./oci/lib/msvc"


2-5-3) 구성속성 -> Linger -> Input의 Additional Dependencies : "oci.lib oraocci10.lib"


3. 아래와 같이 코드를 작성한다. 웹에서 어디선가 갖다 배낀것임당..-_- 태클사절

#include "stdafx.h"
#include <occi.h>

using namespace oracle::occi;
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
Environment *env = 0;
Connection *conn = 0;
Statement *stmt = 0;
ResultSet *rs = 0;

try
{
env = Environment::createEnvironment(Environment::DEFAULT);
conn = env->createConnection("system", "xxxxxx", "orcl");

stmt = conn->createStatement("select * from tab");

rs = stmt->executeQuery();

while ( rs->next() )
{
std::string name2 = rs->getString(2);
printf("%s\n", name2.c_str());
}
stmt->closeResultSet(rs);

conn->terminateStatement(stmt);
env->terminateConnection(conn);
Environment::terminateEnvironment(env);
}
catch (oracle::occi::SQLException ex)
{
printf("exception code (%d), %s\n", ex.getErrorCode(), ex.what());
if (rs)
stmt->closeResultSet(rs);
if (stmt)
conn->terminateStatement(stmt);
if (conn)
env->terminateConnection(conn);
if (env)
Environment::terminateEnvironment(env);
}

return 0;
}

4. createConnection 문에서 id, password, 그리고 sid가 들어가는데
sid는 배포시에 오라클 클라이언트 없이 동작하려면 tnsnames.ora파일을 필요로 한다.
현재 폴더에 생성해서 아래의 내용을 입력한다(host에 127.0.0.1대신에 실제 ip주소를 넣어준다)

ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)

다음은 프로젝트 파일이고....

OciTest.zip

oraociei.dll은 사이즈가 큰 관계로 제외되었음.. 빌드하기 위해서는 이 파일을 추가시켜줘야 함

반응형
반응형

원본 글 : http://blog.naver.com/poiq1?Redirect=Log&logNo=80141874162


이번 OCCI를 사용하다가... 큰 문제점에 봉착...ㅇㅂㅇ

쿼리문을 돌리고 나서 전체 row값을 가져온 후 데이터를 처리해야 하는데....

아무리 뒤져봐도 OCCI에서 그런 펑션을 찾기란..... 어려웟다...

꼼수로 쿼리문 두번 돌려서 한번은 총 row가져오고 두번째 쿼리때 데이터 처리했다가... 아무리 생각해봐도 이건 아니다 싶어 변경.

(ps. 혹시 OCCI에서 쓸수 있는법을 아시는분은 쪽지좀....)

아무튼 OCI에선 해당 기능을 가진 OCI_GetRowCount(rs); 함수가 있기 때문에 전면 OCCI -> OCI로 교체!!!

이거 또 처음 써봐서.... 고생고생....

OCI 라이브러리 다운로드

http://orclib.sourceforge.net/download/

여기 들어가보면 OCI 윈도우용과 리눅스 용을 받을 수 있다..!!!

뿐만 아니라 설치방법까지...우후후후...

간단하게 최신버전 3.9.2 버전을 받은 후

아무대나 압축 풀어보고(잘 몰라서 ORACLE_HOME경로에 풀엇음)

그 후 설명대로 폴더에 들어가서

./configure

make

문제는 여기서 발생....

make도중 오류가 발생해 버렷다.......

........

글을 유심히 보니 LD_LIBRARY_PATH 가 안맞아서 나는 오류

현재 나의 LD_LIBRARY_PATH=$ORACLE/lib 로 되여 있지만

make 오류난 곳을 보니 $ORACLE/lib32로 되어 있엇음.

따라서 export LD_LIBRARY_PATH 설정을 다시 해봐도 동일한 오류....

쿨럭;; 그래서 lib에 필요한 파일을 lib32에 넣어줌으로서 해결;;;

그 후 make install로 설치 완료

OCI관련 문구는 해당 사이트의 문서를 받아서 봐도 되고

http://orclib.sourceforge.net/doc/html/index.html

해당 사이트를 참조해도 된다.

[출처] OCI 설정|작성자 소류

반응형
반응형

원본 글 : http://fotog.tistory.com/387
===========================================================================================================================

Oracle 10g Client를 설치할 일이 생겨서, 오라클 7 시절부터 수도 없이 설치했던 Oracle Client 라서
별 부담감 없이 그냥 CD를 구해서 설치를 시작했다.

처음 Oracle 10g client CD에 있는 setup.exe를 실행하면,
아래의 기존 9i client 설치할때와 비슷한 화면을 만난다.

사용자 삽입 이미지

But!! 다음 화면에서 못보던 설치 유형이 추가되었다....

InstantClient!! 이전 9i에서 런타임 모듈 설치가 200MB 가 넘지 않았는데, 10g에서는 런타임이 460MB다.
그저 오라클접속만 하면 되는 Client를 설치하는데, 500MB 가까운 하드를 차지한다는게 낭비로 느껴진다.
자연스럽게 못보던 Instant Client 쪽으로 눈이 돌아간다..
Instant Client 이면 충분하겠지 생각하고, 다음 버튼을 누르고 설치를 했다..

사용자 삽입 이미지

용량이 작아서 그런지 설치는 순식간에 끝나버린다.
하지만 9i 이전에 나오던 net*client관련 설정이 나오지 않는다.

tnsname.ora 파일은 어디에 넣어야 되지?.....

그 이후의 진행사항은 아래 블로그에서 답을 얻었다...

http://blog.naver.com/oct8/100042831960

글을 올려준 분에게 감사할 따름이다...^^

아래는 블로그 내용을 복사해 온 것이다.

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

OCI (Oracle Call Interface)를 사용하여 오라클 데이터베이스에 접속하는 응용프로그램은 배포시 Oracle Client (SQL*Net)를 설치해야 하는 단점이 있습니다.

특히, Oracle Client는 용량이 500M에 육박하기 때문에 패키징화 하여 배포한다 해도 여간 부담스러운 일이 아닐수 없습니다.

이러한 문제를 해결하기 위해 오라클에서는 데이터베이스 접속에 필요한 최소한의 파일들을 모아 오라클 인스턴트 클라이언트를 배포하고 있습니다.

오라클 인스턴트 클라이언트는 그 용량이 50M 내외이고 무료로 사용할 수 있기 때문에 개발자 및 사용자에게 배포 및 설치에 대한 부담을 덜어줄 수 있습니다.

오라클 인스턴트 클라이언트 설치방법 (Windows OS 기준)

(1) 오라클 홈페이지에 접속하여 프로그램을 다운로드 받습니다.

http://www.oracle.com/technology/software/tech/oci/instantclient/index.html

(2) 다운로드 받은 파일의 압축을 해제합니다.

(이하 압축 해제경로를 C:\instantclient_10_2 이라 가정함)

(3) 시스템 환경변수에 다음의 변수들을 추가합니다.

PATH = %PATH%;C:\instantclient_10_2
ORACLE_HOME = C:\instantclient_10_2
TNS_ADMIN = C:\instantclient_10_2
NLS_LANG = KOREAN_KOREA.KO16MSWIN949

(4) C:\instantclient_10_2 경로에 tnsnames.ora 파일을 생성합니다.

반응형

'DB > Oracle' 카테고리의 다른 글

오라클 OCI 함수 사용법  (0) 2013.04.16
OCI를 이용한 오라클 접속  (0) 2011.11.04
OCI 설정.  (0) 2011.11.03
Toad를 사용하여 Oracle XE 접속하기  (0) 2011.09.05
오라클 인스턴스 클라이언트 설치를 해보자  (0) 2011.08.21
반응형



윈도운 버전!

void MakeDirectory(char *full_path)
{
char temp[256], *sp;
strcpy(temp, full_path); // 경로문자열을 복사
sp = temp; // 포인터를 문자열 처음으로

while((sp = strchr(sp, '\\'))) { // 디렉토리 구분자를 찾았으면
if(sp > temp && *(sp - 1) != ':') { // 루트디렉토리가 아니면
*sp = '\0'; // 잠시 문자열 끝으로 설정
//mkdir(temp, S_IFDIR);
CreateDirectory(temp, NULL);
// 디렉토리를 만들고 (존재하지 않을 때)
*sp = '\\'; // 문자열을 원래대로 복귀
}
sp++; // 포인터를 다음 문자로 이동
}

}

MakeDirectory("C:\\TEMP\\BIN\\ABC.txt");

처럼 호출하면

C:\TEMP 디렉토리 만들고

C:\TEMP\BIN 디렉토리 만든다.

유닉스 버전


void MakeDirectory(char *full_path)
{
char temp[256], *sp;

strcpy(temp, full_path); // 경로문자열을 복사
sp = temp; // 포인터를 문자열 처음으로

while((sp = strchr(sp, '/'))) { // 디렉토리 구분자를 찾았으면
if(sp > temp && *(sp - 1) != ':') { // 루트디렉토리가 아니면
*sp = '\0'; // 잠시 문자열 끝으로 설정
mkdir(temp, S_IFDIR | S_IRWXU | S_IRWXG | S_IXOTH | S_IROTH);
// 디렉토리를 만들고 (존재하지 않을 때)
*sp = '/'; // 문자열을 원래대로 복귀
}
sp++; // 포인터를 다음 문자로 이동
}
}

MakeDirectory("/TEMP/BIN/abc.txt");

처럼 호출하면

/TEMP 디렉토리 만들고

/TEMP/BIN 디렉토리 만든다.

생각보다 쉽기도 하고 생각보다 어렵기도 한 내용!! 고생해서 만들었음 으흐흐

반응형
반응형

ftp는 기본적으로 21번 포트를 사용한다.
접속하고자 하는 ip의 21번 포트가 열려 있는지 먼저 확인할 것.

[접속]
ftp [ip 주소]
name : [계정명]
password : [계정 비밀번호]

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

FTP 실행 시 옵션

아래는

Dos의 쉘 명령어로

ftp -n -v -s:fileup.txt

를 실행하기위한 fileup.txt 이다.

fileup.txt 의 내용

open 192.168.10.101
user administrator
mypassword //user 유저 비밀번호 //한줄에 다써도 된다
bin // 바이너리모드로 전송
hash // 다운로드 진행상황 '#'표시
prompt off
cd lcgdir
mput 20070910.*

get afile.abc // afile.abc 다운로드실행
bye //ftp 종료

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

FTP [-v] [-d] [-i] [-n] [-g] [-s:filename] [-a] [-w:windowsize] [-A] [host]

-v Suppresses display of remote server responses.
-n Suppresses auto-login upon initial connection.
-i Turns off interactive prompting during multiple file
transfers.
-d Enables debugging.
-g Disables filename globbing (see GLOB command).
-s:filename Specifies a text file containing FTP commands; the
commands will automatically run after FTP starts.
-a Use any local interface when binding data connection.
-A login as anonymous.
-w:buffersize Overrides the default transfer buffer size of 4096.
host Specifies the host name or IP address of the remote
host to connect to.

 

FTP 명령어

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

ascii : 전송모드를 ASCII모드로 설정한다.(ascii또는 as)

binary : 전송모드를 BINARY모드로 설정한다.( binary또는 bi)

bell : 명령어 완료시에 벨소리를 나게한다.(bell)

bye : ftp접속을 종료하고 빠져나간다.(bye)

cd : remote시스템의 디렉토리를 변경한다.(cd 디렉토리명)

cdup : remote시스템에서 한단계 상위디렉토리로 이동한다.(cdup)

chmod : remote시스템의 파일퍼미션을 변경한다.(chmod 755 index.html)

close : ftp접속을 종료한다. (close)

delete : remote시스템의 파일을 삭제한다.(delete index.old)

dir : remote시스템의 디렉토리 내용을 디스플레이한다.(dir)

disconnect : ftp접속을 종료한다.(disconnect)

exit : ftp접속을 종료하고 빠져나간다.(exit)

get : 지정된 파일하나를 가져온다.(get index.html)

hash : 파일전송 도중에 "#"표시를 하여 전송중임을 나타낸다.(hash)

help : ftp명령어 도움말을 볼 수 있다.(help또는 help 명령어)

lcd : local시스템의 디렉토리를 변경한다.(lcd 디렉토리명)

ls : remote시스템의 디렉토리 내용을 디스플레이한다. (ls 또는 ls -l)

mdelete : 여러개의 파일을 한꺼번에 지울 때 사용한다.( mdelete *.old)

mget : 여러개의 파일을 한꺼번에 가져오려할 때 사용한다. ( mget *.gz)

mput : 한꺼번에 여러개의 파일을 remote시스템에 올린다.(mput *.html)

open : ftp접속을 시도한다.(open 168.126.72.51또는 open ftp.kornet.net)

prompt : 파일전송시에 확인과정을 거친다. on/off 토글 (prompt)

put : 하나의 파일을 remote시스템에 올린다.(put index.html)

pwd : remote시스템의 현재 작업디렉토리를 표시한다.(pwd)

quit : ftp접속을 종료하고 빠져나간다.(quit)

rstatus : remote시스템의 상황(version, 어디서, 접속ID등)을 표시한다.(rstatus)

rename : remote시스템의 파일명을 바꾼다.(remote 현재파일명 바꿀파일명)

rmdir : remote시스템의 디렉토리을 삭제한다.(rmdir 디렉토리명)

size :remote시스템에 있는 파일의 크기를 byte단위로 표시한다.(size index.html)

status : 현재 연결된 ftp세션모드에 대한 설정을 보여준다.(status)

type : 전송모드를 설정한다.(type 또는 type ascii 또는 type binary)

[출처] DOS에서 FTP사용, FTP 명령어|작성자 이천사


참조:

. FTP 명령어

1) 일반 명령어
* help 또는 ? : 명령어 보기.
* ls : 파일 및 디렉토리 목록 보기. shell에서 ls와 같다.
* dir : 파일 및 디렉토리의 접근 권한과 목록을 자세히 출력.
유닉스쉘에서 ls -al과 같은 효과.
* pwd : 현재 디렉토리 위치 확인.
* cd : Remote System에서 디렉토리 이동.
* lcd : Local System의 디렉토리 변경.
파일 수신시 보관하려는 디렉토리를 변경할 때 사용.
* close : ftp> 프롬프트에서 원격지 시스템의 연결을 끝낸다.
ftp 프로그램은 종료하지 않는다.
* disconnect : 원격지 시스템의 접속 종료. ftp 프로그램은 종료하지 않는다.
* quit 또는 bye : 원격지 시스템의 접속을 종료하고 쉘상태로 복귀한다.

2) 환경 설정 명령어
* bin 또는 binary : binary 파일을 전송하기 위한 세팅.
* ascii : text 파일을 전송하기 위한 세팅.
* prompt : mput 또는 mget 명령시 대화형식 처리를 무시.
* hash : 파일의 전송상황 표시. #로 표시.

3) 파일 전송 명령어
* get : 하나의 파일을 Remote System에서 Local System으로 가져 온다.
* mget : 여러 개의 Local System으로 가져 온다.
* put : 하나의 파일을 Local System에서 Remote System으로 올린다.
* mput : 여러 개의 파일을 Remote System으로 올린다.

4) 기타 명령
* ! : 쉘로 잠시 나가 쉘명령을 수행.
* append : Local 시스템에서 원격시스템으로 파일의 전송시 이어받기.
* bell : 명령어 수행 후 벨소리 On/Off.
* case : 파일 전송시 대,소문자 구분을 변환.
* cdup : 상위 디렉토리로 이동.
* cr : 텍스트 파일 전송시 엔터코드(Carriage Return) 유무를 조정.
* delete : 파일 삭제.
* mdelete : 여러 파일 삭제.
* mode : 파일 전송 모드 선택.
* proxy : 지정된 명령어들을 선택적으로 사용.
* recv : 지정한 파일을 Local 시스템으로 전송받는다.
* remotehelp : 원격시스템의 도움말 출력.
* rename : 파일 이름 변경.
* reset : 지정한 환경을 모두 해제.
* rmdir : 디렉토리 삭제.
* send : 원격시스템으로 파일을 전송한다.
* struct : 전송할 파일의 구조를 지정.
* status : 지정한 환경 선택사항의 현재 상태 표시.
* trace : 패킷라인 검사.
* type : 파일 전송 모드 지정.
* user : 사용자 이름(Name:)과 암호 설정.

반응형
반응형



Tar(Tape Archive)는 지정된 여러 개의 파일들을 아카이브라고 부르는 하나의 파일로 만들거나 하나의 아카이브 파일에 집적되어 있는 여러개의 파일을 원래의 형태대로 추출해 내는 유닉스 쉘 명령어이다. tar 아카이브 파일에는 어떻게 파일명을 적든 상관없지만 tar로 묵었다는 것을 분명히 해주기 위해 ".tar" 라는 파일이름 확장자가 붙는다. tar 아카이브 파일 내에 들어있는 파일들은 압축되는 것이 아니라, 단지 하나의 파일로 모아지는 것뿐이다. tar라는 이름은 파일들이 주로 자기테이프에 백업되고, 이따금씩 검색되기도 하던 때로부터 유래하였다. 그러나, 요즘에는 tar 아카이브가 오히려 유닉스 시스템들간에 파일들을 전송하기 위해 좀더 자주 사용되고 있다.

1) tar 옵션
-c, --create : 새 저장 파일을 만든다.
-f, --file : 저장파일에 저장한다.
-x, --extract, --get : 묶는 것을 푼다.
-v, --verbose : 처리중인 과정을 화면에 보여줌.
-z, --gzip, --unzip : gzip으로 압축을 하거나 푼다. z는 모든 기능 포함. --gzip은 압축, --unzip은 압축해제
ex) tar -cvfz [파일명] [경로명] , tar -xvfz [파일명]

-j, --bzip2 : bzip2으로 압축하거나 푼다.
ex) tar -cvfj [파일명] [경로명] , tar -xvfj [파일명]

-r : tar 파일 끝에 파일을 추가한다.
-A : 압축파일에 tar 파일을 추가해서 넣을 때
ex) tar -rvf [tar 파일 경로] [추가파일 경로]

-p : 원본 파일의 퍼미션 유지
-d : 압축 파일과의 비교 (tar 파일과 해당 파일 시스템간의 차이점 확인시)
-t : 압축파일에 압축된 파일 리스트 확인 (tar 파일의 내용을 확인하고자 할 때 사용)
ex) tar -tvf [tar 파일 경로], tar -tvfz [gz 파일 경로]

2) gzip옵션
-1 : 빨리 압축하기
-9 : 압축률이 좋게 압축
ex) gzip -1 [파일 경로]
-d : 압축풀때
ex) gzip -d [gz 확장자 파일 경로]



반응형

'OS > Common' 카테고리의 다른 글

해당 바이너리의 비트 확인하기  (0) 2012.05.21
ftp 사용법 [명령어]  (0) 2011.10.20
unix/linux의 OS 32/64bit 확인 방법  (0) 2011.10.04
Shell에서 \n(newline) 발동하게 하기  (0) 2011.09.07
### 서버관리 명령  (0) 2011.08.21
반응형


참고 : http://uyeong.tistory.com/entry/%ED%8E%98%EB%8F%84%EB%9D%BC%EB%A6%AC%EB%88%85%EC%8A%A4-vsftpd-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0


먼저 rpm 패키지 설치 여부를 확인 한다.
#rpm -qa | grep vsftp

없다면 이곳에서 vsftpd 를 검색하여 해당 원하는 최신 버젼을 다운 받아서 해보자.
현재 2.3.4 정도가 나온 것 같다.
http://rpm.pbone.net/

다운 받았다면 rpm을 이용하여 다운 받은 곳으로 이동하여 설치!

rpm -ivh [파일경로]

설치가 완료되면 service vsftpd start로 시작시킬 수 있다.
설정은 /etc/vsftpd/vsftpd.conf에 있다. (root로 가능)

이후 iptables를 열어 수정한 뒤 21번 포트를 정상적으로 열어준다.
services iptables restart

netstat -na | grep tcp로 21번 포트가 정상적으로 열렸는지 확인한 다음 ftp를 이용해 주면 되겠다!


반응형

'OS > LINUX Common' 카테고리의 다른 글

tmpfs 설정하는 방법  (0) 2014.04.16
GNU tar의 특이성 , 체크섬 오류  (0) 2013.07.09
리눅스 계정관리 ----LINUX  (0) 2011.08.21
Linux에서 JDK 설치  (1) 2011.08.21
리눅스명령어 43개  (0) 2011.08.21
반응형

 




AIX에서 사용하는 사용하는 컴파일러는 IBM에서 제공하는 xl이라는 Compiler가 쓰인다.

이 xl은 xlc로도 쓰이며 _r 이 붙게 되면 Thread-Safe의 의미가 된다.
정확하게 어떤 부분이 Safe한지는 잘 모르겠다.

xl 씨리즈는 굉장히 많은 종류가 있는데 /usr/vacpp/bin에 보면 C++
그리고 /usr/vac/bin에 보면 C에 해당 하는 컴파일러 종류들을 살펴 볼 수 있겠다.


위의 그림은 /usr/vacpp/bin에 들어있는 컴파일러들의 모습.

-----------------------------------------------------------------------------------------------------------------------------
Hard Link 
똑같은 파일이 복사되어 있는 것으로 원복을 삭제해도 복사본의 내용은 남아 있으며 복사본의 내용을 추가하면 원본의 내용에도 추가되는 구조.

Symbolic Link
원본의 파일에 대한 위치와 정보만을 갖고 있음.
-----------------------------------------------------------------------------------------------------------------------------
위 컴파일러들은 모두 기본적으로 xlc의 Symbolic Link가 걸려 있는데 각자 자신이 호출된 이름에 맞는 동작을 한다고 한다.
따라서 xlc를 사용한 것과 xlC를 사용하는 부분은 구분해야 한다.


-----------------------------------------------------------------------------------------------------------------------------
출처 : http://susukang98.springnote.com/pages/377244.xhtml

오래된 머신에서는 xlc가 깔려 있다고 한다.
AIX에서 사용하는 옵션을 살펴보자면

 Version  [kernel 2.x, GCC 2.95.x and later]  4.3 and Later
 2a  shared library creation flag  -bM:SRE
 2b  shared library creation (C++)  cxx -shared -o
xlC -G (or -qmkshrobj)
obsolete:/usr/vacpp/bin/makeC++SharedLib -G -o
(was in /usr/ibmcxx/bin or /usr/lpp/xlC/bin/)
 2c  static archiver (C++)  ar
 3b  file extension  .so (or .a)
 4  executable link options -brtl
-bdynamic
-Lpath -lname
 5a runtime path specification  -blibpath:<path>
(by default, it is set to the arguments of -L)
 5b   Does not build the path for shared libraries into the executable  -blibpath:/usr/lib:/lib
 7 exports file/link option
(see notes)
 .exp
 9  runtime library path  LIBPATH
 11  runtime debugging  LDR_CNTRL
 17  dynamic loading /
dynamic symbol access
 loadquery/loadbind
(AIX 4.2) dlopen / dlsym
 18  utilities  dump -H
ldd (in AIX tools)
 19  documentation man: ld, dump


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

1. 32bit/64bit 컴파일

기본적으로 AIX용 컴파일러는 프로그램을 32bit 모드로 컴파일한다. 원하는 bit 모드를 지정하려면 컴파일러, 아카이버, 링키지 에디터 등을 위해 아래와 같이 bit 모드 옵션이나 환경변수를 사용할 수 있다.

- 컴파일러 옵션: -q32/-q64

- OBJECT_MODE 환경변수: 32/64

- Archive(ar) 옵션: -X32/-X64/-X32_64

- 링키지 에디터(ld) 옵션: -b32/-b64

아래는 64-bit 오브젝트를 생성하도록 컴파일하고 확인하는 예..
  1. $ xlf -c -q64 bt.f
  2. $ dump -ov -X32_64 bt.o
  3. bt.o:
  4. ***Object Module Header***
  5. # Sections Symbol Ptr # Symbols Opt Hdr Len Flags
  6. 4 0x000026fe 81 0 0x0000
  7. Flags=( )
  8. Timestamp = "Feb 14 11:18:07 2002"
  9. Magic = 0x1f7 (64-bit XCOFF)

위와 같이 dump 명령을 사용하면 실행 파일 또는 오브젝트 파일이 32-bit 모드인지 64-bit 모드인지 확인할 수 있는데, 위의 예에서는 '64-bit XCOFF'로 되어 있으므로 64-bit 오브젝트 파일임을 알 수 있다. 또한, dump 명령의 옵션인 -X32_64, -X32, -X64는 대상 파일의 bit 모드를 지정하는 것으로, 모를 때는 위와 같이 -X32_64를 사용하면 된다.

AIX 4.3 환경에서 컴파일한 64-bit 프로그램은 AIX 5L에서는 실행되지 않으므로 AIX 5L용으로 다시 컴파일 해주어야 하지만, 32-bit 프로그램은 AIX5L 이전의 버전에서 컴파일 된 실행파일을 그대로 사용할 수 있다.

운영체제의 32/64-bit 모드는 'ls -l /unix' 명령으로 확인할 수 있는데 /unix가 /usr/lib/boot/unix_64에 링크되어 있으면 64-bit 커널이고, /usr/lib/boot/unix_mp에 링크되어 있으면 32-bit 커널이다.

xlC는 주석을 엄밀히 확인하고 일반적인 c style의 comment에 대해 warnning하는 경우가 있다.

그리고 char type을 default로 unsigned값으로 보고 있다. char타입에 대해 멀티플렛폼으로 작성할 여부가 있는 프로그램의 경우 변수의 type을 char보다는 __uint8같은 명확한 type으로 명확히 정의함이 괜찮은 방법이다.

"sn3crypt.h", line 338.18: 1540-0804 (W) The characters "/*" are detected in a comment.
"sn3ole.h", line 189.73: 1540-0804 (W) The characters "/*" are detected in a comment.
"sn3pcm.h", line 70.17: 1540-0848 (S) The macro name "SN3_ARCHITECTURE" is already defined with a different definition.
"sn3pcm.h", line 54.17: 1540-0425 (I) "SN3_ARCHITECTURE" is defined on line 54 of "sn3pcm.h".
"sn3xls.h", line 51.49: 1540-0804 (W) The characters "/*" are detected in a comment.
make: 1254-004 The error code from the last command is

aix5, xlC컴파일러에서 next를 실행한 오류

컴파일을 하다가 난 warnning과 error이다. 여러 플렛폼에 있는 다양한 컴파일러로 컴파일을 할때 한번에 되지 않느다면 역시 컴파일러의 옵션을 봐야 한다. 여러종류의 컴파일러를 만났을 때 당황하지 말고 믿을 수 있는 것은 컴파일러에서 생성한 경고나 오류, 그리고 컴파일러 옵션임을 잊지 않는다.

위의 경우는 (W)는 warnning (S)에서 에러를 냈으므로 70 line을 찾는다.






반응형
반응형

출처 : http://www.ip6.co.kr/?mid=linux_tip&sort_index=readed_count&listStyle=webzine&document_srl=653

LINUX
# getconf LONG_BIT


HP UX

11.xx 일 경우
# getconf KERNEL_BITS
64

10.xx 일 경우
# getconf LONG_MAX
2147483647
(64비트임)로 확인할 수 있습니다

AIX

현재 load된 kernel 이 32-bit 혹은 64-bit 인지 확인하는 명령어
# bootinfo -K
32

사용중인 machine이 32-bit 혹은 64-bit 인지 확인하는 명령어
# bootinfo -y
32


SOLARIS

# isainfo -kv
64-bit sparcv9 kernel modules
현재 이 시스템은 64bit 커널을 가지고 운영을 하는 시스템 이다.

# isainfo -kv
32-bit sparcv kernel modules
이 시스템은 32bit 커널을 가지고 운영을 하는 시스템이다.

# isainfo -v
64-bit sparcv9 applications 32-bit sparc applications
"-v"만 했을 경우 이 시스템에서는 32bit / 64bit 체계의 프로그램을 사용할 수 있다.

# isainfo -v
32-bit sparc applications
이 시스템은 32bit 체계의 프로그램만 구성하여 사용할 수 있다.
반응형

'OS > Common' 카테고리의 다른 글

ftp 사용법 [명령어]  (0) 2011.10.20
Tar 와 Gzip Bzip2사용법  (0) 2011.10.20
Shell에서 \n(newline) 발동하게 하기  (0) 2011.09.07
### 서버관리 명령  (0) 2011.08.21
서버점검 명령어  (0) 2011.08.20
반응형


레드헷 계열의 Linux에서 방화벽을 설정하는 것과 데비안 계열에서 방화벽을 설정하는 방법은 조금 차이가 있다.
우선 레드헷 계열에서 방화벽을 설정하는 방법에 대해 알아보자.

참고로 setup이나 직접적인 설정은 관리자 계정 혹은 권한이 있어야 가능하다. 참고.

1) 설정방법

/etc/sysconfig/iptables 를 보게 되면 아래와 같은 내용들이 있다.
------------------------------------------------------------------------------------------
# Firewall configuration written by system-config-securitylevel
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 23 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 25 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 137 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 138 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 139 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 445 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 1414 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT
------------------------------------------------------------------------------------------

뭔가 복잡해 보이지만 사용법은 의외로 간단하다.
알아놓을 것은 INPUT/OUPUT 을 조정할 수 있으며 ACCEPT/REJECT를 조정할 수 있다는 것이다.
방화벽에서 열고자 하는 특정 포트가 있다면 아래 한줄을 복사한 뒤 포트 번호만 바꿔서 추가해주면 되겠다. 나머지는 설정임.
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 포트번호 -j ACCEPT

만약에 15000번 포트를 열고 싶다면
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 15000 -j ACCEPT
이라고 추가한 뒤 :wq 치고 나오면 되겠다.

2) 방화벽 start/stop/restart

설정한 방화벽내용을 적용하여 구동하기 위해서는 방화벽을 다시 시작해야 한다.
RedHat 계열에서는 /etc/init.d/iptables 에 구동 쉘파일이 있다.

$] iptables restart
를 해주게 되면 위에서 설정한 포트를 열고 재시작을 하게 된다. (자세한 사용법은 직접 파일을 열고 쉘을 보시면 되겠다)
사용법: ./iptables {start|stop|restart|condrestart|status|panic|save}
아래 중에 한가지 옵션을 사용하도록.

또 다른 방법은 명령 프롬프트 창에서 setup 이라고 치면 아래와 같은 설정 화면이 나온다.

저곳에서 방화벽 설정 메뉴에 들어가 방화벽 해제를 하고 다시 시작할 수 있다. 전체적인 방화벽 해제나 설정시 해당 방법을 이용하자.



반응형

+ Recent posts