퀵스타트

이 빠른 시작에서는 Cloud Debugger를 사용하여 App Engine에서 실행되는 간단한 Python 앱의 상태를 디버깅하는 방법을 보여줍니다. 또한 다음을 수행하는 방법을 설명합니다.

  • 로컬 변수 및 호출 스택 검사
  • 로깅 구문 생성
  • 스냅샷 조건 설정 및 표현식 사용

시작하기 전에

  1. Google 계정으로 로그인합니다.

    아직 계정이 없으면 새 계정을 등록하세요.

  2. Cloud Console의 프로젝트 선택기 페이지에서 Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기 페이지로 이동

  3. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다. 프로젝트에 결제가 사용 설정되어 있는지 확인하는 방법을 알아보세요.

  4. Cloud SDK 설치 및 초기화
  5. 다음 소프트웨어가 로컬 시스템에 설치되어 있는지 확인합니다.

App Engine에 샘플 앱 배포

먼저 App Engine에 Python 3.7 앱을 배포합니다.

  1. 앱을 로컬 컴퓨터로 클론합니다.

    git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
    
  2. 앱이 있는 디렉터리로 이동합니다.

    cd python-docs-samples/appengine/standard_python3/cloud_debugger
    
  3. 다음 명령어를 실행하여 App Engine에 앱을 배포합니다.

    gcloud app deploy
    

    메시지가 표시되면 App Engine 앱을 배치할 리전을 선택합니다.

  4. 다음 명령어를 실행하여 앱을 확인합니다.

    gcloud app browse
    

    앱을 표시할 브라우저 창이 자동으로 열리지 않으면 터미널에 나타나는 URL을 클릭하세요.

    앱에는 문자열을 입력할 프롬프트가 포함되어 있고 필드는 미리 채워져 있습니다.

    제출 버튼과 'abcd'가 미리 채워진 필드를 보여주는 샘플 앱

  5. 제출을 클릭합니다.

    프로그램 출력과 올바른 출력이라는 2가지 결과가 표시된 샘플 앱의 출력

제출을 클릭하면 2가지 결과가 표시됩니다. 하나는 Program Output(프로그램 출력)이라는 라벨이 지정되어 있고 소스 코드에서 Reverse 메서드의 출력을 보여줍니다. 다른 하나는 Correct Output(올바른 출력)이라는 라벨이 지정되어 있으며 Python의 역순 배치 기능의 출력을 보여줍니다.

Program Output(프로그램 결과)Correct Output(올바른 출력)은 동일해야 합니다. 하지만 소스 코드에 문제가 있으면 Debugger를 사용해 문제를 진단해야 합니다.

배포된 소스 코드 보기

앱을 배포한 후 Google Cloud Console 디버그 페이지에서 배포된 소스 코드를 볼 수 있습니다.

  1. Google Cloud Console에서 디버그 페이지로 이동합니다.

    디버그 페이지로 이동

  2. 올바른 프로젝트를 선택했는지 확인합니다.

    올바른 프로젝트가 선택되었다는 의미로 강조표시된 프로젝트 선택기 드롭다운 메뉴

  3. 배포된 파일이 선택되었고 앱의 파일이 있는지 확인하여 Debugger가 배포된 파일에 액세스할 수 있는지 확인합니다.

    배포된 파일이 선택되었음을 보여주는 드롭다운 메뉴

  4. 올바른 앱 버전이 선택되었는지 확인합니다.

    올바른 앱 버전이 선택되었음을 보여주는 드롭다운 메뉴

    App Engine은 배포된 모든 버전의 앱을 관리합니다. Debugger 사용 시 올바른 버전의 앱이 선택되었는지 확인하세요.

    main.py 파일을 선택하면 다음과 같은 코드 블록이 표시됩니다.

    try:
      import googleclouddebugger
      googleclouddebugger.enable()
    except ImportError:
       pass
    
    import logging
    logging.basicConfig(level=logging.INFO)
    

    이 섹션에서는 try 및 except 블록을 사용하여 Debugger 에이전트를 가져와 사용 설정합니다.

    try:
      import googleclouddebugger
      googleclouddebugger.enable()
    except ImportError:
       pass
    
    이 섹션에서는 로깅을 구성합니다.

    import logging
    logging.basicConfig(level=logging.INFO)
    

이제 디버그 스냅샷을 만들고 디버그 로그 지점을 삽입하여 소스 코드의 문제를 진단할 수 있습니다.

디버그 스냅샷 만들기

디버그 스냅샷은 특정 줄 위치 범위에 있는 로컬 변수 및 호출 스택을 캡처합니다.

  1. 디버그 스냅샷을 만들려면 tmp 변수가 포함된 줄 번호를 클릭합니다. 스냅샷이 설정되었음을 나타내는 파란색 화살표가 표시되면 결과 패널에 '스냅샷 생성 대기 중'이 표시됩니다.

    47번 줄에 스냅샷이 설정되었음을 보여주는 Debugger 인터페이스

  2. 스냅샷을 트리거하려면 페이지를 새로고침합니다.

    변수 창에 변수 값이 표시됩니다. 루프를 처음 전달할 때 chars 배열이 올바르게 채워졌는지 확인합니다. 여기에서는 중단 지점이 처음 적중할 때 스냅샷이 만들어졌기 때문에 문제가 없습니다.

    스냅샷이 생성된 후 변수 값을 보여주는 결과 패널

    호출 스택 창에는 호출 스택의 결과가 표시됩니다. 호출 스택 창의 함수를 클릭하면 코드의 특정 지점에 있는 로컬 변수와 매개변수를 확인할 수 있습니다. ReverseString을 클릭하여 입력이 올바른지 확인할 수 있습니다.

    스냅샷이 생성된 후 호출 스택 값을 보여주는 결과 패널

