디스어셈블된 프로그램 디버깅

디버그 정보 없이 컴파일되거나 어셈블된 프로그램을 디버깅하려는 경우 디스어셈블리 보기를 사용할 수 있습니다. 디스어셈블리 보기를 사용할 때는 원본 소스 프로그램의 기호 정보(프로그램 변수, 레이블 및 메모리 섹션에 대한 기타 기호 참조)를 사용할 수 없습니다. 디스어셈블리 보기를 사용하려면 DYNDEBUG 스위치가 ON으로 설정되어 있어야 합니다.

디버깅하는 프로그램에 대해 잘 모르는 경우에는 프로그램 디버깅 중 사용할 수 있는 HLASM(High Level Assembler)이나 컴파일러가 작성한 목록의 사본을 가지고 있는 것이 좋습니다. 디스어셈블리 보기를 사용하기 위해 프로그램이 준수해야 할 특별한 어셈블리 또는 컴파일 요구사항은 없습니다.

SET ASSEMBLER 및 SET DISASSEMBLY 명령

SET ASSEMBLER ONSET DISASSEMBLY ON 명령은 몇 가지 같은 기능을 사용 가능하게 합니다. 그러나 사용할 명령을 결정하기 전에 디버깅할 CU의 유형(어셈블러, 디스어셈블리 또는 둘 다)을 고려해야 합니다. 다음은 사용할 명령을 결정하는 데 유용한 가이드라인입니다.

어셈블러 CU를 디버깅하고 있는데 나중에 디스어셈블리 CU를 디버깅하려는 경우 SET ASSEMBLER ON 명령을 입력한 후에 SET DISASSEMBLY ON 명령을 입력할 수 있습니다.

디스어셈블리 보기의 기능

디스어셈블리 보기를 사용할 때는 다음 태스크를 수행할 수 있습니다.

디스어셈블리 보기 시작

디스어셈블리 보기를 시작하려면 다음을 수행하십시오.

  1. SET DISASSEMBLY ON 명령을 입력하십시오.
  2. 디버그 데이터가 포함되지 않은 프로그램을 여십시오. 이것은 Debug Tool의 언어 설정을 Disassem으로 변경하고 소스 창에 어셈블러 코드를 표시합니다.

디버그 데이터가 포함된 프로그램을 실행하면 언어 설정이 변경되지 않고 소스 창에 디스어셈블리 코드가 표시되지 않습니다.

디스어셈블리 보기

디스어셈블리 보기를 통해 프로그램을 디버깅할 때는 소스 창에 디스어셈블리 명령어가 표시됩니다. Debug Tool 화면의 언어 영역(왼쪽 맨 위)에 디스어셈이라는 단어가 표시됩니다. Debug Tool 화면은 다음과 같습니다.

디스어셈 위치: MAIN 초기화
Command ===>                                                   Scroll ===> PAGE
모니터  --+----1----+----2----+----3----+----4----+----5----+----6      행: 0/0
*******************************  모니터 맨 위  ********************************
********************************  모니터의 끝  ********************************



소스: MAIN   +----1----+----2----+----3----+----4----+----5----+      행: 1/160
      0 1950C770    47F0 F014       BC    15,20(,R15)                         .
    A 4 1950C774    00C3            ????                                      .
      6 1950C776 B  C5C5            ????                                      .
      8 1950C778    0000            ????                                      .
      A 1950C77A    0080 C          ????                                      .
      C 1950C77C    0000            ????                                      .
      E 1950C77E    00C4            ???? D                                    .
     10 1950C780    47F0 F001       BC    15,1(,R15)                          .
     14 1950C784    90EC D00C       STM   R14,R12,12(R13)                     .
     18 1950C788    18BF            LR    R11,R15   E                         .
     1A 1950C78A    5820 B130       L     R2,304(,R11)                        .
     1E 1950C78E    58F0 B134       L     R15,308(,R11)                       .
     22 1950C792    05EF            BALR  R14,R15                             .
     24 1950C794    1821            LR    R2,R1                               .
     26 1950C796    58E0 C2F0       L     R14,752(,R12)                       .
     2A 1950C79A    9680 E008       OI    8(R14),128                          .
     2E 1950C79E    05B0            BALR  R11,0                               .
