반응형
많은 개발툴들이 기본적으로 디버깅모드를 제공하듯이 파워빌더도 역시 디버깅모드를 지원한다. 특정한 변수값을 체크하기위해 MessageBox문을 삽입하는 원시적인 디버깅을 해왔다면, 앞으로는 파워빌더에서 제공하는 디버깅모드를 적극 활용하여 더욱 효율적인 디버깅을 해보도록 하자.
파워빌더 10.5 데모프로그램(<PowerBuilder 설치 폴더>\PowerBuilder 10.5\Code Examples\New DataWindow and UI\pb105demos.pbw)을 기준으로 디버깅 절차를 살펴보도록 하자.
- 원하는 위치에 Breakpoint를 건다.
예제로 w_tvdw_link윈도우를 디버깅하도록 하자.
w_tvdw_link윈도우를 오픈하고 원하는 스크립트의 위치에서 오른쪽 마우스키를 눌러서 나오는 메뉴중에 Insert Breakpoint라는 메뉴가 있다. 이 메뉴를 클릭하면 소스 스크립트 앞에 빨간점이 마크되는데 이것이 Breakpoint이다.
디버그모드로 프로그램 실행중 이 위치에서 스크립트 실행을 멈추고 제어권이 파워빌더로 넘어와서 디버깅 작업을 수행할수 있게된다.
이 예제에서는 Instance변수인 il_OldHeight의 값을 알아보기 위해 il_OldHeight에 값을 설정하는 스크립트에 Breakpoint를 걸어 보자.
- 디버그모드로 실행한다.
파워빌더 툴바의 디버그버튼(벌레모양)을 클릭하거나, 메뉴 Run > Debug {target명}을 클릭하면 Debugger Painter가 열리고, 디버그 툴바가 툴바메뉴에, Debug메뉴가 메뉴에 추가된다.
Debug > Start {target명} 메뉴를 선택(단축키 Ctrl+T)하거나, 툴바의 Start {target명}을 클릭하면 디버그모드로 프로그램이 실행된다. - 파워빌더는 프로그램 실행중 Breakpoint 위치에서 실행을 멈춘다.
스크립트창에 노란색 삼각형은 현재 실행중인 위치를 표시한다. 디버그모드로 실행중 1번에서 설정한 Breakpoint에서 실행을 멈추고 파워빌더로 제어권이 넘어와 Debugger Painter화면으로 이동된 것을 볼수가 있다. - Breakpoint위치에서 각 변수들의 값의 확인, Call stack확인, 변수값을 임의로 변경등과 같은 디버깅 작업을 수행한다.
스크립트 제어툴바를 이용하여 스크립트를 진행해 가면서 각변수의 값을 체크한다.
Continue(Ctrl+C) : 스크립트의 제어권을 프로그램에 넘겨버려서 프로그램을 실행한다.
Step In(F8) : 현재 스크립트에서 호출하는 함수나 이벤트의 스크립트 제어권을 넘겨 계속 디버깅 한다. Call Stack에 stack이 하나더 쌓이게 된다.
Step Over(F10) : 현재 스크립트에서 호출하는 함수나 이벤트로 제어권을 넘기지 않고 다음 라인으로 넘어간다.
Step Out(Shift+F8) : 현재 스크립트를 호출한 함수나 이벤트쪽으로 스크립트 제어권을 넘겨 계속 디버깅 한다. Call Stack에서 stack이 하나 빠진다.
Run To Cursor(Ctrl+F10) : 커서가 있는 스크립트까지 실행을 한다.
Set Next Statement : 한라인씩 스크립트를 실행한다.
각 툴바의 단축키는 이전버젼(9버젼은 사용한 적이 없어서 잘모르겠으나 8버젼 이번에는 단축키가 Continue만 있었다.)에서는 기본으로 설정이 안되어 있다. 단축키가 있으면 여러모로 편하기 때문에 Tools > Keyboard Shortcuts...에서 단축키를 설정하고 사용하도록 하자. 주의할점은 Debug메뉴는 Debugger Painter를 오픈한 상태에서 활성화 된다는 것이다. Debugger Painter를 열지않은 상태에서는 Debug메뉴가 활성화 되지 않기 때문에 Keyboard Shortcuts창에서 단축키를 설정할 수가 없다.
Debugger Painter에는 여러가지 창들이 있는데 이 창들의 값들은 현재 스크립트 위치의 상태를 상세히 설명해주는 정보들로 가득하다. 이 정보들을 이용해서 프로그램상에 존재하는 버그를 찾는 것은 사람이 할 일이다.
Local : scope가 현재 스크립트(함수, 이벤트)인 local변수와 그 값.
Global : Global 변수의 값.
Instance : scope가 현재 오브젝트인 Instance변수와 그 값.
Parent : 현재 오브젝트의 Parent의 변수와 그 값.
Shared : 현재 오브젝트의 Shared변수와 그 값.
Objects In Memory : 현재 메모리상의 오브젝트.
Call Stack : 현재 실행되는 스크립트의 Call Stack.
Breakpoints : 현재 타겟에 설정된 Breakpoints의 리스트.
Watch : 자주 체크하고 싶은 변수를 설정해 두고 일일이 찾는 불편을 감소시킬 목적으로 설정한 변수 리스트.
이중에서 개발과정에서 자주 사용되는 항목은 Local, Instance, Global, Watch 정도가 될 것같다.
특히 Watch에는 sqlca를 추가해 두면 DB에러를 체크하는데 많은 도움이 될수 있다. sqlca는 Global 변수로 transation sqlca로 정의되어 있다. Watch창에 드래그&드랍하거나, Debug > Add Watch, 툴바의 Add Watch툴버튼, Global창에서 sqlca선택 후 오른쪽 마우스클릭 후 나오는 팝업메뉴에서 Add Watch(참 종류도 여러가지네!)등의 방법으로 Watch변수로 추가한다.
디버깅중에 변수의 값을 임의로 변경하여 프로그램의 로직을 체크하고 싶을 때도 있을 것이다. 값을 변경하고 싶은 변수를 더블클릭하면 Modify Variable팝업이 나타난다. 이 팝업에서 원하는 값으로 변경하여 스크립트를 수행할 수가 있다.
예제에서 스크립트의 제어가 라인 16에 있는 상황에서 Local 변수 li_cnt값은 0이다. 이값을 임의로 5로 변경하여 다음 문장인 For루프를 실행하면, For루프를 그냥빠져나가 버리게 된다. 이와 같이 변수의 값을 조정하면서, 해당 변수의 값이 어떻게 되었을 때 프로그램의 흐름이 제대로 이루어지는지 확인해 볼수가 있다.
디버그모드로 실행중에 Breakpoint를 추가하는 작업이 가능하다. Source Browser에서 추가하고자 하는 Source를 열어서 해당 라인을 더블클릭하면 Breakpoint를 추가 할수가 있다. 또한 Breapoint에서 제어가 멈추게하는 조건을 설정할 수가 있는데, Debugger Painter의 Edit Stop()툴버튼이나, Edit > Breakpoint..., Breakpoints창에서 수정할 Breakpoint를 선택후 오른쪽 마우스 클릭하면 나타나는 팝업메뉴에서 Breakpoints...메뉴를 선택하면 Edit Breakpoints팝업창이 실행된다.
Occurrence : 해당 Breakpoint를 몇번째 실행될때 스크립트를 멈출 것인지 설정. Occurence에 2를 설정하면 해당 Breakpoint의 스크립트가 첫번째 실행될때는 멈추지 않고 2번째 스크립트가 실행될때 스크립트를 멈추게 된다. 이 옵션은 resize이벤트 처럼 여러번 이벤트가 중복되서 발생하는 경우 유용하게 사용될 수 있을 것 같다.
Condition : 이 옵션에는 특정 expression을 설정하고, 설정한 expression이 True가 될때에만 스크립트를 멈추는 기능이다. notisNull(val)으로 설정하면 val값이 Null이 아닐때만 해당 Breakpoint가 작동하게된다.
Variable탭에서는 특정변수가 변경되었을때 스크립트를 멈추게하는 Breakpoint를 추가하는 화면이다. Debug모드로 실행중 New버튼을 클릭하고, 현재 스크립트상의 변수명을 Variable에 입력하고 Apply 버튼을 클릭하면 'when {Variable} changes'라는 Breakpoint가 추가되는 것을 확인 할 수가 있다.
이 Breakpoint는 디버깅모드로 실행을 한 후에만 추가할수 있으며, 디버깅모드로 실행하지 않은 상태에서 Variable을 추가하고 Apply를 클릭하면 "The variable could not be found."라는 메시지만 나오고 Breakpoint는 추가되지 않는다. 반드시 디버깅모드로 실행후에 추가해야 한다는 것을 기억하길 바란다. - 디버깅으로 찾은 버그를 수정한다.
프로그램 버그의 판단과 수정은 전적으로 개발자의 몫이며, 디버깅모드는 개발자의 판단에 도움을 주기위한 툴일뿐이다. 디버그모드로 모든 버그를 제거할수 있다는 오류는 범하지 말기를 바란다. 디버깅 모드의 중단은 Debugger Painter 툴바의 Stop Debugging()툴버튼이나, Debug > Stop메뉴를 선택하면 된다.
지금까지 파워빌더로 디버깅하는 방법을 알아보았다. 디버깅을 잘하는 정도는 없다고 생각한다. 위에 설명한 것은 단지 방법일 뿐이지 이것으로 모든 버그를 잡을 수 있다는 것은 절대 아님을 명심하길 바란다. 가능하면 버그없는 프로그램을 만들어야겠지만, 버그가 적게 프로그래밍 할수는 있을지언정 버그가 전혀없게 프로그래밍하기는 불가능하다는 것이 지금까지의 경험이다. 그래서 이런 디버깅툴의 도움을 받아서 버그를 잡아 버그를 줄여나가는 과정은 개발과정에서 반드시 필요한 과정이다. 버그들이 벌벌떨수 있도록... ^^;
<출처 : http://www.alan-keum.info/tag/Debug >