다중 언어 애플리케이션 디버깅

다중 상위 레벨 프로그래밍 언어(HLL)를 지원하기 위해 Debug Tool은 해당 명령을 HLL에 맞게 하고 다양한 HLL의 대화식 서브세트 명령을 제공하고 각 언어에서 데이터 유형의 공통 속성을 맵핑합니다. HLL 표현식을 평가하고 상수와 변수를 처리합니다.

아래의 주제는 Debug Tool이 여러 언어, 구조, 규칙, 변수, 표현식 평가 메소드 등으로 구성된 프로그램을 디버깅할 수 있는 방법을 설명합니다.

일반 규칙은 Debug Tool이 언어 자체를 Debug Tool이 작동하는 방법의 지침으로 사용하려고 하는 것입니다.

이 절에서 설명하는 자료와 연관된 자세한 정보에 대해서는 다음 주제를 참조하십시오.

HLL 표현식의 Debug Tool 평가

표현식을 입력하면 Debug Tool은 해당 시간에 올바른 프로그래밍 언어를 기록합니다. 표현식이 실행되면 Debug Tool은 표현식을 입력할 때의 올바른 언어 런타임으로 표현식을 전달합니다. 이 런타임은 표현식이 실행될 때의 런타임과 다를 수 있습니다.

즉시 실행되지 않는 표현식을 입력하면 모든 프로그램 변수를 완전히 규정해야 합니다. 변수를 규정하면 표현식이 실행될 때 올바른 컨텍스트 정보(예: 로드 모듈 및 블록)가 언어 런타임으로 전달됩니다. 그렇지 않으면 컨텍스트는 중단점을 설정할 때 예상한 중단점이 아닐 수 있으며 언어 런타임이 표현식을 평가하지 않을 수 있습니다.

이 절에서 설명하는 자료와 연관된 자세한 정보에 대해서는 다음 주제를 참조하십시오.

HLL 변수 및 상수에 대한 Debug Tool 해석

Debug Tool은 HLL 변수와 상수를 테스트 프로그램의 부분 평가 및 세션 변수의 선언과 사용의 일부로서 사용하는 것을 지원합니다.

Debug Tool에 지원되는 세 가지 일반적인 유형의 변수는 다음과 같습니다.

HLL 변수

일부 변수 참조에서는 포인터 참조 또는 아래 첨자 평가와 같은 언어별 평가가 필요합니다. Debug Tool은 각 경우를 다시 한 번 해당 HLL의 방식으로 해석합니다. 다음은 Debug Tool이 현재 프로그래밍 언어별로 다른 양식의 참조를 허용하는 일부 영역에 대한 목록입니다.

HLL 상수

문자열 상수와 숫자 상수를 사용할 수 있습니다. Debug Tool은 C 및 C++, COBOL 및 PL/I로 된 두 유형의 상수를 허용합니다.

HLL 명령과 유사한 Debug Tool 명령

디버그 세션 중에 익숙한 명령을 사용할 수 있도록 Debug Tool은 각 언어의 명령에 대해 해석 가능한 서브세트를 제공합니다. 이 서브세트는 Debug Tool에 사용되거나 애플리케이션을 쓸 때 같은 구문을 갖는 명령으로 구성됩니다. 이러한 명령은 원본 언어에서 코딩된 것처럼 Debug Tool에 사용됩니다.

현재 프로그래밍 언어를 원하는 언어로 설정하려면 SET PROGRAMMING LANGUAGE 명령을 사용하십시오. 현재 프로그래밍 언어는 명령의 구문 분석 방법을 결정합니다. SET PROGRAMMING LANGUAGEAUTOMATIC으로 설정하면 현재 자격 부여가 다른 언어의 모듈로 변경될 때마다 현재 프로그래밍 언어가 자동으로 갱신됩니다.

다음 유형의 Debug Tool 명령은 지원되는 각 프로그래밍 언어의 해당 명령문(정의된 경우)과 같은 구문(또는 해당 서브세트)을 갖습니다.

지정
이 명령을 사용하면 해당 값을 변수나 참조에 지정할 수 있습니다.
조건부
이 명령은 표현식을 평가하고 결과 값에 따라 Debug Tool 명령의 실행 플로우를 제어합니다.
선언
이 명령을 사용하면 세션 변수를 선언할 수 있습니다.
루핑
이 명령을 사용하면 반복 또는 논리 루프를 Debug Tool 명령으로 프로그래밍할 수 있습니다.
다중 경로
이 명령을 사용하면 다중 경로 논리를 Debug Tool 명령 언어로 프로그래밍할 수 있습니다.