로그 ----+----1----+----2----+----3----+----4----+----5----+----6-      행: 1/5
********************************* 로그 맨 위 **********************************
IBM Debug Tool 버전 11 릴리스 1 모드 0
11/06/2010 4:11:41 PM
5655-W45: Copyright IBM Corp. 1992, 2010
0004 EQA1872E 다음 파일을 여는 동안 오류 발생: INSPPREF. 파일이 없거나
0005          액세스할 수 없습니다.
0006 SET DISASSEMBLY ON ;
PF  1:?           2:STEP       3:QUIT       4:LIST       5:FIND      6:AT/CLEAR
PF  7:UP          8:DOWN       9:GO        10:ZOOM      11:ZOOM LOG 12:RETRIEVE
 A  접두부 영역
CU 또는 CSECT 시작으로부터의 오프셋을 표시합니다.
 B  1-8열
메모리의 시스템 명령어 주소를 표시합니다.
 C  13-26열
메모리의 시스템 명령어를 표시합니다.
 D  29-32열
op-code 니모닉 또는 ????(op-code가 올바르지 않은 경우)를 표시합니다.
 E  35-70열
디스어셈블된 시스템 명령어를 표시합니다.

디스어셈블리 보기를 사용할 때는 소스 영역에 표시되는 디스어셈블리 명령어의 정확성을 보장할 수 없습니다. 이는 데이터와 명령어를 항상 구별할 수는 없기 때문입니다. 명령어가 정확하지 않을 수도 있으므로 컴파일러나 HLASM이 작성한 목록의 사본을 가지고 있는 것이 좋습니다. Debug Tool은 시스템 코드를 처리할 때마다, 예를 들어, STEP 명령을 실행할 때마다 소스 창을 새로 고쳐서 디스어셈블리 보기를 가능한 한 정확하게 유지하려고 합니다.

디스어셈블리 보기에서 단일 단계 조작 수행

STEP 명령을 사용하여 프로그램을 단일 스텝으로 실행할 수 있습니다. 디스어셈블리 보기에서 한 디스어셈블리 명령어에서 다음 디스어셈블리 명령어로 step하십시오. Debug Tool은 다음에 실행할 명령어를 강조표시합니다.

프로그램을 호출한 프로그램으로 step back하려면 호출 프로그램의 돌아갈 명령어에 중단점을 설정하십시오. 다른 프로그램으로 step over하려면 다른 프로그램을 호출하는 명령어 바로 뒤에 중단점을 설정하십시오. 프로그램에서 step out하려고 하면 Debug Tool이 경고 메시지를 표시하고 적절한 중단점을 설정할 수 있게 해 줍니다. 그런 다음, 단일 스텝 조작을 수행할 수 있습니다.

Debug Tool은 표시된 디스어셈블리 명령어가 더 이상 올바르지 않다고 판달될 때마다 디스어셈블리 보기를 새로 고칩니다. 프로그램을 step through하는 중에 디스어셈블리 보기가 새로 고쳐질 수 있습니다.

디스어셈블리 보기에서 중단점 설정

디스어셈블리 보기를 통해 프로그램을 디버깅할 때는 특수 중단점을 사용할 수 있습니다. AT OFFSET은 CSECT의 시작점 주소가 시작되는 곳을 기준으로 계산된 지점에 중단점을 설정합니다. 명령행에 AT OFFSET 명령을 입력하거나 중단점을 설정할 행의 접두부 영역에 커서를 놓고 AT 기능 키를 누르거나 접두부 영역에 AT을 입력하여 중단점을 설정할 수 있습니다.

Debug Tool을 사용하면 주소가 올바른 op-code이며 짝수 오프셋인 CU 또는 CSECT의 시작과 끝 주소 범위 내에 있는 모든 위치에 중단점을 설정할 수 있습니다. 올바르지 않은 오프셋에 중단점을 설정하지 않으려면 컴파일러나 HLASM이 작성한 목록의 사본을 참조하여 오프셋을 확인하는 것이 좋습니다.

자체 수정 코드 디버깅 관련 제한사항

