반응형



http://cafe.naver.com/totallab/442




WinDbg(디버거)를 프로그램(디버기)에 연결하는 방법은 세 가지가 있습니다.

 

-       WinDbg에서 프로그램을 실행하면서 연결하는 방법

 

-       이미 프로그램이 실행된 상태에서 WinDbg를 나중에 연결하는 방법

 

-       프로그램이 먼저 실행된 상태에서 어떤 문제가 발생했을 때 자동으로 WinDbg가 연결되는 방법

 

 

1)     WinDbg에서 프로그램을 실행하기

<?xml:namespace prefix = o /><?xml:namespace prefix = o /><?xml:namespace prefix = o /><?xml:namespace prefix = o /><?xml:namespace prefix = o /><?xml:namespace prefix = o /> 

 프로그램의 시작점인 main함수부터 디버깅을 하려고 할 때 사용됩니다. ( : 비주얼 스튜디오에서 코드를 작성하고F5 키를 눌러 실행하면서 디버깅하는 것과 비슷함)

[File] 메뉴에서 [Open Executable]을 선택합니다.

 

 

 

프로그램이 존재하는 위치를 찾아가서 파일 이름을 선택하고 [열기]를 누릅니다자신의 프로그램이 명령 인자를 받는다면 하단에 보이는 [Arguments]에 명령 인자를 입력하고 [열기]를 누릅니다[열기]를 누르면 프로세스 초기화가 끝나고 아래 그림처럼 main 함수에 진입하기 전에 멈추게 됩니다.

 


 

여기서 를 누르거나 F5 를 누르면 main() 함수로 진입하면서 프로그램이 실행됩니다. Main() 함수부터 디버깅을 하려면 이 시점에 main() 함수에 브레이크 포인트를 걸어주고 g 명령을 수행해야 합니다.

 

 

2)    실행 중인 프로그램에 WinDbg 붙이기

 

이미 실행 중인 응용프로그램을 디버깅하려고 할 때는 붙이기(Attach) 기능을 제공 합니다주로 다른 응용프로그램에 의해 실행되어야 하는 종류나 명령 인자를 동적으로 생성하는 종류의 응용프로그램이나 운영중인 서비스 프로세스를 디버깅해야 할 때 사용합니다이런 경우 응용프로그램이나 서비스를 실행시킨 다음 WinDbg를 붙이기해 디버깅할 수 있습니다.

 

WinDbg의 [File] 메뉴에서 [Attach to a Process]를 선택합니다.(단축키 : F6)

 

 

현재 실행 중인 프로세스 목록에서 디버기를 선택하고 [OK]를 누릅니다주의할 점은 WinDbg를 종료하면 실행 중이던 프로그램도 함께 종료된다는 사실입니다기본적으로 디버깅을 하려고 디버거를 붙이는 것은 자유롭게 가능하지만 디버거를 떼어내는 것은 자유롭지 못하다는 의미입니다.

 

실행 중이던 응용프로그램이 종료되지 않게 하려면 아래 부분의 Noninvasive 옵션을 사용합니다단 [Noninvasive] 옵션을 체크하면  WinDbg가 프로그램에 붙기는 하지만 프로세스를 멈추거나 동작을 바꾸거나 하는 제어는 할 수 없으며단지 프로세스 내부의 어떤 정보나 특정 메모리를 확인할 수밖에 없지만 WinDbg를 종료해도 프로세스는 계속 실행됩니다.

 

Noninvasive 모드는 절대 종료하면 안 되는 프로세스를 디버깅해야 하는 경우 프로세스 내부 정보를 확인할 수 있으므로 디버깅에 필요한 정보를 안전하게 얻을 수 있습니다개발 중인 프로그램에는 이런 기능이 필요 없겠지만 운영 중인 주요 서비스 프로그램을 디버깅해야 하는 상황이라면 이런 방법으로 해결할 수 있습니다.

 

윈도우 XP 이후부터는 Noninvasive 모드를 사용하지 않아도 qd(Quit and Detach) 명령을 이용하여 프로세스를 종료하지 않고 디버거를 프로세스로부터 떼어낼 수 있습니다. qd 명령어를 사용하면 디버깅에 아무 제약도 없으면서 WinDbg를 종료해도 프로세스는 종료되지 않는다는 장점이 있습니다주의하실 점은 종료하기 전에 qd 명령어를 치지 않으면 같이 종료되어 버리기 때문에 꼭 잊어버리시면 안됩니다.

 


 

프로세스 목록에서 디버기를 선택하면 프로그램을 중단시키고 디버거에게 제어를 넘겨줍니다멈춰진 화면은 ‘1)WinDbg에서 프로그램 실행하기’ 와 비슷하지만 main()함수는 이미 수행되어 지나가 버린 상태이고어떤 코드를 수행하다가 중지된 것인지 알 수 없는 상황입니다따라서 앞으로 수행될 것으로 예상되는 함수에 브레이크 포인트를 걸면서 디버깅을 시작해야 하는데심볼을 먼저 맞춰줘야 추가 작업을 진행할 수 있습니다이에 관련된 내용은 차후에 자세히 다루도록 하겠습니다.

 

3)     프로그램 실행 중 문제가 발생했을 때 자동으로 WinDbg 실행하기

 

이 방법은 사용자가 직접 연결하는 방법은 아닙니다이 기능은 레지스트리에 존재하는 AeDebug 키를 이용하는 방법으로 이 기능을 설정하려면 명령 프롬프트에서 WinDbg를 실행할 때 다음과 같이 –I 옵션을 사용합니다.

 

※ 윈도우 7에서는 명령프롬프트를 관리자 권한으로 실행하여야 합니다.

 

 

 

     

 

그러면 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug 레지스트리에WinDbg가 등록되어 어떤 프로세스에 문제가 발생했을 때 자동으로 실행됩니다.

 

 

이 방법은 주로 불특정하고 오랜 기다름 끝에 오류가 발생하는 종류의 문제를 해결할 때 사용됩니다오류가 발생한 순간WinDbg가 자동으로 붙여지게 설정해 놓으면 여유 있게 디버깅의 순간을 기다릴 수 있을 것입니다.

=========================================================================

3) 번 실행 후 갑자기 에러가 나네요... 해결방안을 찾을 때까지 윈도우 7에서는 시도하지 않는 것이 좋을듯 싶습니다. 에러창을 끄고 그냥 사용하면 되지만 잠시 보류하시기 바랍니다.

 

반응형

+ Recent posts