또한 Debug Tool은 일부 언어에 대해 특수 명령을 지원합니다.

변수 규정 및 보기 지점 변경

각 HLL은 단일 컴파일 단위 내에서 이름이 사용될 때(예를 들어, 다른 두 프로시저에서 같은 변수명을 사용할 경우) 참조된 데이터를 알 수 있도록 이름 범위 개념을 정의합니다. 마찬가지로 Debug Tool은 포함된 서브루틴 수에 관계없이 프로그램의 모든 변수를 참조할 수 있도록 런타임 환경의 규정자와 보기 지점의 개념을 정의합니다. 지정 x = 5는 Debug Tool이 처리하기에 어렵지 않습니다. 그러나 x를 둘 이상의 서브루틴에 선언하면 더 이상 그렇지 않습니다. x가 현재 실행 중인 컴파일 단위가 아니면 Debug Tool에 올바른 x를 결정하도록 알려야 합니다.

또한 현재 볼 수 없는 변수(즉, HLL의 이름 범위 개념에 따라 현재 실행 중인 블록 또는 컴파일 단위의 범위 내에 속하지 않는 변수)를 참조할 수 있도록 Debug Tool의 보기 지점을 변경해야 합니다.

이 절에서 설명하는 자료와 연관된 자세한 정보에 대해서는 다음 주제를 참조하십시오.

변수 규정

자격 부여는 특정 변수가 속한 프로시저 또는 로드 모듈을 지정하는 데 사용할 수 있는 메소드입니다. 자격 부여는 다음과 같이 변수 앞에 블록, 컴파일 단위 및 로드 모듈(또는 필요한 수의 레이블)을 붙이고 각 레이블을 콜론(또는 로드 모듈 스펙 뒤에 이중 콜론)과 이상 부호(:>)로 구분합니다.

load_name::>cu_name:>block_name:>object

명시적 자격 부여라고 하는 이 프로시저에서 Debug Tool은 변수의 위치를 정확히 알 수 있습니다.

필요한 경우 load_name은 로드 모듈 이름입니다. 프로그램이 여러 로드 모듈로 구성되고 자격 부여를 현재 로드 모듈 이외의 로드 모듈로 변경할 경우에만 필요합니다. load_name은 Debug Tool 변수 %LOAD가 될 수 있습니다.

필요한 경우 cu_name은 컴파일 단위 이름입니다. cu_name은 자격 부여를 현재 규정된 컴파일 단위 이외의 컴파일 단위로 변경할 경우에만 필요합니다. cu_name은 Debug Tool 변수 %CU입니다.

필요한 경우 block_name은 프로그램 블록명입니다. block_name은 자격 부여를 현재 규정된 블록 이외의 블록으로 변경할 경우에만 필요합니다. block_name은 Debug Tool 변수 %BLOCK이 될 수 있습니다.

PL/I 전용:

C++ 전용:

현재 실행 중인 컴파일 단위의 변수에 접두사를 붙이지 않아도 됩니다. 이러한 변수는 이미 Debug Tool이 알고 있으며 암시적으로 규정됩니다.

작동할 변수를 규정하려면 각 블록에 이름이 있어야 합니다. 이름이 지정되지 않은 블록은 %BLOCKnnn 양식을 사용하여 Debug Tool에 의해 이름이 지정됩니다. 여기서, nnn은 프로그램에서 블록의 위치와 관련된 숫자입니다. 현재 블록에 대한 Debug Tool의 이름을 찾으려면 DESCRIBE PROGRAMS 명령을 사용하십시오.

이 절에서 설명하는 자료와 연관된 자세한 정보에 대해서는 다음 주제를 참조하십시오.

보기 지점 변경

보기 지점은 보통, 현재 실행 중인 블록입니다. 다음 피연산자와 함께 SET QUALIFY 명령을 사용하여 보기 지점을 변경하면 액세스할 수 없는 데이터를 가져올 수 있습니다.

load_name::>cu_name:>block_name

