ABAP 프로그램 디버깅

Objectives

After completing this lesson, you will be able to:
  • 디버깅 모드를 입력하십시오.
  • 코드 실행을 제어합니다.
  • 데이터 오브젝트의 컨텐트를 분석합니다.

디버깅 모드

디버깅의 필요성을 이해하려면 이 비디오를 시청하십시오.

디버거 시작

ABAP 프로그램을 디버깅하려면 일반적으로 중단점을 설정한 후에 프로그램을 실행합니다. 프로그램이 중단점에 도달하면 프로그램이 중단되고 ADT에서 ABAP 디버그 퍼스펙티브가 열립니다. 그려면 각 후속 명령문을 개별적으로 실행하여 명령문이 프로그램에 미치는 영향을 확인할 수 있습니다. 또한 프로그램의 모든 변수 내용을 검사하여 예기치 않은 값이 있는지 확인할 수도 있습니다.

중단점을 설정하거나 제거하려면 편집기의 왼쪽 여백을 마우스 오른쪽 버튼으로 클릭하고 중단점 토글 을 선택합니다. 또는 왼쪽 여백을 더블 클릭할 수도 있습니다. 중단점을 설정하려면 먼저 프로그램을 활성화해야 합니다.

중단점은 사용자별로 고유하며 지속적입니다. ADT에서 로그오프했다가 다시 로그온한 후에도 중단점은 활성 상태로 유지됩니다. 중단점에서 디버거가 시작되지 않게 하려면 중단점 토글 기능을 사용하여 중단점을 삭제하거나 단축 메뉴의 해당 기능을 사용하여 비활성화해야 합니다.

노트

개인 설정에 따라 ADT에서 디버그 퍼스펙티브를 자동으로 열기 전에 먼저 확인을 요청합니다.

ADT의 디버그 퍼스펙티브

ABAP 개발 툴을 사용하여 ABAP 프로그램을 디버깅하는 경우 Debug 퍼스펙티브를 사용합니다. 이는 표준 Eclipse 디버그 퍼스펙티브의 커스터마이즈된 버전으로, 여기에는 특히 디버깅에 중요한 뷰와 기능이 포함되어 있습니다.

디버거 관점의 몇 가지 중요한 요소를 살펴보겠습니다.

디버거 시작 방법

코드 실행 제어

탐색 기능

디버깅을 시작한 후에는 탐색 기능을 사용하여 코드 실행을 제어합니다.

몇 가지 중요한 탐색 기능은 다음과 같습니다.

스텝 투(F5)

Step Into 를 선택하거나 F5를 눌러 단일 단계를 실행합니다. 단계별 분석을 위해 이 기능을 사용합니다. 예를 들어, 제어 구조의 어떤 코드 블록이 실제로 실행되는지 확인하려는 경우

다시 시작(F8)

다시 시작 을 선택하거나 F8 을 눌러 다음 중단점까지 프로그램을 실행합니다. 디버거가 중단점에 더 이상 도달하지 않으면 프로그램이 끝까지 실행되고 디버깅 세션이 종료됩니다.

라인으로 실행(Shift+F8)

Run to Line 을 선택하거나 Shift+F8 을 눌러 현재 커서 위치까지 프로그램을 실행합니다. 코드 라인을 클릭하고 이 기능을 선택하면 중단점을 설정하고 다시 시작 을 선택한 후 중단점을 다시 제거하는 것이 편리합니다.

라인으로 이동(Shift+F12)

라인으로 이동 을 선택하거나 Shift+F12 를 눌러 일부 코드 라인을 건너뛰거나 이미 실행된 일부 코드로 이동합니다. 이 기능은 특정 코드가 제거된 경우 어떤 일이 발생할지 또는 분석을 처음으로 놓친 코드의 일부를 디버깅을 반복하는 데 유용할 수 있습니다. 이는 실제로 코딩을 실행하지 않고 건너뛰는 것임을 명심하십시오. 뒤로 이동하면 데이터 오브젝트에 대한 변경사항이 되돌려지지 않습니다.

퇴사

디버깅을 완료했고 나머지 프로그램을 실행하지 않으려면 종료 를 선택합니다. 디버그 세션이 즉시 종료됩니다.

특수 중단점(Special Breakpoint)

ABAP 편집기 뷰의 왼쪽 여백을 클릭하여 중단점을 생성하고 관리할 수 있다는 것을 배웠습니다. 이는 디버그 퍼스펙티브의 ABAP 편집기 뷰에서도 작동합니다.

또한 중단점 뷰로 전환하여 중단점을 관리할 수 있습니다.

중단점 뷰에서 다음과 같은 특수 중단점을 생성할 수도 있습니다.

