디버그는 복잡한 개념이 아니다.
우리가 생각 없이 짠 코드를 교정해주는 작업일 뿐이다.
5를 0으로 나누거나,
변수를 잘못 할당하게 되면 다음 코드로 실행되지 않는다.
이러한 모순을 제거하는 것이 디버깅이다.
총 두 가지 방법을 말할건데,
IDE 환경과, 노트북 환경에서 디버깅 방법을 보겠다.
디버깅을 아예 모르는 사람들이 보면 좋을 정도의 포스팅이다.
VSCODE
IDE 중 가장 대중적인 VSCODE를 기준으로 설명하겠다.
<다른 intellij나 pycharm에서도 크게 다르지 않을 것이다>
일단 일부러 에러를 내보는 코드를 만들어보자.
지금은 한 눈에 에러가 보이겠지만, 코드가 천줄 만줄이 넘어가면
이 에러가 어디에서부터 시작했는지, 일일이 보기가 까다롭다.
이렇게 파이썬 파일을 적어놓고 우리가 검사해보고 싶은 breakpoint를 지정하면 된다.
breakpoint는 행 번호 옆에 마우스를 갖다대면 빨간 점이 아래와 같이 보일 것이다.
나는 divide라는 함수가 잘 동작하는 지 테스트할 것이다.
이렇게 하고 F5(디버깅 시작)을 눌러주면
내 코드의 breakpoint까지 실행할 것이다.
그리고 아래와 같은 화면이 뜬다
노란줄 부터 검사하겠다는 것이다.
우측 상단에 플로팅된 바를 조작하면서
코드의 흐름을 읽어가면 된다.
아래 화살표를 눌러주면 한 스텝씩 코드를 실행한다.
divide 함수의 연산과 리턴 행으로 들어왔다.
아마 y에 0이 할당되어있어 division zero와 관련된 에러가 날 것이다.
위와 같이 에러를 안내해주고 고치는 건 우리의 몫이 된다.
분모에 제약조건을 걸거나,
0에 근사한 값이 의미가 있는 경우라면 매우 작은 수를 더해도 된다.
나는 다음과 같이 코드를 고쳐봤다.
이후 다시 디버깅을 하면 더 이상의 에러 없이 코드가 실행된다.
* 그런데 코드가 실행됐다고 좋아하지는 말자.
에러가 없어야 되는 것도 맞지만,
코드 자체의 무결성과 의도대로 작성이 되는 것이 더 중요하다.
좌측 사이드탭에서는 디버깅과 관련된 부가기능을 사용할 수 있다.
가장 위의 [변수]는 현재까지 선언된 변수와 함수의 메타 정보를 볼 수 있다.
[조사식]에서는 코드 실행 중에 정의 된 변수들의 참 거짓을 알 수 있다.
보고싶은 파라미터에 대한 검증을 하거나,
데이터 타입이 알맞게 들어갔는지 등에 대한 검사를 할 수 있다.
[호출스택]은 말 그대로 함수가 호출된 순서를 담는 스택형 공간이다.
함수가 실행되는 순서대로 스택에 저장되어서 코드 실행 순서를 보기에 용이하다
[중단점]은 내가 설정해놓은 breakpoint들을 행 번호와 함께 볼 수 있는 공간이다.
뒤에 나올 노트북 상에서 디버깅하는 방법보다 더 직관적이고 편리하다고 느껴진다.
노트북 환경(Jupyter)
셀 단위로 실행되는 노트북은 그 자체가 디버깅 모드이다.
코드를 작게 분할해서 단위마다 실행할 수 있기 때문이다.
그럼에도 불구하고 커맨드 라인을 통해서 볼 수 있는 방법을 간단 소개한다.
여러가지 방법 중 pdb 라이브러리를 사용하는 방법을 보자.
에러가 나는 코드를 보고 싶은 곳에 pdb.set_trace()를 추가해주고 실행하면
사진 상단의 CLI 화면이 뜬다.
여기서 커맨드를 몇개 알아야 하는데
나는 현재 실행되는 코드 라인을 알려주는 list,
다음 스텝으로 넘어가는 n을 쳐줬다.
그 결과 아래의 ZeroDivisionError가 뜨게 된다.
코드로 삽입하는 breakpoint의 경우 위와 같이 보고자 하는 함수 안에서
실행되어야 정상적으로 작동이 된다.
위와 같이 보고자 하는 함수의 위에 배치하게 되면,
"skipped 1 hidden frame"과 같은 디버거에서의 에러가 뜰 것이다.
이유는 pdb.set_trace문은 최상위 수준(__main__인 위치)에서 실행되지 못하기 때문이다.
<이슈 포스팅 : https://github.com/ipython/ipython/issues/14152>
그렇기 때문에 local 함수 수준 내에서 실행되는 것이 이상적이다. <함수 안에 붙이라는 뜻>
작동 방식은 vscode의 디버거와 비슷하다.
breakpoint를 지정하고 단계적으로 코드를 실행하는 형태.
노트북 상에서 디버거는 하나의 셀 안에서만 동작하기 때문에
굳이 길고 복잡한 코드를 쓰지 않는다면 쓸 경우가 잘 없기도 하다.
하지만 알아놓으면 언젠가는 써먹는다.
결론
1. 디버깅은 필수 불가결하다.
2. 일일이 print 찍으면서 하지말고 편하게 잘하자.
pdb의 커맨드는 공식 문서에서 보도록 하자.
https://docs.python.org/ko/3.7/library/pdb.html
+추가로 웹 서버에서도 디버깅을 해볼 수 있다.
https://pythontutor.com/visualize.html#mode=edit