디버그 정보 없이 컴파일되거나 어셈블된 프로그램을 디버깅하려는 경우 디스어셈블리 보기를 사용할 수 있습니다. 디스어셈블리 보기를 사용할 때는 원본 소스 프로그램의 기호 정보(프로그램 변수, 레이블 및 메모리 섹션에 대한 기타 기호 참조)를 사용할 수 없습니다. 디스어셈블리 보기를 사용하려면 DYNDEBUG 스위치가 ON으로 설정되어 있어야 합니다.
디버깅하는 프로그램에 대해 잘 모르는 경우에는 프로그램 디버깅 중 사용할 수 있는 HLASM(High Level Assembler)이나 컴파일러가 작성한 목록의 사본을 가지고 있는 것이 좋습니다. 디스어셈블리 보기를 사용하기 위해 프로그램이 준수해야 할 특별한 어셈블리 또는 컴파일 요구사항은 없습니다.
SET ASSEMBLER ON 및 SET DISASSEMBLY ON 명령은 몇 가지 같은 기능을 사용 가능하게 합니다. 그러나 사용할 명령을 결정하기 전에 디버깅할 CU의 유형(어셈블러, 디스어셈블리 또는 둘 다)을 고려해야 합니다. 다음은 사용할 명령을 결정하는 데 유용한 가이드라인입니다.
어셈블러 CU를 디버깅하고 있는데 나중에 디스어셈블리 CU를 디버깅하려는 경우 SET ASSEMBLER ON 명령을 입력한 후에 SET DISASSEMBLY ON 명령을 입력할 수 있습니다.
디스어셈블리 보기를 사용할 때는 다음 태스크를 수행할 수 있습니다.
디스어셈블리 보기를 시작하려면 다음을 수행하십시오.
디버그 데이터가 포함된 프로그램을 실행하면 언어 설정이 변경되지 않고 소스 창에 디스어셈블리 코드가 표시되지 않습니다.
디스어셈블리 보기를 통해 프로그램을 디버깅할 때는 소스 창에 디스어셈블리 명령어가 표시됩니다. 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
디스어셈블리 보기를 사용할 때는 소스 영역에 표시되는 디스어셈블리 명령어의 정확성을 보장할 수 없습니다. 이는 데이터와 명령어를 항상 구별할 수는 없기 때문입니다. 명령어가 정확하지 않을 수도 있으므로 컴파일러나 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에서 해당 명령어에 대한 중단점을 찾지 못하거나 삭제 시 올바르지 않은 후크 주소를 나타내는 메시지가 표시될 수 있습니다.
다음 코딩 기술을 사용하여 자체 수정 코드 디버깅과 관련된 문제점을 최소화할 수 있습니다.
| 명령어를 수정하는 코딩 | 명령어를 대체하는 코딩 |
|---|---|
ModInst BC 0,Target ... MVI ModInst+1,X'F0' |
ModInst BC 0,Target ... MVC ModInst(4),NewInst ... NewInst BC 15,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 프로그램에 중단점을 설정해야 한다고 가정해 보십시오.
디스어셈블된 프로그램을 디버깅할 때는 다음 제한사항이 적용됩니다.
디스어셈블리 보기를 통해 프로그램을 디버깅할 때, 다음과 같은 상황에서는 Debug Tool이 애플리케이션을 중지할 수 없습니다.
Debug Tool이 올바른 저장 영역 백체인을 찾을 때까지 애플리케이션이 실행됩니다.