명령문 중단점

명령문 중단점은 특정 코드 라인이 아니라 특정 ABAP 문에 연결됩니다. 예를 들어, 명령문 CLEAR의 명령문 중단점은 이 명령문의 위치와 관계없이 CLEAR 문이 실행될 때마다 디버거에서 프로그램이 중지되도록 합니다.

명령문 중단점을 생성하려면 중단점 뷰의 툴바에서 드롭다운 리스트를 열고 명령문 중단점 추가… 를 선택합니다.

예외 중단점

예외 중단점은 특정 예외에 첨부됩니다. 이 예외가 프로그램에서 처리되거나 런타임 오류를 일으키더라도 이 예외가 발생할 때마다 디버거에서 프로그램이 중지됩니다. 예외 중단점을 생성하려면 중단점 뷰의 툴바에서 드롭다운 리스트를 열고 예외 중단점 추가… 를 선택합니다.

조건부 중단점

조건을 추가하여 중단점을 조건부 중단점으로 전환합니다. 프로그램 실행이 조건부 중단점에 도달하면 조건이 충족된 경우에만 디버거에서 프로그램이 중지됩니다. 예를 들어, 중단점이 DO와 ENDDO 사이에 있으면 모든 반복에서 디버거에서 프로그램이 중지됩니다. 그러나 조건 sy-index > 20을 추가하면 디버거는 처음 20번의 반복 중에 이 중단점을 무시하고 다음 반복에서만 중지합니다.

중단점에 조건을 추가하려면 중단점 리스트에서 조건을 선택하고 조건 필드에 조건을 입력합니다. Enter 를 눌러 중단점을 조건과 함께 저장합니다.

감시점(Watchpoint)

예기치 않은 변수 값으로 인해 문제가 발생하는 경우 감시점을 사용하여 프로그램 진행 중에 이 값을 추적할 수 있습니다.

방법을 보려면 이 비디오를 시청하십시오.

코드 실행을 제어하는 방법

데이터 오브젝트 분석

데이터 오브젝트 컨텐트 조회

디버거에서 데이터 오브젝트의 컨텐트를 표시하는 방법을 알아보려면 이 비디오를 시청하십시오.

내부 테이블(Internal Table)의 내용 조회

이 동영상에서 내부 테이블(Internal Table)의 컨텐트를 조회하는 방법을 알아보십시오.

변수 값 변경

권한에 따라 디버깅 중에 변수 값을 변경할 수 있습니다.

단순 변수의 경우 변수 뷰에서 변수를 찾아서 마우스 오른쪽 버튼으로 클릭하고 값 변경… 을 선택합니다.

내부 테이블(Internal Table)의 내용을 변경하려면 기존 행의 값 변경과 행 추가 또는 삭제를 구별해야 합니다.

위 그림에 나와 있는 것처럼, ABAP 내부 테이블 뷰를 마우스 오른쪽 버튼으로 클릭하면 다음과 같은 기능을 사용할 수 있습니다.

값 변경...
값 변경… 을 선택하여 기존 행의 내용을 변경합니다.
행 삽입…
행 삽입… 을 선택하여 신규 행을 추가합니다. 신규 행을 추가할 것인지, 아니면 선택한 위치에 삽입할 것인지 결정할 수 있습니다.
선택한 행 삭제
선택한 행 삭제 를 선택하여 마우스 오른쪽 버튼으로 클릭하기 전에 선택한 행을 제거합니다. 행을 선택하려면 마우스 왼쪽 버튼을 클릭합니다. 행을 두 개 이상 선택하려면 Ctrl 키 또는 Shift 키를 누른 상태에서 추가 행을 마우스 왼쪽 버튼으로 클릭합니다.
행 삭제…
큰 범위의 행 또는 모든 행을 제거하려면 행 삭제… 를 선택합니다. 삭제하려는 시작 행과 종료 행의 번호가 표시됩니다.

데이터 오브젝트의 컨텐트를 분석하는 방법

ABAP 코드 디버깅

이번 연습문제에서는 ABAP 디버거를 사용하여 ABAP 코드를 분석합니다.

템플릿:

  • /LRN/CL_S4D400_BTT_DEBUG(전역 클래스)

솔루션:

  • 없음. 클래스는 변경되지 않습니다.

태스크 1: 준비

디버깅할 클래스를 복사합니다.

