콜스텍확인 명령어
k
View>Call Stack
콜스택은 아래가 시작점이고 위가 끝접임.
파라미터 까지 보려면 kb 명령을 사용함.
kb,kp,kv,kn,kf 등이 있음.
콜스텍확인 명령어
k
View>Call Stack
콜스택은 아래가 시작점이고 위가 끝접임.
파라미터 까지 보려면 kb 명령을 사용함.
kb,kp,kv,kn,kf 등이 있음.
WinDbg help 에도 자세히 설명되어있는 내용이지만. 정리차원에서 간만에 포스팅합니다.
WinDbg 하나만 있으면 대부분의 환경에서 "디버깅" 이란 귀찮은 작업이 가능하죠.
보통 커널 디버깅에만 많이 사용들 하는데 유저모드 네이티브 어플리케이션 디버깅시에도
특히 리모트에서 실행중인 프로그램을 디버깅하는데 매우 유용합니다.
디버기(디버깅을 당할 컴퓨터)에 WinDbg 를 설치하고 (바이너리를 복사만 해도 됩니다!)
아래의 명령을 실행합니다. 이 명령을 실행하면 WinDbg 가 네트워크 서버로 동작하는 겁니다.
WinDbg.exe -server tcp:port=12345
명령이 잘 실행되었다면 빈 WinDbg 창이 뜨는데 여기서 디버깅할 프로그램을 실행하거나 실행중인
프로세스에 Attach 해도 됩니다.
( 이미 실행중인 프로세스를 디버깅 타겟 프로세스로 지정하려면 명령줄 뒤에 -p PID 형태의 옵션을 넣어도 되구요. )
예들들어 File -> Open Executable (Ctrl + E) 를 눌러서 notepad.exe 를 디버거로 실행시켜 두고, 디버거로 실행한 notepad.exe 를 원격에서 디버깅해 봅시다!!
디버거(디버깅을 하는 컴퓨터) 쪽에는 당연히 WinDbg 가 설치되어있어야 겠죠.
디버거에서 아래의 명령을 실행하면 디버기(Debuggee 라는 이름을 쓰는 컴퓨터. 당근 아이피로도 되죠)에
접속이 되고, 디버거에서 실행한 WinDbg 의 명령들이 그대로 디버기쪽에서 동작합니다.
WinDbg.exe -remote tcp:server=Debuggee,port=12345
명령이 잘 실행되었으면 마찬가지로 WinDbg 가 실행될 것입니다.
디버기에서 실행중인 WinDbg 화면도 아마 디버거쪽에서 실행중인 WinDbg 의 출력 내용과 동일할 것입니다.
이제 디버거쪽에서 필요할 심볼/소스 경로 설정해서 디버깅하면 되죠.
WinDbg 는 더욱 더 다양한 디버깅 시나리오를 지원하는데요. 자세한 내용은 WinDbg 의 도움말을 참고하시면 됩니다.
도움말의 Remote Debugging 으로 색인해 보시면 나옵니다.
1. Open Executable
프로그램 시작시점에부터 디버깅을 하려고 할 때 사용함.
File>Open Executable
2. Attach to a Process
절대로 종료되면 안되는 프로세스를 또는 서비스를 디버깅해야 할 때 사용한다.
Nonivasive 옵션을 체크하거나 qd 명령을 이용하면, 프로세스의 내부 정보는 확인할수 있다. 프로세스를 멈추거나 동작을 바꾸거나 하는 제어는 바꿀수 없음.
File>Attach to a Process
3. 문제발생시 자동으로 실행
Windbg –I
1. 운영체제 심볼로드(경로지정)
File>Symbol Search Path or Ctrl+s
SRV*c:\websymbols*http://msdl.microsoft.com/download/symbols
SRV 는 심볼 서버를 사용한다는 의미.
다운받을심볼경로
심볼서버의 URL
2. 운영체제 심볼URL 경로가 생각나지 않을 때
명령창에서 .symfix c:\websymbols
3. APP심볼경로 추가하기.
.sympath+ c:\Mysymbols
“+"를 꼭 붙여줘야함 안붙여주면 기존에 있던 경로는 모두 삭제됨.
경로 설정후 .reload 는 잊지말길..^^
[사용예]
notepad.exe 가 핸들릭을 발생시키는 우리의 프로세스라고 가정합니다.
notepad.exe 를 실행하고 WinDbg 의 Attach Process 로 attach 합니다.
이 상태에서 !htrace 를 사용하면 다음과 같이 오류 메시지가 발생합니다.
0:001> !htrace
Handle tracing is not enabled for this process. Use "!htrace -enable" to enable it.
하지만 친절하게도 사용할 수 있는 방법을 가르쳐 주네요.
Application Verifier 없이도 -enable 옵션을 사용하면 동작합니다.
0:001> !htrace -enable
Handle tracing enabled.
Handle tracing information snapshot successfully taken.
이 때부터 사용하는 핸들은 내용 추적이 가능합니다.
g 로 진행시키고 notepad 에 몇자 적어놓고 나서 Break 를 잡습니다.
이제 !htrace 명령어를 수행하면 그동안 Open/Close 된 핸들의 정보가 나옵니다.
가장 유용한 정보는 Open/Close 가 수행된 콜스택을 보여준다는 부분입니다.
어떤 API 에 의해 Open 된 것인지 보이기 때문에 핸들의 타입을 정확히 알 수 있고
콜스택이 보이기 때문에 어떤 목적으로 어떤 행위를 하고 있었다는 것이 확인됩니다.
0:001> !htrace
주의할 점은 같은 핸들에 대해서 Open 되고 Close 된 것이 모두 나오기 때문에
차근차근 확인해 보셔야 합니다.
이 정보만 가지고도 많은 도움이 되지만 핸들이 닫히지 않고 계속 남아 있는 릭
상황을 확인할 때는 -diff 옵션을 사용하면 더 좋습니다.
-diff 옵션을 사용하면 -enable 을 실행할 때 snapshot 잡힌 정보와 -diff 할 때의
정보를 비교하여 닫히지 않고 열려있는 핸들만 보여줍니다. 핸들릭을 잡는 상황이면
이렇게 보여지는 핸들중에서 문제의 핸들을 찾는 것이 훨씬 쉬울 것입니다.
0:001> !htrace -diff
출처 : GreeMate의 끄적끄적 :: [WinDbg 사용] 핸들릭 잡기
http://www.driveronline.org/bbs/view.asp?tb=tipbbs&GotoPage=1&s_bulu=title&s_key=windbg&no=92
1.환경변수에 아래 경로 추가.
C:\Program Files\Debugging Tools for Windows (x86)
2. Windbg 실행
3. OS 심볼 경로 설정
^S 또는 file Symbols Path 에 경로를 삽입.
| OS | SRV*d:\osSymbols*http:/msdl.microsoft.com/download/symbols |
| App |
4. File>Open Executable 를 클릭해서 디버깅할 파일 선택(Sample : Myapp.exe)