세 개의 Debug Tool 변수 %CU, %PROGRAM 또는 %BLOCK를 갱신할 때마다 네 변수(%CU, %PROGRAM, %LOAD%BLOCK)가 모두 자동으로 갱신되어 새 보기 지점을 반영합니다. SET QUALIFY LOAD를 사용하여 %LOAD를 변경하면 %LOAD만 새 보기 지점로 갱신됩니다. 나머지 세 Debug Tool 변수는 변경되지 않습니다. 예를 들어, 해당 프로그램이 현재 loadx::>cux:>blockx에서 일시중단되었다고 가정해보십시오. 또한 컴파일 단위 cuz와 블록 blockz가 포함된 로드 모듈 loadz는 Debug Tool에 알려져 있습니다. 현재 적용되는 설정은 다음과 같습니다.

다음 명령을 입력하면

SET QUALIFY BLOCK blockz;

SET QUALIFY BLOCK cuz:>blockz;

SET QUALIFY BLOCK loadz::>cuz:>blockz;

다음과 같은 설정이 적용됩니다.

여러 개의 enclave가 있는 프로그램을 디버깅할 경우 SET QUALIFY를 사용하여 보기 지점을 새 블록, 컴파일 단위 또는 로드 모듈로 재설정하고 enclave에서 참조와 명령문 번호를 식별할 수 있습니다.

Debug Tool의 조건 및 예외 처리

애플리케이션이 비정상적으로 종료되기 직전에 프로그램 실행을 일시중단하려면 다음과 같은 런타임 옵션을 사용하여 애플리케이션을 시작하십시오.

TRAP(ON)
TEST(ALL,*,NOPROMPT,*)

조건이 애플리케이션에 알려지면 Debug Tool이 프롬프트를 표시하고 문제점을 동적으로 코딩할 수 있습니다. 예를 들어, GOTO 명령을 사용하여 포인터를 초기화하고 메모리를 할당하거나 프로그램의 과정을 변경할 수 있습니다. GO BYPASS 명령을 실행하여 Language Environment의 조건 핸들러에 조건을 처리했음을 표시할 수도 있습니다. 조건을 발생시킨 명령어를 따르는 일부 코드는 올바르게 저장되거나 처리되지 않은 데이터를 사용할 수도 있습니다.

Debug Tool을 사용하여 디버깅할 경우 호스트 시스템에 따라 디버거에 프로그램 예외와 조건을 처리하도록 명령하거나 자체의 예외 핸들러로 전달할 수 있습니다. 또한 프로그램은 Language Environment 서비스에 액세스하여 프로그램 예외와 조건을 처리할 수 있습니다.

이 절에서 설명하는 자료와 연관된 자세한 정보에 대해서는 다음 주제를 참조하십시오.

Debug Tool의 조건 처리

디버깅 세션 중에 두 메소드 중 하나를 사용하거나 둘 다 사용하여 HLL 조건이 발생할 때 Debug Tool이 제어하는지 확인할 수 있습니다.

디버그 세션을 시작할 때 TEST(ALL)를 런타임 옵션으로 지정하면 Debug Tool은 대부분의 조건이 발생할 때 제어합니다.

주:
Debug Tool은 Language Environment 오류 처리 기능으로 감지된 모든 Language Environment 조건을 인식합니다.

AT OCCURRENCE 명령으로 중단점을 정의하여 조건이 발생할 때 Debug Tool이 응답하도록 할 수도 있습니다. 이러한 중단점은 Debug Tool에 제어를 위임한 후 조건이 발생할 때 프로그램 처리를 정지합니다. 그런 다음, 중단점을 정의할 때 지정한 명령을 처리합니다.

조건은 여러 방식으로 발생하며 조건을 처리하는 방법도 여러 가지가 있습니다.

조건이 발생할 수 있는 경우

조건은 다음과 같은 경우 Debug Tool 중에 발생할 수 있습니다.

조건이 발생하는 경우

HLL 조건이 발생한 경우 연관된 액션과 함께 중단점이 정의되어 있으면 해당 액션이 먼저 수행됩니다. 그 다음에 수행할 사항은 액션이 어떻게 종료되는지에 따라 다릅니다.

정의된 중단점 실행 후 GO를 제어가 사용하여 프로그램으로 리턴하면 프로그램에서 조건이 다시 발생합니다(가능한 경우). GOTO를 사용하여 실패한 명령문을 생략하면 프로그램의 오류 처리 기능도 생략됩니다.