Debug Tool에서는 자체 수정 코드를 디버깅할 수 없습니다. 포함된 컴파일 단위를 디버깅하는 동안 명령어를 수정하는 자체 수정 코드가 프로그램에 있는 경우 Debug Tool의 비정상 종료(ABEND)와 같이 예측할 수 없는 결과를 초래할 수 있습니다. 포함된 컴파일 단위를 디버깅하는 동안 명령어를 완전히 대체하는 자체 수정 코드가 프로그램에 있는 경우, ABEND가 발생하지 않을 수 있습니다. 그러나 Debug Tool에서 해당 명령어에 대한 중단점을 찾지 못하거나 삭제 시 올바르지 않은 후크 주소를 나타내는 메시지가 표시될 수 있습니다.

다음 코딩 기술을 사용하여 자체 수정 코드 디버깅과 관련된 문제점을 최소화할 수 있습니다.

  1. 명령어 부분을 수정하지 말고, 명령어를 대체하십시오. 다음 표는 코딩 기술을 비교해 놓은 것입니다.
    명령어를 수정하는 코딩 명령어를 대체하는 코딩
    ModInst  BC 0,Target
       ...
       MVI ModInst+1,X'F0'
    ModInst  BC 0,Target
       ...
       MVC ModInst(4),NewInst
       ...
    NewInst  BC 15,Target
  2. 실행 가능한 명령어 대신 DC 명령어를 사용하여 수정할 명령어를 정의하십시오. 예를 들어, MVC ModInst(4),NewInst 명령어 대신 ModInst DC X'4700',S(Target) 명령어를 사용하십시오.

디스어셈블리 보기에서 레지스터 표시 및 수정

LIST REGISTERS 명령을 사용하여 모든 레지스터의 컨텐츠를 표시할 수 있습니다. 개별 레지스터의 컨텐츠를 표시하려면 LIST Rx 명령을 사용하시시오. 여기서, x는 개별 레지스터의 번호입니다. 레지스터에 커서를 놓고 LIST 기능 키를 눌러 개별 레지스터의 컨텐츠를 표시할 수도 있습니다. 기본 LIST 기능 키는 PF4입니다. 어셈블러 지정 명령문을 사용하여 레지스터의 컨텐츠를 수정할 수 있습니다.

디스어셈블리 보기에서 스토리지 표시 및 수정

LIST STORAGE 명령을 사용하여 스토리지의 컨텐츠를 표시할 수 있습니다. STORAGE 명령을 사용하여 스토리지의 컨텐츠를 수정할 수 있습니다.

어셈블러 명령문을 사용하여 스토리지를 표시하고 수정할 수도 있습니다. 예를 들어, 레지스터 2의 주소로 찾은 4바이트를 0으로 설정하려면 다음 명령을 입력하십시오.

R2-> <4>=0

4바이트가 0으로 설정되었는지 확인하려면 다음 명령을 입력하십시오.

LIST R2->

디스어셈블리 보기에 표시되는 프로그램 변경

SET QUALIFY 명령을 사용하여 디스어셈블리 보기에 표시되는 프로그램을 변경할 수 있습니다. ABC 프로그램을 디버깅하고 있으며 BCD 프로그램에 중단점을 설정해야 한다고 가정해 보십시오.

  1. 명령행에 SET QUALIFY CU BCD 명령을 입력하십시오. BCD 프로그램의 디스어셈블리 명령어가 표시되도록 Debug Tool의 소스 창이 변경됩니다.
  2. 중단점을 설정할 명령어를 찾을 때까지 소스 창을 화면이동하십시오.
  3. ABC 프로그램으로 돌아가려면, 다음 명령어를 실행할 지점에서 SET QUALIFY RESET 명령을 실행하십시오.

디스어셈블리 보기 제한사항

디스어셈블된 프로그램을 디버깅할 때는 다음 제한사항이 적용됩니다.

디스어셈블리 보기를 통해 프로그램을 디버깅할 때, 다음과 같은 상황에서는 Debug Tool이 애플리케이션을 중지할 수 없습니다.

Debug Tool이 올바른 저장 영역 백체인을 찾을 때까지 애플리케이션이 실행됩니다.