이번 시간에는 실행 중인 파이썬 프로그램에서 디버거를 호출하는 방법을 알아보겠습니다.

 


 pdb는 python debugger입니다. foo 함수 안에, import pdb와 pdb.set_trace()를 입력해 보겠습니다. 사실 저 두 줄이면 됩니다.

 

 

 다음에, python main.py를 입력해서, main.py를 실행시켜 보겠습니다. 그러면, foo() 함수 안의 5번째 줄의 print(x)에 멈춰있음을 확인할 수 있습니다. 이 지점에서 호출했기 때문에, 디버거가 해당 지점으로 진입하게 됩니다. 그리고 pdb shell이 하나 나오게 됩니다.

 

 

 이제 help를 입력해 봅시다. 여러 가지 명령어들이 있습니다. 저는 이 중에, 현재 위치의 stack trace를 보고 싶습니다.

 

 

 이 때에는 where를 입력하면 됩니다. where의 설명을 보면, stack trace를 출력한다고 되어 있습니다. 제일 최근의 frame은 아래에 출력한다고 되어 있습니다. 현재 5번째 줄에 멈추어 있습니다. 한 번 where 명령을 입력해 보겠습니다.

 

 main 함수의 8번째 줄에 foo()라는 함수를 호출했고, foo() 함수 내에 print(x)에 멈추어 있습니다. next와 같은 것을 한 번도 입력하지 않았으니, 요래 출력이 되는 게 맞습니다.

 

 

 vscode는 Open file in editor로 파일의 위치를 열 수 있습니다. 내부 코드를 보고 싶다면, 링크를 눌러서 보면 되겠네요. 여기까지 정리해 봅시다. pdb.set_trace()로, 해당 지점으로 디버거가 진입할 수 있게 하였습니다.

 

 


 추가로 몇 가지만 배워 봅시다. 더 자세한 내용은 공식 문서의 디버거 명령들에 있습니다. 먼저 x의 값을 3으로 설정해 보겠습니다.

 

 !x = 3을 입력하면, x에 3을 대입합니다. ! statement가 현재 스택 프레임에서 단일 statement를 수행하는데요. 여기에서 statement는 x = 3이였습니다. 따라서, local variable x에 3을 집어넣습니다. 그리고 나서, p x를 수행하였는데요. 이것은 x의 값을 보여주는 것이니 3이 나옵니다.

 

 

 main.py가 요래 바뀌었습니다.

 

 main의 5번째 줄에 멈추었다는 것을 볼 수 있습니다. 이 위치에 디버거로 접근하게끔 했기 때문입니다. x가 30일 때 s의 값을 출력하고 싶습니다. 그럴 때에는 어떻게 해야 할까요?

 

 

 b 6, x==30이라 입력해 봅시다. 그러면 6번째 줄에 브레이크 포인트가 새로 생깁니다. 그런데, 콤마 뒤에 붙은 조건에 의해, x==30일 때 멈추게 됩니다. 다음에 c로 중단점에 마주칠 때 까지 실행시켜 보겠습니다.

 

 그 다음에, p s를 입력해 보면 435가 출력됩니다. 1 + .. + 29의 값은 435입니다. 그리고 아직, 30이 더해지지 않았기 때문에, s의 값은 435가 맞습니다.