이 절에서 설명하는 자료와 연관된 자세한 정보에 대해서는 다음 주제를 참조하십시오.

표현식 내의 예외 처리(C, C++ 및 PL/I 전용)

Debug Tool 표현식에서 0으로 나누기와 같은 예외가 발견되면 Debug Tool 명령 SET WARNING을 사용하여 Debug Tool과 프로그램 응답을 제어할 수 있습니다. 이러한 예외는 대화식 Debug Tool 세션 도중 입력 오류로 인해 발생하므로 프로그램으로 전달되지 않을 수 있습니다. 프로그램으로 전달될 Debug Tool 표현식에서 오류가 발생하지 않게 하려면 SET WARNING ON을 사용하십시오. 그러한 오류가 포함된 표현식은 종료되며 경고 메시지가 표시됩니다.

그러나 해당 프로그램으로 예외가 전달될 수 있으며 오류 복구 프로시저를 테스트할 수도 있습니다. 이러한 경우에는 SET WARNING OFF를 사용하십시오.

이 절에서 설명하는 자료와 연관된 자세한 정보에 대해서는 다음 주제를 참조하십시오.

다중 언어 애플리케이션 디버깅

Language Environment는 단일 런타임 환경과 ILC(언어 간 통신)를 제공하여 다중 언어 애플리케이션의 디버깅을 간소화합니다.

다중 언어 애플리케이션을 디버깅해야 될 경우 다음 시나리오 중 하나에 해당될 수 있습니다.

다중 언어 애플리케이션을 쓸 경우 단일 언어 범위 밖에서 작업해야 하므로 몇 가지 사항을 고려해야 합니다. Language Environment 초기화 프로세스는 애플리케이션의 기본 로드 모듈로 구성된 HLL 세트에 맞게 환경을 설정합니다. 이것은 환경을 조작하기 위해 명시적으로 호출할 필요가 없습니다. 또한 Language Environment 환경은 애플리케이션에 있는 HLL의 혼합과 관계없이 규칙대로 종료됩니다.

이 절에서 설명하는 자료와 연관된 자세한 정보에 대해서는 다음 주제를 참조하십시오.

Language Environment에 완전히 지원되는 애플리케이션 디버깅

Language Environment에 지원되고 지원되는 컴파일러로 컴파일된 언어 조합으로 쓴 프로그램을 디버깅할 경우 특수 액션이 거의 필요하지 않습니다. Debug Tool은 프로그래밍 언어의 변경을 인식하며 중단점에 도달하면 해당 언어로 자동으로 전환됩니다. 필요하면 SET PROGRAMMING LANGUAGE 명령을 사용하여 지정된 언어에 있을 수 있지만 현재 설정된 프로그래밍 언어에 정의된 변수에만 액세스할 수 있습니다.

여러 언어의 컴파일 단위에서 액세스할 세션 변수를 정의할 때는 호환 가능한 속성과 함께 정의해야 합니다.

이 절에서 설명하는 자료와 연관된 자세한 정보에 대해서는 다음 주제를 참조하십시오.

여러 프로그래밍 언어에서 세션 변수 사용

한 언어로 작업하는 동안 다른 언어의 로드 모듈에서 호출한 후 계속 사용할 수 있는 세션 변수를 선언할 수 있습니다. 아래 표에는 프로그래밍 언어에서 세션 변수의 속성을 맵핑하는 방법이 설명되어 있습니다. 테이블에 표시되지 않은 속성이 있는 세션 변수는 다른 프로그래밍 언어에서 액세스할 수 없습니다. (C 및 C++ 또는 PL/I 세션 변수에 지원되는 일부 속성은 다른 언어로 맵핑될 수 없습니다. 이러한 속성으로 정의된 세션 변수는 정의 언어 이외의 언어에서 액세스할 수 없습니다. 그러나 COBOL 세션 변수에 지원되는 모든 속성은 C 및 C++와 PL/I로 맵핑될 수 있으므로 COBOL로 선언한 세션 변수는 C 및 C++와 PL/I에서 액세스할 수 있습니다.)

