본문 바로가기

Autohotkey강좌

Autohotkey #43, SciTE4Autohotkey를 이용한 디버깅

반응형

https://youtu.be/Nkvk_Htp0Dc

SW개발의 꽃은 디버깅(Debugging)입니다. 많은 분들이 직접 디버깅을 해 보는데 어려움을 겪고 있는듯 하여 그것을 설명해 드리겠습니다. 여러가지 방법이 있겠지만, Autohotkey를 설치할 때 따라오는 SciTE4Autohotkey가 가장 쉽게 접할 수 있고, 다음으로는 Notepad++등에 디버거를 Add해서 사용하는 방법이 가장 쉽게 접할 수 있는 방법입니다. 오늘은 SciTE4Autohotkey를 설명하겠습니다.

우선 Autothotkey#1(https://autohotkey4auto.tistory.com/5 )에서 소개해 드린 내용중 일부지만 먼저 설치 및 한글메뉴 패치를 다시 보여 드립니다.

 

2) 전용 SciTE4Autohotkey Editor 설치 : 첨부 SciTE4AHK300601_Install.exe 설치 

 

3) SciTE4Autohotkey용 한글메뉴 패치 : 첨부한국어.locale.properties를 아래 경로에 설치

 

 

     설치 위치 :  C:\Program Files\AutoHotkey\SciTE\locales  또는 C:\Program Files (x86)\AutoHotkey\SciTE\locales

 

한글패치까지 되었다고 가정하고 이제 직접 디버깅을 시작해 보겠습니다.

다음은 주요 기능을 설명하겠습니다.

먼저 Run Script는 해당 스크립트를 바로 실행합니다. 에디터에서 직접 실행하거나 중단점까지 바로 진행하고자 할 때 사용하면 됩니다. 

Debug Script가 우리가 사용할 디버깅을 시작하기 위한 버튼입니다. 이 버튼을 누르면 화면이 변경됩니다.

Stop은 디버깅을 중단합니다.

다음에 있는 Run currnet line of code는 한단계씩 스크립트를 진행합니다. 특히 함수등을 만나면, 해당 함수안쪽으로 진입합니다.

다음에 있는 Run until next line of code도 역시 한단계씩 스크립트를 진행하지만, 함수를 만나더라도 함수안으로 진입하지 않고 바로 다음행으로 진행합니다. 차이가 느껴지시나요?

다음에 있는 Run until function/label exit는 F10으로 함수등으로 진입한 경우 해당 함수의 마지막에서 반환합니다.

특정 함수에서 디버깅을 웬만큼 진행해서 더 이상 해당 함수에 있을 필요가 없을 때 사용하면 되겠지요?

다음은 CallStack입니다. 호출한 순서의 역순으로 어느 함수에서 불렸는지를 보여주는 창입니다. 예를 들어 Start()라는 함수에 멈춘 상태에서 Callstack을 확인하면 아래와 같습니다.

 즉 맨 위 Start()함수가 현재 수행중인 라인이고 이 함수는 이전 ButtonStart 함수(subroutine)에서 호출되었습니다. ButtonStart함수는 이전의 Gui Window thread에서 호출되었습니다.

현재 예제에서는 단순한 경우라서 복잡하지 않지만, 복잡한 중단점에서 Callstack을 확인하고자 할 경우 사용하면 됩니다. 또는 여러 함수에서 호출이 되는 공통의 함수가 어디에서 호출되었는지 확인하려고 할 때 사용하면 좋습니다. 

다음은 Variable List입니다.

사용되고 있는 변수들에 대해서 보여주지만 배열변수라던가 object변수의 경우 다시 한번 클릭해야 내용이 자세히 보이는 단점이 있습니다만, 알고 사용하면 문제 되지 않습니다.

다음은 가장 중용한 중단점(breakpoint) 설정 방법입니다. 아무리 메뉴, 버튼을 찾아봐도 중단점 설정하기가 보이지 않습니다. 방법은 생각보다 쉽습니다. 에디터 좌측의 원하는 줄(라인)에서 마우스를 클릭하면 빨간 단추가 생성됩니다. 그 줄에 중단점(breakpoint)이 설정된것입니다. 다시 클릭하면 해제됩니다. 만약 중단점 설정하는 것이 불가능한 줄에서 클릭하면 어떻게 될까요? 바로 다음 라인에 중단점이 설정됩니다.

이상의 내용을 기반으로 실제로 디버깅을 진행해 보겠습니다. 

예제는 좀 단순한 PeriodicJob.ahk를 조금 수정해서 진행해 보겠습니다. 먼저 ButtonStart에서 함수를 호출하는 것으로 변경하고, 문제를 만들어야 하므로 FormatTime의 인자중 HHmm대신에 hhmm으로 입력했다고 가정하고, 오후 2시에 디버깅을 한다고 가정해 보겠습니다. 그 경우 Formattime의 다음줄에 중단점(breakpoint)을 설정합니다. FormatTime의 실행결과가 cur_time에 저장되므로 if( cur_time = mytime ) 중단점에서 멈춘 경우, cur_time을 읽어 보면 12시간 단위의 시간이 읽힙니다. 현재 시간이 오후 2시 1분이라고 가정하고 중단할 경우 cur_time에 저장된 값은 0201이 됩니다. 만약 인자를 HHmm으로 사용했다면 1401이 됩니다 실제로 본인은 24시간단위로 입력하겠다고 해서 mytime에 1401을 입력해 놓고 FormatTime에서 인자를 hhmm으로 사용하면 해당 값이 달라서 절대로 실행될 수 없는 상황이 됩니다.  

 

실제 디버깅을 한번 해 보시죠. 먼저 디버그 버튼을 눌러서 디버깅을 시작합니다.(F7키가 안 먹는 경우 설정등을 확인해 보셔야 합니다.) ButtonStart의 첫줄인 Start()에 중단점을 설정했습니다. 우선 원하는 시간을 입력하고 Start단추를 누릅니다. ButtonStart()dml 첫줄인 Start()에 정지했습니다.

여기에서 F10을 누르면 Start()함수 안으로 진입하고 

F11을 누르면 바로 return으로 진행합니다.

Start()함수에서 Callstack을 살펴보면 다음과 같습니다.

이전 설명에서와 동일하게 보여집니다.

다음은 Myjob()에서 Variable list를 확인해 보겠습니다.

30행에서 중단점을 설정하였고, 최초 실행시 mytime은 1159였고, 현재 시간(cur_time)은 1209입니다. 따라서 두 값이 다르므로 if문이 참이 되는 경우가 실행되지 않습니다. 

이러한 방식으로 디버깅을 하면 됩니다. 의심이 가는 부분에 중단점을 설정하고 계속 따라가다 보면 왜 안 되는지 내용이 보일 것입니다. 다소 어렵다고 할 수 있지만, 모든 SW의 꽃은 디버깅입니다. 디버깅을 잘 하면 SW를 잘 한다고 할 수 있습니다. 전문가도 모두 디버깅의 고수들입니다. 남들이 몇일을 걸려 디버깅 하는 것을 몇분안에 디버깅하는 사람이 전문가입니다. 물론 처음부터 디버깅을 잘 하는 사람은 없습니다. 자꾸 만들어 보고 문제의 원인을 파악해야 가능합니다.  여러분도 모두 전문가가 되어 보시기 바랍니다.

수정된 스크립트는 다음과 같습니다.

PeriodicJobv1.1.ahk
0.00MB

반응형