본문 바로가기
Software/Python

VSCode Python Extension에서 멀티 스레드 디버깅

by lovey25 2021. 3. 23.
반응형

파이썬 코딩에 Visual Studio Code(VSCode)를 많이들 사용하시는지 잘 모르겠는데, 저는 VSCode가 무겁지 않고 아두이노 스케치뿐만 아니라 공부하고 있는 다양한 언어를 사용할 수 있어서 All in one IDE 개념으로 VSCode를 잘 사용하고 있습니다. 그리고 VSCode에서 파이썬 코딩을 편리하게 하기 위해서는 Extension설치가 필요한데, 뭐가 좋은 Extenstion인지 잘 모르기 때문에 가장 많은 사람들이 쓰고 있는 "Python" 사용하고 있습니다. 이름도 깔끔하고 제작자도 MS라 그냥 믿고 쓰고 있답니다.

그런데 어느 순간 디버깅을 하는 와중에 이상하게 브레이크 포인트를 설정했는데도 불구하고 프로그램이 멈추지 않고 계속 돌아가는 상황을 겪게 되었습니다. 처음엔 디버거 사용법을 몰라서 그런가 보다 하고 한참을 삽질했고 계속되는 삽질 끝에 무작정 안 되는 게 아니라 코드의 특정 위치에서만 브레이크 포인트가 무시된다는 사실을 알게 되었습니다. 그리고 그 위치는 멀티 스레드로 동작하는 루틴이었습니다.

혹시나 저와 유사한 상황에서 디버깅이 안돼 당황하고 계실 분들을 위해서 Python Extension에서 멀티 스레드 디버깅하는 방법 공유합니다.

위 사진은 QRunnable 상속 클래스인 백그라운드 실행 루틴이 있고 그 안에 crawl()이라는 함수의 동작을 추적하고자 디버깅을 하려 하는 중입니다. 함수가 호출되는 즉시 제어권을 VSCode로 가져오려고 함수 내 첫 행에 브레이크 포인트를 설정했는데 이 포인트가 무시되고 있는 상황입니다.

Python Extension의 설명을 읽어보면 디버깅 항목에 멀티 스레드 디버깅도 분명히 지원한다고 되어 있는데도 말이죠.

그래서 디버깅 기능을 설명한 기술문서를 찾아보니 이런 내용이 있었습니다. 멀티 스레드 디버깅을 위해서는 디버깅하고자 하는 파일 맨 위에 다음 두줄의 코드를 추가해야 한다고 합니다.

기술문서에서 시키는 대로 코드 그대로 복사해서 브레이크 포인트를 설정할 파일 젤 위에 추가해 봤습니다. 

하지만 그냥 이렇게 복사해서는 원하는 곳에서 멈추게 할 수 없었습니다. 맞는 방법인지는 모르겠는데, 제가 성공한 방법은 이렇습니다. 추가하라고 한 코드 2줄 중에서 "import debugy"는 문서 맨 앞에 그대로 두지만 두 번째 행인 "debugy.debug_this_thread()" 코드를 브레이크 포인트를 설정할 함수 안쪽으로 옮겼습니다. 

백그라운드 클래스의 시작 부분에 넣어도 안되고 저는 오로지 디버깅 포인트와 같은 레벨의 함수 첫 줄에 이 코드를 넣어야만 브레이크 포인트가 인식이 됐습니다.

추가 코드를 삽입하고 제가 원하는 위치인 60행에서 VSCode가 디버거로써 제어권을 가져온 것을 볼 수 있습니다. 그리고 변수 상태와 함께 콜 스택에도 백그라운드 스레드가 잘 표시되고 있습니다.

 

끝!

반응형

댓글