반응형
출처 : http://www.codeproject.com/Articles/31382/Memory-Leak-Detection-Using-Windbg


Detecting memory leaks using Windbg.

Introduction

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

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

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

Using Windbg

To start working with Windbg:

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

cmd.JPG

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

attach.JPG

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

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

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

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

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

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

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

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

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

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

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

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

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

Shown below is the output for the command:

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

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

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

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

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

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


반응형

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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



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

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


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

 

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

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

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

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

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

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

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

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

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

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

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

10. !heap -p -a usrptr 


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

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


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

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

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

- ~ Thread 관련 명령

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

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

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

0:001> ~

The following command will also display all threads:

0:001> ~*

The following command will display the currently active thread:

0:001> ~.

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

0:001> ~#

The following command will display thread number 2:

0:001> ~2

Here is an example of the output of this command:

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

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

- LD : (load Symbols)

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


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


심볼서버

To use the Microsoft Symbol Server

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

2. Start a debugging session.

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

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

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

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

장애의종류

Crash: Heap Corrupt, AV(Access Violation)

Hang: Deal lock, Orphaned thread, contention..

Leak: Memory Leak

장애 종류에 따른 대처

Crash:

Access Violation

- adplus.vbs > CDB 사용

- Tlist process id확인 (id)

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

Heap Corrupt

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

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

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

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

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

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

gflags -r +hpa

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

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

gflags -r -hpa

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

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

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

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

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

Gflags.exe –p /enable lsass.exe

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

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

Gflags.exe -p /disable lsass.exe

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

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

Gflags.exe –p

* Hang 장애

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

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

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

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

* 메모리 누수

Windows 2000/XP, 2003 이상의 경우

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

반응형

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

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


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




WinDbg란?!

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

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



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


[덤프 디버깅]

1.유져모드 덤프 디버깅

2.커널모드 덤프 디버깅


(언제 다 정리하지?!)


[디버깅 방법]

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

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

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



[명령어]

k : 콜스택 보기

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

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

u 주소값: 어셈보기



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













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

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

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

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

kd> .symfix e:\symbols

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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


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

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


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

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



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

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

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



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

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

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


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

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

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


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


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


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

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

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


구조체 내용 보기

!strct _KMUTANT ff93a330

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


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

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

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


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

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

.logxxx 계열 명령어입니다.


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

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

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



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





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

사용자 삽입 이미지


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

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

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

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

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

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

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

◎ 주요 명령어


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




참고 자료

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

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

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

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

windbg shell command

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

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

지역변수 보기
dv

콜스택 보기
kb

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

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

Display Exception Context Record
.ecxr

레지스터 보기
r

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

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

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

프로세스 리스팅
!process 0 0

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


할당된 가상메모리 덤프

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

!vadump [-v]


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

!vprot [주소]


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

!uniqstack [-b]

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


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

!token


각 스레드가 동작한 시간

!runaway


레지스트리 정보 확인

!dreg

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


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

!ustr [주소]

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


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

!str [주소]

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



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

!tls

모든 슬롯 출력

예) !tls -1

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

예) !tls 0


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

!teb


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

!peb


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

!stl


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

lm


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

!lmi [모듈]

예) !lmi 00400000


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

!list

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


현재 Shared User-mode Page를 출력함

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

!kuser


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

!imgreloc [주소]


최근 에러코드를 리턴한다

!gle


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

!error [에러코드번호]


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

!gflag


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

!for_each_module ["명령어"]

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

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


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

.imgscan


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

.formats [표현식]

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

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

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


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


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


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


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


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


반응형
반응형

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

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

 

원문 출처

http://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

+ Recent posts