티스토리 뷰

728x90

웹서비스와 같은 대몬 프로그램을 개발하다보면 스레드가 나뉘어지는 등 프로그램의 처음부터 디버깅하는 것은 적절치 않을 뿐만아니라 디버깅을 걸기도 쉽지 않습니다. 이런 경우 일단 프로그램을 실행시켜두고 서비스 수행중에 실행 될 수 있는 특정 함수에 중단점을(Break point) 설정하여 해당 요청이 있을 경우 프로그램이 어떻게 흘러가는지 분석해 볼 수 있습니다.

 

이런 작업은 이미 완성형태를 갖추고 있는 서비스를 처음부터 새롭게 분석해야 할 경우나, 오픈 소스 형태로 배포되는 서비스 프로그램을 분석할 때도 요긴하게 사용할 수 있습니다. 내가 프로그램을 처음부터 개발한 것이 아니니 핵심 처리 루틴에 대하여 실제 동작 흐름을 파악할 수 있다면 분석에 큰 도움이 되는 것은 두말 하면 잔소리임을 누구나 동의할 수 있을 것입니다.

 

예제에 적용할 사례는 오픈 소스로 배포되는 Z39.50 서버의(YAZ) 처리 흐름을 파악하는 과정을 보일까 합니다.

 

우선 소스 코드를 디버깅 모드로 컴파일 해야만 한다. 이렇게 해야만 바이너리 코드에 소스 관련 정보가 담겨서 원활한 디버깅이나 분석이 가능 합니다. 아래의 그림은 IDE 환경이 아닌 비주얼 스튜디오 nmake 도구로 빌드하는 프로그램에서 디버깅 옵션 설정 과정과 실제 컴파일 과정을 나타낸 것입니다.

 

DEBUG=1   # 0 for release, 1 for debug

USE_MANIFEST = 1




디버그 정보를 포함하도록 프로그램을 빌드했으면, 일단 프로그램을 실행시키고 비주얼 스튜디오를 따로 엽니다. 예제에서는 2010 버전을 사용했는데 비주얼 스튜디오>디버그>"프로세스에 연결"을 선택 합니다.



연결하려는 프로세스를 선택하고 [연결] 버튼을 클릭하면 현재 실행중인 프로세스를 디버깅 할 수 있습니다.


디버그>새중단점>"함수에서 중단"을 선택 합니다.




함수 이름에 서비스 요청이 들어오면 가동될 함수의 이름을 입력하고 [확인]버튼을 누르면 됩니다.



중단점이 정상적으로 설정되어 서비스 요청시 디버거가 프로그램을 적절하게 중단했으나 코드를 찾지 못하는 경우에는 위의 그림과 같이 프로젝트>속성>"소스 파일 디버그"에서 관련 코드가 있는 곳을 지정해 주면 됩니다.



위의 그림은  Z39.50서버에 대한 요청이 도착했을때 디버거를 통해 본 실행 분석 화면 입니다.


실행중인 서비스를 계속 진행시킬 때는 디버그>"모두 분리"를 클릭하면 서비스는 디버거와 관계없이 원래대로 계속 작업을 수행 합니다.

 

이런 분석 방법은 프로그램이 갑자기 오동작하거나 멈춘 상황에서 왜 이런 현상이 발생했는지 원인을 밝히는데 매우 유용 합니다.




728x90
댓글
최근에 올라온 글
최근에 달린 댓글
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함