EGL 디버거에서 애플리케이션을 통해 스테핑

이 주제는 EGL 디버거에서 프로그램을 디버깅하는 기본 단계의 안내를 제공합니다.

애플리케이션을 디버깅하기 위한 전략은 이 문서의 범위를 벗어나지만 일반적으로, 디버깅 프로세스의 중심은 코드의 문제점 소스를 식별하는 것입니다. 예를 들어, 프로그램이 비정상적으로 종료되면 디버거를 사용하여 코드를 스텝 스루하고 프로그램이 실패하는 지점을 찾을 수 있습니다. 프로그램이 예상치 못한 출력을 제공하는 경우 디버거를 사용하여 변수 값을 추적하고 출력이 예상에서 벗어난 지점을 찾을 수 있습니다.

디버거는 항상 프로그램 파트에서 디버깅을 시작합니다. 라이브러리와 같은 다른 로직 파트를 디버그하려는 경우 프로그램에서 다른 로직 파트로 이동해야 합니다. 일부 경우에 디버그하려는 로직 파트를 호출하는 것보다 다른 함수가 없는 단순한 프로그램을 작성하는 게 더 이로울 수 있습니다.

전제조건

  • EGL 프로젝트
  • 디버그할 EGL 프로그램
다음 예제는 디버거를 테스트하는 데 사용할 수 있는 단순한 오류가 있는 프로그램을 제공합니다.
program myDebugTestPgm type BasicProgram 

  function main()

    // 항목 배열에 대해 일부 초기값 제공
    customerItems items[3];
    customerItems[1].itemNumber=1;
    customerItems[2].itemNumber=2;
    customerItems[3].itemNumber=3;
    customerItems[1].itemCost=12.50;
    customerItems[2].itemCost=200;
    customerItems[3].itemCost=49.95;
    customerItems[1].itemQuantity=30;
    customerItems[2].itemQuantity=10;
    customerItems[3].itemQuantity=60;

    counter int;
    orderTotal float=0;

    //항목의 총 비용을 계산합니다.
    //discountPrice 함수를 사용해 각 항목의 할인된 비용을 가져옵니다.
    for (counter from 1 to customerItems.getSize() by 1)
      orderTotal += discountPrice(customerItems[counter].itemCost, 
                                  customerItems[counter].itemQuantity);
    end // for loop

    //콘솔에 출력을 씁니다.
    SysLib.writeStderr("The total cost for the order is $" + orderTotal);
  end // main

  //항목 가격 및 수량 할인을 기준으로
  //항목 그룹의 총 가격을 리턴합니다.
  function discountPrice(itemCost float in, itemQuantity int in) returns(float)
    discountRate float=0;
    quantCost float=0;

    //각 수량에 대한 할인을 판별합니다.
    //50개를 초과하는 항목에 대해 20% 할인
    //20개를 초과하는 항목에 대해 5% 할인
    case
      when (itemQuantity > 50)
        discountRate = 1/5;
     when (itemQuantity > 20 && itemQuantity <= 50)
       discountRate = 1/20;
     otherwise
       //bug - division by zero
       discountRate = 1/0;
     end
    //할인된 비용, 항목 수, 항목 비용을
    //곱합니다.
    quantCost = itemCost*itemQuantity*(1-discountRate); 
    quantCost = MathLib.round(quantCost, -2);

    return (quantCost);
  end // function discountPrice

end // program

record items type BasicRecord
  itemNumber    int;
  itemCost      float;
  itemQuantity  int;
end
이 프로그램을 생성하고 실행하는 경우 EGL이 discountPrice 함수 및 1/0 표현식을 가리키는 오류를 리턴합니다. 이 경우 오류가 표시되기 쉽지만 다른 경우 오류를 쉽게 찾지 못할 수도 있습니다. 오류의 소스를 식별하는 첫 번째 단계는 프로그램이 실패하는 위치를 찾기 위해 중단점이 있는 디버거에서 프로그램을 실행하는 것입니다.

중단점 추가

하나 이상의 코드 행을 중단점으로 표시할 수 있습니다. 디버거가 중단점을 발견하는 경우 연관된 코드 목록을 실행하기 전에 일시정지됩니다. 디버거에 진행 방법을 지시하기 전에 프로그램 변수의 현재 값을 확인하는 옵션이 있습니다. 중단점은 생성된 소스에 영향을 미치지 않으며 디버깅 프로세스 중에만 의미가 있습니다.

중단점을 추가하려면 EGL 편집기에서 코드의 왼쪽에 회색 여백을 두 번 클릭하십시오. 이전 예제에서 오류가 이 함수에서 오류가 발생했음을 표시하므로 discountPrice 함수 전체에서 중단점을 추가하려고 할 수 있습니다. 중단점은 이 회색 영역에서 파란색 원으로 표시됩니다.

코드에서 중단점을 표시하는 파란색 원의 그림

다음 예제를 포함하여 로직을 수행하는 대부분의 EGL 코드 행에서 중단점을 추가할 수 있습니다.
  • 지정 명령문. 예제:
    myString = "Hello";
  • 지정을 포함하는 변수 선언. 예제:
    myInt int = 5;
  • 시스템 함수 또는 기타 EGL 함수에 대한 호출. 예제:
    SysLib.writeStderr("Hello");
  • 루프 또는 비교 명령문. 예제:
    if (myInt == 5)