단계

  1. ABAP 편집기에서 전역 클래스 /LRN/CL_S4D400_BTT_DEBUG의 소스 코드를 엽니다.

    1. Eclipse 툴바에서 Open ABAP Development Object 를 선택합니다. 또는 Ctrl + Shift + A 를 눌러도 됩니다.

    2. 검색 문자열로 /LRN/CL_S4D400_BTT 를 입력합니다.

    3. 개발 오브젝트 리스트에서 /LRN/CL_S4D400_BTT_DEBUG 를 선택하고 확인 을 선택합니다.

  2. 프로젝트 탐색기 뷰를 편집기와 연결합니다.

    1. 프로젝트 탐색기 툴바에서 편집기가 있는 링크 버튼을 찾습니다. 아직 누르지 않은 경우 선택합니다. 따라서 편집기에서 열려 있는 개발 오브젝트가 프로젝트 탐색기에서 강조표시되어야 합니다.

  3. 클래스 /LRN/CL_S4D400_BTT_DEBUG 를 사용자의 패키지에 포함된 클래스에 복사합니다(제안 이름: ZCL_##_DEBUG, ##은 그룹 번호).

    1. 프로젝트 탐색기 뷰에서 클래스 /LRN/CL_S4D400_BTT_DEBUG 를 마우스 오른쪽 버튼으로 클릭하여 컨텐트 메뉴를 엽니다.

    2. 단축 메뉴에서 Duplicate .... 를 선택합니다.

    3. 패키지 이름(ZS4D400_##, ##은 그룹 번호)과 신규 클래스의 이름(ZCL_##_DEBUG)을 입력하고 다음 을 선택합니다.

    4. 전송 요청을 확인하고 Finish를 선택합니다.

  4. 클래스를 활성화하고 테스트합니다.

    1. Ctrl + F3 을 눌러 클래스를 활성화합니다.

    2. F9 를 눌러 클래스를 실행합니다.

  5. 콘솔 뷰에서 출력을 확인합니다.

    1. 편집기 뷰 아래에 새 탭으로 열어야 하는 콘솔 뷰를 확인합니다.

    2. 콘솔 뷰가 표시되지 않으면 윈도우뷰 표시기타 를 선택하여 엽니다. 적중 리스트에서 콘솔 을 더블 클릭합니다.

태스크 2: 시작 값 분석

if_oo_adt_classrun~main( ) 메소드에서 첫 번째 실행 가능 문에 디버거를 입력하고 일부 변수 및 상수 데이터 오브젝트의 값을 분석합니다.

단계

  1. 유형을 정의하지 않는 첫 번째 명령문에 중단점을 설정하거나 데이터 오브젝트를 선언합니다.

    힌트

    TYPES는 데이터 유형을 정의하고, CONSTANTS는 상수 데이터 오브젝트를 선언하고, DATA는 변수 데이터 오브젝트를 선언합니다.
    1.  loan_remaining = loan_total. 라인 옆에 있는 편집기의 왼쪽 여백을 두 번 클릭하여 중단점을 설정합니다.

  2. 클래스를 콘솔 앱으로 실행하고 디버거를 입력합니다.

    1. F9 를 눌러 클래스를 실행합니다.

    2. Debug 퍼스펙티브로 전환할지 묻는 메시지가 표시되면 내 의사결정 기억 을 선택하고 확인 을 선택합니다.

  3. Variables 뷰에서 loan_remainingloan_total 데이터 오브젝트의 값을 표시합니다.

    1. 현재 코드 라인(녹색 배경의 코드 라인)에서 loan_remaining 을 더블 클릭합니다.

    2. 동일한 코드 라인에서 loan_total 을 더블 클릭합니다.

태스크 3: 프로그램 실행 제어

중단점과 감시점을 설정합니다. 다음 중단점이나 감시점에 도달할 때까지 단일 단계를 실행하거나 실행을 재개합니다. 데이터 오브젝트의 값 변경을 감독합니다.

단계

  1. 현재 라인에서 값 지정을 디버그하는 단일 단계를 실행합니다.

    1. 툴바에서 단계 종료(F5) 를 선택하거나 F5 를 누릅니다.

    2. loan_remaining 의 값이 0..00 에서 5000.00 으로 변경되었는지 확인합니다.

  2. 데이터 오브젝트 spec_repay_mode 의 컨텐트를 조회합니다. 그런 다음 다른 단일 단계를 실행하여 CASE - 제어 구조의 WHEN 분기가 어떤 WHEN 분기를 실행하는지 확인합니다.

    1. 다음 코드 라인에서 spec_repay_mode 를 더블 클릭합니다.

    2. F5를 눌러 WHEN 'Q'. 코드 라인으로 이동합니다.

  3. loan_remaining 변수에 대한 감시점을 설정하고 프로그램 실행을 다시 시작합니다. 프로그램 실행이 다시 중지되는 위치는 어디입니까?

    1. Variables 뷰에서 LOAN_REMAINING 을 마우스 오른쪽 버튼으로 클릭하고 Set Watchpoint 를 선택합니다.

    2. 툴바에서 다시 시작(F8) 을 선택하거나 F8 을 누릅니다.

    3. 프로그램 실행은 코드 라인 loan_remaining = loan_remaining - repayment_month. 직후에 중지되며, 실행 가능 코드가 있는 다음 코드 라인에서도 정확합니다.

  4. 데이터 오브젝트 repayment_plan의 컨텐트를 조회합니다. 그런 다음 다른 단일 단계를 실행하여 APPEND 문이 어떻게 채워지는지 확인합니다.

    노트

    repayment_plan은 내부 테이블이기 때문에 변수 뷰뿐만 아니라 편집기 아래의 ABAP 내부 테이블(디버거) 뷰에도 표시됩니다.
    1. APPEND 문 끝에 있는 repayment_plan 을 더블 클릭합니다.

    2. F5 를 눌러 repayment_plan 이 첫 번째 행으로 채워지는 방식을 확인합니다.

  5. APPEND 문에서 문자열 템플릿을 검사하고 내부 테이블 repayment_plan의 첫 번째 행에 연결합니다. 임베드된 표현식에 표시되는 데이터 오브젝트의 컨텐트를 표시합니다.

    1. 중괄호 사이에 나타나는 데이터 개체를 두 번 클릭하여 내용을 표시합니다.

  6. 가변 repayment_plan을 위한 다른 감시점을 설정하고 프로그램 실행을 몇 번 재개합니다. 실행이 감시점 중 하나에 도달할 때마다 loan_remaining 의 값을 분석하고 repayment_plan 에 새로운 행이 추가됩니다.

    1. Variables 뷰에서 REPAYMENT_PLAN 을 마우스 오른쪽 버튼으로 클릭하고 Set Watchpoint 를 선택합니다.

    2. 프로그램 실행을 다시 시작하려면 F8을 누르십시오.

    3. 변수 뷰와 ABAP 내부 테이블(디버거) 뷰에서 데이터 오브젝트를 분석합니다.

  7. 잠시 후 모든 EXIT 문에 대해 명령문 중단점을 설정하고 두 감시점을 삭제합니다.

    1. Breakpoints 뷰로 이동합니다.

      힌트

      변수 뷰 옆에 중단점 뷰가 있습니다.
    2. 중단점 뷰의 툴바에서 왼쪽 끝에 있는 드롭다운 버튼을 펼치고 Add Statement Breakpoint 를 선택합니다. ....

    3. 대화 상자 윈도우가 나타나면 검색 문자열로 EXIT 를 입력하고 적중 리스트에서 EXIT 값을 클릭한 후 확인 을 선택합니다.

    4. 중단점 뷰에서 감시 포인트 LOAN_REMAINING 을 마우스 오른쪽 버튼으로 클릭하고 제거 를 선택합니다.

    5. 중단점 뷰에서 감시 포인트 REPAYMENT_PLAN 을 마우스 오른쪽 버튼으로 클릭하고 제거 를 선택합니다.

  8. 첫 번째 EXIT 문에 도달할 때까지 프로그램 실행을 다시 시작합니다. EXIT 문에 대한 명령문 중단점을 비활성화합니다. 그런 다음 프로그램의 출력 부분에 도달할 때까지 단일 단계를 실행합니다.

    1. 프로그램 실행을 다시 시작하려면 F8을 누르십시오.

    2. Breakpoints 뷰로 전환하고 EXIT [문]이라는 라인을 선택 해제합니다.

    3. out->write( 로 시작하는 첫 번째 코드 라인에 도달할 때까지 F5 를 누릅니다.

  9. 콘솔 뷰를 엽니다. 나머지 프로그램을 실행하고 콘솔 뷰에서 출력을 수행합니다.

    출력을 디버그하려면 F5를 누르지 마십시오. 대신 F6을 사용합니다.

    노트

    이 과정의 뒷부분에서 학습할 내용은 out->write( ... ) ABAP 문이 아니라 여러 ABAP 문으로 구성된 재사용 가능한 코드 블록입니다. F5를 누르면 이 코드로 이동하여 자세히 분석할 수 있습니다. F6을 사용하면 코드 블록을 통해 단일 문처럼 처리하십시오.
    1. 어플리케이션 끝에 도달할 때까지 F6 을 여러 번 누릅니다.

    2. 콘솔 뷰에서 추가 출력을 분석하고 이전 코드 라인의 문자열 템플릿과 비교합니다.

  10. 어플리케이션이 종료되면 ABAP 퍼스펙티브로 다시 전환하는 것을 잊지 마십시오.

    1. Eclipse 툴바의 오른쪽 끝에서 ABAP 을 선택합니다.