시스템 속성 PL/I 속성 C 및 C++ 속성 COBOL 속성 어셈블러 및 디스어셈블리 속성
byte
CHAR(1)
unsigned char
PICTURE X
DS X 또는
DS C
byte string
CHAR(j)
unsigned char[j]
PICTURE X(j)
DS XLj 또는
DS CLj
halfword
FIXED BIN(15,0)
signed short int
PICTURE S9(j≤4)
USAGE BINARY
DS H
fullword
FIXED BIN(31,0)
signed long int
PICTURE S9(4<j≤9)
USAGE BINARY
DS F
floating point
FLOAT BIN(21) 또는
FLOAT DEC(6)
float
USAGE COMP-1
DS E
long floating point
FLOAT BIN(53) 또는
FLOAT DEC(16)
double
USAGE COMP-2
DS D
extended floating
point
FLOAT BIN(109) 또는
FLOAT DEC(33)
long double
n/a
DS L
fullword pointer
POINTER
*
USAGE POINTER
DS A
주:
세션 변수를 PL/I에 등록할 경우 기본값은 항상 DECIMAL 유형입니다. 예를 들어, C가 float을 선언하면 PL/I는 변수를 FLOAT BIN(21)이 아니라 FLOAT DEC(6)로 등록합니다.

세션 변수를 선언할 때 C 및 C++ 변수명이 대소문자를 구분한다는 점에 유의하십시오. 현재 프로그래밍 언어가 C 및 C++이면 대문자 이름으로 선언된 세션 변수만 COBOL 또는 PL/I를 공유할 수 있습니다. 현재 프로그래밍 언어가 COBOL 또는 PL/I이면 대/소문자 또는 소문자의 세션 변수명만 대문자로 맵핑됩니다. 이러한 COBOL 또는 PL/I 세션 변수는 대/소문자 또는 소문자와 대문자를 사용하여 선언되거나 참조될 수 있으며 차이는 없습니다. 그러나 세션 변수가 C 및 C++와 공유되면 C 및 C++ 내에서 모두 대문자로 된 세션 변수만 참조할 수 있습니다. (같은 문자이지만 하나 이상의 문자가 소문자인 변수명은 C 및 C++에서는 다른 변수명입니다.)

호환되지 않는 속성이 있는 세션 변수는 다른 프로그래밍 언어 사이에서 공유할 수 없으며 같은 이름을 가진 세션 변수가 삭제됩니다. 예를 들어, COBOL은 PL/I의 FLOAT DEC(33) 또는 C의 long double와 같지 않습니다. 현재 프로그래밍 언어 COBOL의 경우 세션 변수 XPICTURE S9(4)로 선언되면 세션 변수는 현재 프로그래밍 언어 설정이 FIXED BIN(15,0) 속성의 PL/I이고 현재 프로그래밍 언어 설정이 signed short int 속성의 C일 때 존재합니다. 현재 프로그래밍 언어 설정이 PL/I로 변경되고 세션 변수 XFLOAT DEC(33)로 선언되면 COBOL에 의해 선언된 X는 더 이상 존재하지 않습니다. PL/I에 의해 선언된 변수 X는 현재 프로그래밍 언어가 long double 속성의 C일 때 존재합니다.

이 절에서 설명하는 자료와 연관된 자세한 정보에 대해서는 다음 주제를 참조하십시오.

다른 프로그래밍 언어에서도 사용할 수 있는 명령 파일 작성

다른 프로그래밍 언어을 사용하기 위해 명령 파일을 작성하려는 경우에는 명령 파일이 제대로 작동하기 위해 반드시 준수해야 하는 지침에 대해 명령 파일 작성에서 설명합니다.

다른 디버거와 공존

여러 디버거가 한 요청자만을 위한 스토리지, 기능 및 인터페이스 사용을 위해 경쟁할 수 있으므로 다른 디버거와 공존은 보장될 수 없습니다.

이 절에서 설명하는 자료와 연관된 자세한 정보에 대해서는 다음 주제를 참조하십시오.

지원되지 않는 HLL 모듈과 공존

지원되지 않는 상위 또는 하위 레벨 언어로 쓰거나 HLL의 이전 릴리스로 쓴 컴파일 단위 또는 프로그램 단위는 허용됩니다. Debug Tool에서 사용할 수 있는 지원되지 않는 두 HLL에 대한 정보는 Using CODE/370 with VS COBOL II and OS PL/I를 참조하십시오.

이 절에서 설명하는 자료와 연관된 자세한 정보에 대해서는 다음 주제를 참조하십시오.