스냅샷을 생성하고 변수와 호출 스택을 검사해도 문제가 드러나지 않기 때문에 문제를 찾으려면 로그 지점을 사용하세요.

디버그 로그 지점 삽입

디버그 로그 지점을 사용하면 앱을 다시 시작하지 않고 실행 중인 앱에 로깅을 삽입할 수 있습니다.

  1. 로그 지점을 삽입하려면 로그 지점 탭을 선택합니다.

  2. tmp 변수가 있는 줄 번호를 클릭합니다. 인라인 입력란이 나타납니다. 필드를 다음과 같이 입력하고 추가를 클릭합니다.

    if (True) logpoint("About to swap two characters. Chars is currently {chars}")
    

    47번 줄에 설정된 로그 지점

    로그 지점의 구조는 if(condition)logpoint(string)와 같습니다. 로그 지점을 생성하려면 다음 두 부분을 제공하세요.

    • 조건: 소스 코드의 구문으로 작성해야 합니다.

    • 문자열: 소스 코드의 구문으로 작성한 중괄호로 묶인 표현식으로 개수에 관계없이 포함할 수 있습니다.

  3. 로그 지점이 성공적으로 삽입되었는지 확인하려면 로그 지점 기록 탭을 선택합니다.

    18번 줄에 로그 지점이 설정되었음을 나타내는 로그 지점 기록 탭

  4. 로그 지점을 트리거하려면 페이지를 새로고침합니다.

  5. 로그 지점에서 생성된 로그를 표시하려면 로그 패널을 선택하고 새로고침 을 클릭합니다.

    로그 지점 결과를 보여주는 로그 탭

문제 진단

위의 로그 지점 결과에서는 while 루프가 3회 실행되지만, 2회만 실행하면 됩니다. 로그 지점이 루프의 시작 부분에서 설정되어 있기 때문에 이미 완전히 역순으로 배치된 문자열의 문자가 교체된 시점이 로깅되었습니다.

while 루프가 3회 실행되었음을 보여주는 로그

문제를 정확히 찾아내려면 특정 조건에서 디버그 스냅샷을 사용하세요.

특정 조건에서 디버그 스냅샷 만들기

앱은 left 변수 및 right 변수를 사용하여 값 교체를 중지할 시점을 추적합니다. left 변수가 right 변수보다 크면 루프가 종료됩니다.

스냅샷은 소스 코드의 조건에 따라 트리거되도록 설정할 수 있습니다. 루프 종료 시점을 파악했으므로 특정 조건에서 스냅샷을 사용하여 문제를 격리합니다.

  1. 루프가 너무 많이 실행되는 이유를 확인하려면 left > right 조건에서 스냅샷이 트리거되도록 설정합니다. 그런 다음 카메라 아이콘 을 클릭하여 스냅샷을 위한 Debugger를 준비합니다.

    조건문을 사용하여 47번 줄에 설정된 스냅샷

  2. 페이지를 새로고침하여 스냅샷을 트리거합니다. 변수 창에 left 변수가 right 변수보다 크다고 표시됩니다.

    이때 루프의 left 변수가 이미 right 변수보다 크기 때문에 루프가 계속 실행되어 50번 줄에 도달하여 종료될 때까지 값이 한번 더 교체됩니다.

    변수 값이 표시된 변수 창

표현식을 사용하여 디버그 스냅샷 만들기

Debugger를 사용하면 스냅샷이 트리거될 때 프로그래밍 언어 표현식을 가져올 수 있습니다. 예를 들어 chars[1]chars[2] 같은 표현식을 사용하여 chars 배열의 값을 검색할 수 있습니다.

  1. 스냅샷이 트리거될 때 표현식의 값을 가져오려면 표현식 필드에 표현식을 입력합니다. 여러 개의 표현식을 입력해도 됩니다.

    스냅샷이 트리거된 후 표현식 값은 변수 창 위에 나타납니다.

    값 'c'와 'b'가 표시된 표현식 필드의 결과

문제 해결

스냅샷과 로그 지점은 앱의 문제를 진단하는 데 유용합니다. 이 예시에서는 루프를 중지시키는 구문인 if left >= right: break에 너무 늦게 도달하여 마지막 반복을 중지할 수 없기 때문에 while 루프가 너무 많이 실행됩니다. 문제를 해결하려면 if left >= right: break 구문을 50번 줄에서 47번 줄로 옮깁니다.

삭제

이 빠른 시작에서 사용한 리소스의 비용이 Google Cloud 계정에 청구되지 않도록 하려면 다음 단계를 따르세요.

  1. Cloud Console의 프로젝트 페이지로 이동합니다.

  2. 프로젝트 옆에 있는 삭제 를 클릭합니다.

  3. 프로젝트 이름을 입력하여 종료되었는지 확인합니다.

다음 단계