그러나 다음 코드 행에서 중단점을 추가할 수 없습니다.
  • 지정을 포함하지 않는 변수 선언
  • end
  • 함수로 시작하거나 프로그램, 패키지 또는 로직 파트를 선언하는 기타 행으로 시작하는 코드 행. 그러나 중단점이 포함된 것처럼 디버거가 각 프로그램의 첫 번째 행을 처리하도록 환경 설정을 설정할 수 있습니다. EGL 디버거의 환경 설정 설정을 참조하십시오.
  • 데이터 파트 내의 행
  • 주석으로만 구성된 행 또는 빈 행

중단점 사용에 대한 자세한 지시사항은 EGL 디버거에서 중단점 사용의 내용을 참조하십시오.

중단점을 사용하지 않고 프로그램을 디버그할 수 있습니다. 환경 설정 > 환경 설정 > EGL > 디버그 > 프로그램의 첫 번째 행에서 중지를 선택하면 프로그램의 main() 함수 내에 있는 첫 번째 실행 가능 행에서 중단점을 설정하는 것과 동일한 영향이 있습니다. 이 시점에서 후속 코드 행을 중심으로 스텝하거나 스텝 스루할 수 있습니다. 즉, 단일 행을 실행하고 일시정지할 수 있습니다. 단계 명령에 대한 세부사항은 EGL 디버거 제어의 내용을 참조하십시오.

EGL 디버거에서 프로그램 실행

프로그램에 중단점을 추가한 후에 또는 첫 번째 행에서 중단 옵션을 설정한 후에(이 주제의 이전에 있는 "중단점 추가" 참조) 디버거에서 이를 실행할 수 있습니다.

디버거에는 애플리케이션을 실행하는 방법을 설명하는 실행 구성이 필요합니다. 실행 구성을 작성하는 두 가지 방법이 있습니다.
  • 디버깅을 시작할 때 디버거가 실행 구성을 자동으로 작성하도록 하십시오.
  • 실행 구성을 수동으로 작성하십시오. 자세한 정보는 EGL 디버거에서 실행 구성 작성의 내용을 참조하십시오.
대부분의 프로그램에 대해 자동으로 작성된 실행 구성을 사용할 수 있습니다.
  1. 프로젝트 탐색기 보기에서 디버그하려는 EGL 소스 프로그램을 마우스 오른쪽 단추로 클릭한 후 디버그 대상 > EGL 프로그램을 클릭하십시오. 디버거는 다음 태스크를 수행합니다.
    • 프로그램에 대해 실행 구성이 없는 경우 디버거가 기본 실행 구성을 작성합니다. 실행 > 디버그를 클릭하여 이 구성을 볼 수 있습니다.
    • 워크벤치 환경 설정에 따라 디버거가 디버그 퍼스펙티브로 자동으로 전환하거나 이를 수행하도록 프롬프트를 표시할 수 있습니다. > 퍼스펙티브 열기 > 기타 > 디버그를 클릭하여 퍼스펙티브를 수동으로 전환할 수 있습니다.
    • 디버거가 프로그램 실행을 시작합니다.
  2. 디버거가 프로그램 실행을 시작한 후에 중단점이 발생할 때까지 이를 계속하거나 이에 대해 환경 설정을 설정한 경우 실행 코드의 첫 번째 행을 찾습니다. 이 시점에서 디버거가 일시정지되고 다음 정보가 표시됩니다.
    • EGL 편집기가 실행할 행을 강조표시합니다.
    • 변수 보기가 시스템 변수 값을 포함하여 현재 로직 파트에 있는 모든 변수 값을 표시합니다. 이 보기를 사용하여 프로그램을 통해 변수의 값을 추적할 수 있습니다. 디버거가 중단점에서 일시정지된 동안 변수의 값을 변경할 수도 있습니다.
    • 디버그 보기가 현재 실행 단위 내에서 실행 중인 스레드를 나열합니다. 즉, 이 보기는 프로그램 또는 로직 파트가 현재 실행 중임을 표시합니다. 이 보기를 사용하여 디버깅 프로세스를 재개하거나 중지하십시오.
    • 중단점 보기가 프로그램에서 중단점을 나열합니다. 이 보기에서 해당 선택란을 선택 취소하여 중단점을 임시로 사용 안함으로 설정할 수 있습니다.
  3. 디버거를 계속하려는 경우 디버그 보기의 맨 위에서 재개 단추를 클릭하십시오. 디버거가 다음 중단점을 계속합니다. 또한 단계 단추 중 하나를 사용하여 프로그램이 다음 행을 실행하고 다시 일시정지함을 볼 수 있습니다.

    예제 프로그램에서 프로그램을 실행할 때 디버거가 콘솔에 표시되는 오류와 동일한 오류를 리턴하는 discountRate = 1/0; 행에 디버거가 도달할 때까지 프로그램을 중단점에서 중단점으로 실행할 수 있습니다.

  4. 디버깅을 완료한 경우 디버그 보기의 맨 위에 있는 종료 단추를 클릭하여 디버거를 중지하거나 재개 단추를 클릭하여 프로그램을 실행 완료하십시오.