"Visual Studio가 설치된 PC에서" 실행중인 프로세스가 비정상종료를 하게 되면, 일반적인 메시지 박스 대신 디버깅하겠냐고 묻는 창이 뜨게 된다. 이때 "예"를 선택하면 디버거가 실행되면서 종료된 Process를 Attach하고 디버깅 모드로 들어가게 되는데, 이것을 "Just-In-Time Debugging"이라고 한다. 말하자면 오류가 발생했을 때 디버거가 실행중이 아니더라도 OS에서 등록된 디버거를 알아서 실행시켜주는 기능이라고 할 수 있다.

어차피 릴리즈 빌드라면 디버깅 심볼이 들어있지 않기 때문에 디버깅을 해도 알아보기 어려운 어셈 코드 뿐이겠지만, 적어도 죽은 위치와 죽었을 때의 Call-Stack을 확인할 수 있으니, map파일이나 cod 파일이 있다면 죽은 지점을 찾아보는데는 큰 도움이 된다.


위의 화면을 보면... 콜스택과 익셉션이 발생한 주소를 확인할 수 있다.


만약 Just-In-Time Debugger가 실행될 때 exe파일 외에 디버그 심벌을 저장한 pdb 파일이 함께 제공된다면, 디버거에서 실행시켰을 때와 거의 동일한 디버깅이 가능해진다. 물론 dll 에서 오류가 발생한 경우엔 dll의 pdb가 함께 제공되어야 한다.

먼저 pdb 파일을 생성하기 위한 옵션을 설정한다.
(VS2005 기준) C/C++ > General > Debug Information Format 에서 "Program Database"를 선택한다. 이 항목이 Disable일 경우 pdb 파일이 생성되더라도 안에 디버그 심볼이 포함되지 않아 디버깅 정보가 나타나지 않는다.


그 다음엔 "Linker > Debugging"에서 "Generate Debug Info"에 "Yes" 를 선택한다. 이 항목은 pdb 를 생성할지에 대한 설정이다. 이 항목이 "No"일 경우 pdb 파일이 생성되지 않는다.


자 이제 exe, dll과 같은 경로에 pdb 파일을 갖다놓고 exe를 실행시킨다.



오류창이 떠서 "디버그하시겠습니까" 를 물어볼 때 "예" (혹은 취소)를 선택하면 아래와 같은 Just-In-Time Debugger가 실행되어 오류가 발생한 시점에서의 모든 정보를 보여준다. 우측 하단에 콜스택, 좌측 하단에 변수에 들어있는 값들까지... 


위 이미지의 좌측 하단을 보면 Exception이 발생한 시점의 로컬 변수의 값들이, 우측 하단에는 CallStack이 C++ 소스코드의 함수명 기준으로 "어느 함수의 몇번째 줄"까지 확인할 수 있다. 이정도면 디버거에서 실행시킨 것과 진배없다.  ^___^


그런데 만약 이 Visual Studio에 소스코드 cpp 파일을 Attach시킨다면 진짜로 소스코드 수준의 추적이 가능해진다.
위의 이미지에서 콜스택의 특정 라인을 더블클릭하면 아래와 같이 해당 라인의 소스코드가 들어있는 cpp 파일을 요구한다.

이때, cpp 파일을 제공해주면 아래와 같이 소스코드 수준에서의 에러 위치 확인이 가능해진다.
(그냥 Ctrl + O 를 눌러서 소스파일을 Attach 해주어도 된다.)



물론... 이 방법의 경우 문제가 발생하는 PC (혹은 서버)에 Visual Studio 가 설치되어 있어야 한다는 조건이 있긴 하다. 그러니 일반 사용자 PC에서 오류가 발생하는 경우에는 (특히 불규칙적으로 발생하는 경우엔) 이 방법은 적용하기 힘들 것 같다. 하지만, 특정 PC에서 계속해서 벌어지는 경우나, 서버 프로그램의 경우엔 충분히 적용해볼 만 하다.


실 운영서버에 어떻게 디버거를 설치하냐구? 천만의 말씀! MS SQL Server 2005를 설치하면 자동으로 함께 깔리는 게 Visual Studio 2005 아니었던가? :)

Posted by kuaaan
,


사랑합니다. 편안히 잠드소서