ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 크롬으로 디버깅하기
    Study/JavaScript 2020. 6. 2. 12:23

    크롬으로 디버깅하기

    디버깅 (debugging)

    디버깅은 스크립트 내 에러를 검출해 제거하는 일련의 과정을 의미한다.
    모던 브러우저와 호스트 환경 대부분은 개발자 도구 안에 UI 형태로 디버깅 툴을 구비해 놓는다.
    디버깅 툴을 이용하면 디버깅이 훨씬 쉬워지고,
    실행단계마다 어떤 일이 일어나는지를 코드 단위로 추적할 수 있다.

    Sources 패널

    1. Chrome을 사용해 예시 페이지를 엽니다.
    2. f12 (MAC : Cmd+Opt+I) 를 눌러 개발자 도구를 연다.
    3. sources 탭을 클릭해 sources 패널을 연다.

    sources 패널을 처음 열면 아래와 같은 화면이 보인다.

    캡처

    토글 버튼 을 누르면 navigator가 열리면서 현재 사이트와 관련된 파일들이 나열됩니다.

    파일 목록에서 hello.js를 클릭해 아래와 같이 화면을 바꿔봅시다.

    캡처

    Sources 패널은 크게 세 개의 영역으로 구성된다.

    1. 파일 탐색 영역 – 페이지를 구성하는 데 쓰인 모든 리소스(HTML, JavaScript, CSS, 이미지 파일 등)를 트리 형태로 보여줍니다. Chrome 익스텐션이 여기 나타날 때도 있다.

    2. 코드 에디터 영역 – 리소스 영역에서 선택한 파일의 소스 코드를 보여줍니다. 여기서 소스 코드를 편집할 수도 있다.

    3. 자바스크립트 디버깅 영역 – 디버깅에 관련된 기능을 제공합니다. 곧 자세히 살펴보겠다.

    콘솔 Console

    Esc를 누르면 개발자 도구 하단부에 콘솔 창이 열린다.
    여기에 명령어를 입력하고 Enter를 누르면 입력한 명령어가 실행된다.

    콘솔 창에 구문(statement)을 입력하고 실행하면 아랫줄에 실행 결과가 출력된다.

    1+2를 입력하면 3이 출력되고, hello("debugger")를 입력하면 undefined가 출력되죠.
    undefined가 출력되는 이유는 hello("debugger")가 아무것도 반환하지 않기 때문이다.

    중단점 ( breackPoint)

    예시 페이지 내부에서 무슨 일이 일어나는지 자세히 살펴봅시다.
    hello.js를 소스 코드 영역에 띄우고 네 번째 줄 코드 좌측의 줄 번호, 4를 클릭합시다.
    코드가 아닌 줄 번호 4에 마우스 커서를 옮긴 후 클릭해야 한다.

    축하합니다! 중단점을 성공적으로 설정하셨습니다. 줄 번호 8도 클릭해 중단점을 하나 더 추가해봅시다.

    지금까지 잘 따라오셨다면 아래와 같은 화면이 보여야 합니다. 줄 번호 48이 파란색으로 바뀐 게 보이시죠?

    캡처

    _**중단점(breakpoint)_** 은 말 그대로 자바스크립트의 실행이 중단되는 코드 내 지점을 의미합니다.

    중단점을 이용하면 실행이 중지된 시점에 변수가 어떤 값을 담고 있는지 알 수 있습니다.
    또한 실행이 중지된 시점을 기준으로 명령어를 실행할 수도 있습니다. 디버깅이 가능해지는 것이죠.

    Sources 패널 우측의 디버깅 영역을 보면 중단점 목록을 확인할 수 있습니다.
    파일 여러 개에 다수의 중단점을 설정해 놓은 경우, 디버깅 영역을 이용하면 아래와 같은 작업을 할 수도 있습니다.

    • 항목을 클릭해 해당 중단점이 설정된 곳으로 바로 이동할 수 있습니다.
    • 체크 박스 선택을 해제해 해당 중단점을 비활성화 할 수 있습니다.
    • 마우스 오른쪽 버튼을 클릭했을 때 나오는 ‘Remove breakpoint’ 옵션을 통해 중단점을 삭제할 수도 있습니다.
    • 이 외에도 다양한 기능이 있습니다.

    조건부 중단점 (conditional breakpoint)
    줄 번호에 커서를 옮긴 후 마우스 오른쪽 버튼을 클릭하면 조건부 중단점(conditional breakpoint) 을 설정할 수 있습니다. Add conditional breakpoint를 클릭했을 때 뜨는 작은 창에 표현식을 입력하면,
    표현식이 참인 경우에만 실행을 중지시킬 수 있습니다.

    조건부 중단점을 설정하면 변수에 특정 값이 할당될 때나 함수의 매개 변수에 특정 값이 들어올 때만 실행을 중단시킬 수 있어 디버깅 시 유용하게 활용할 수 있습니다.

    debugger 명령어

    아래 예시처럼 스크립트 내에 debugger 명령어를 적어주면 중단점을 설정한 것과 같은 효과를 본다.

    ```javascript
    function hello(name) {
      let phrase = `Hello, ${name}!`;
      debugger;  // <-- 여기서 실행이 멈춥니다.
      say(phrase);
    }

    debugger 명령어를 사용하면 브라우저를 켜 개발자 도구를 열고 소스 코드 영역을 띄워 중단점을 설정하는 수고를 하지 않아도 된다. 에디터를 떠나지 않고도 중단점을 설정할 수 있기 때문에 편리하죠.

    멈추면 보이는 것들

    예시 페이지를 열면 함수 hello()가 자동으로 호출된다.
    중단점이 제대로 설정되어있는지를 확인하고,
    새로고침 단축기 F5나 Cmd+R를 눌러 중단점을 작동시켜보자.

    아래 그림과 같이 네번쨰 줄에서 실행이 중단되는 것을 확인할 수 있다.

    캡처

    이 상태에서 디버깅 영역의 를 클릭해 하위 패널들을 하나씩 펼쳐봅시다. 각 패널은 아래와 같은 기능을 제공한다.

    1. Watch - 표현식을 평가하고 결과를 보여줌
    add expression 버튼 +를 클릭해 원하는 표현식을 입력한 후 enter를 누르면 중단 시점의 값을 보여준다.
    입력한 표현식은 실행 과정 중에 계속해서 재평가 된다.

    2. Call stack - 코드를 해당 중단점으로 안내한 실행 결로를 역순으로 표시함
    실행은 index.html안에서 hello()를 호출하는 과정 중에 멈추었다.
    함수 hello 내에 중단점을 설정했기 때문에, 콜 스택 최상단엔 hello가 위치한다.
    index.html 에서 함수 hello를 정의하지 않았기 때문에 콜 스택 하단엔 'anonymous'가 출력된다.

    콜 스택 내의 항목을 클릭하면 디버거가 해당 코드로 휙 움직이고, 변수 역시 재평가됩니다. 'anonymous’를 클릭해 직접 확인해 봅시다.

    3. Scope - 현재 정의된 모든 변수를 출력한다.
    local은 함수의 지역변수를 보여준다. 지역변수 정보는 소스코드 영역에서도 확인(강조표시) 할 수 있다.
    global은 함수 바깥에 정의된 전역변수를 보여준다.
    local 하위항목으로 this에 대한 정보도 출력되는데, 이에 대해선 추후에 학습하도록 하겠다.

    실행 추적하기

    이제 본격적으로 실행 단계마다 어떤 일이 일어나는지 추적 해보겠습니다.

    먼저, 디버깅 영역 상단에 있는 버튼들이 무슨 역할을 하는지 알아봅시다.

    – ‘Resume’: 스크립트 실행을 다시 시작함 (단축키 F8)
    캡처

    실행을 재개합니다. 추가 중단점이 없는 경우, 실행이 죽 이어지고 디버거는 동작하지 않습니다.

    버튼을 클릭해봅시다.

    실행이 다시 시작되다가 함수 say() 안에 설정한 중단점에서 실행이 멈춘다.
    이 시점에서 우측의 'Call Stack’을 살펴보면 스택 최상단에 콜(say)이 하나 더 추가된 것을 확인할 수 있다.
    현재 실행은 say() 안에 멈춰있는 상황이다.

    출처 : 자바스크립트 인포

    참조영상 :
    https://www.youtube.com/watch?v=LG88BAJB6vI

    https://developers.google.com/web/tools/chrome-devtools/javascript

    ```

    'Study > JavaScript' 카테고리의 다른 글

    method and this  (0) 2020.06.02
    ‘for…in’ 반복문  (0) 2020.06.02
    함수선언식 vs 함수표현식  (0) 2020.06.02
    Json이란 무엇인가.  (0) 2020.06.01
    The Render Function  (0) 2020.05.26

    댓글

Designed by Tistory.