사용자 도구

사이트 도구


kb:windbgtips

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

kb:windbgtips [2014/11/12 12:50] (현재)
excel96 새로 만듦
줄 1: 줄 1:
 +{{INLINETOC}}
  
 +====== WinDbg Tips ======
 +[[WinDbg]] 팁
 +
 +
 +====== - 덤프에서 vtable 가지는 클래스 인스턴스 주소 찾기 ======
 +===== - 기본 아이디어 =====
 +가상 함수를 가지는 클래스들은 인스턴스 주소 맨 앞의 4 혹은 8 바이트가 항상 해당 클래스의 vtable을 가르키고 있으므로,​ 해당 vtable의 주소를 알아낸 다음, 힙에서 그 주소를 가르키고 있는 메모리 위치를 모두 찾아서, 출력해보는 것이 기본적인 아이디어다. 메모리 전체를 검색해야 하므로, 덤프는 당연히 풀덤프여야 한다. 이상하게 Visual Studio에서 뜬 덤프에서는 정상적으로 찾을 수가 없다. 작업 관리자, WinDbg, Process Explorer를 이용하도록 하자.
 +
 +===== - 작업 순서 =====
 +==== - vftable 관련 심볼 찾기 ====
 +  ​
 +<​code>​
 +0:000> x GameServerDebug!CPC*
 +...
 +00000001`4061b4f8 GameServerDebug!CPC::​`vftable'​ = <no type information>​
 +...
 +</​code>​
 +
 +==== - vftable 심볼 찾기 ====
 +
 +<​code>​
 +0:000> x GameServerDebug!CPC::​`vftable'​
 +00000001'​400ab430 GameServerDebug!CPC::​`vftable'​ = <no type information>​
 +00000001'​400ab468 GameServerDebug!CPC::​`vftable'​ = <no type information>​
 +00000001'​400ab568 GameServerDebug!CPC::​`vftable'​ = <no type information>​
 +00000001'​400ab4f8 GameServerDebug!CPC::​`vftable'​ = <no type information>​
 +</​code>​
 +
 +다중 상속을 한 클래스의 경우 위와 같이 여러개의 심볼이 존재한다. 이런 경우 클래스 인스턴스의 메모리 레이아웃은 아래와 같이 이루어진다.
 +
 +<​code>​
 +vtable0 -- base0 내용 -- vtable1 -- base1 내용 -- ...
 +</​code>​
 +
 +안타깝지만,​ 위의 주소값만으로는 어느게 vtable0 인지 알 수 없다.
 +
 +==== - 메모리 주소 최대값 찾기 ====
 +<​code>​
 +0:000> !address
 +</​code>​
 +
 +==== - 각 vftable에 대해서 메모리 검색 ====
 +<​code>​
 +0:000> s -q 0 L?​7fffffe0000 00000001400ab430
 +000007ff`ff32bf38 00000001`400ab430 000007ff`ff413f20
 +
 +0:000> s -q 0 L?​7fffffe0000 00000001400ab468
 +...
 +
 +0:000> s -q 0 L?​7fffffe0000 00000001400ab568
 +...
 +
 +0:000> s -q 0 L?​7fffffe0000 00000001400ab4f8
 +...
 +</​code>​
 +
 +==== - 각 주소에 대해 조사 ====
 +<​code>​
 +0:000> dt CPC 000007ff`ff32bf38
 +...
 +</​code>​
 +멤버 변수들의 값이 주루룩 출력될 텐데, 정상적인 주소인지 아닌지는 변수들의 값을 통해 대충 알 수 있을 것이다.
 +
 +
 +====== - Associate windbg with .dmp files ======
 +from http://​blogs.msdn.com/​tess/​archive/​2005/​12/​05/​500020.aspx
 +
 +If you get tired of starting the debugger, loading your dump, setting up your sympath, loading your extensions, etc. etc. here is a nifty way of getting "Debug this dump" on the context menu for .dmp files and get all your favourite commands automatically loaded. ​
 +
 +First create a .reg file with the following contents (as always be very careful when modifying the registry) ​
 +<​code>​
 +Windows Registry Editor Version 5.00
 +
 +[HKEY_CLASSES_ROOT\.dmp]
 +@="​Debugger.Dump"​
 +
 +[HKEY_CLASSES_ROOT\Debugger.Dump]
 +
 +[HKEY_CLASSES_ROOT\Debugger.Dump\DefaultIcon]
 +@="​c:​\\debuggers\\cdb.exe"​
 +
 +[HKEY_CLASSES_ROOT\Debugger.Dump\Shell]
 +
 +[HKEY_CLASSES_ROOT\Debugger.Dump\Shell\Debug_Without_Remote]
 +@="​Debug This Dump"
 +
 +[HKEY_CLASSES_ROOT\Debugger.Dump\Shell\Debug_Without_Remote\Command]
 +@="​\"​C:​\\debuggers\\windbg\"​ -z \"​%1\"​ -c \"​$<​c:​\\debuggers\\commands.txt\""​
 +
 +[HKEY_CLASSES_ROOT\Debugger.Dump\Shell\Debug_With_Remote70]
 +@="​Debug this Dump With Remote:​70"​
 +
 +[HKEY_CLASSES_ROOT\Debugger.Dump\Shell\Debug_With_Remote70\Command]
 +@="​\"​C:​\\debuggers\\windbg\"​ -server tcp:port=70 -z \"​%1\"​ -c \"​$<​c:​\\debuggers\\commands.txt\""​
 +</​code>​
 +
 +This will give you two additional options on the context menu when rightclicking on .dmp files. First "Debug this dump" which will open windbg with your dump and then run the commands in commands.txt. The second option <​code>"​Debug this Dump With Remote:​70"</​code>​ will do the same thing but also set up a remote so that your coworkers can remote in to your debugging session though port 70. (Remember to change the paths so they point to the directories where you have windbg.exe and commands.txt) ​
 +
 +Secondly, create a file called commands.txt that contains any commands you want to run when the debugger starts. The one below sets the symbol path to the public symbols and loads sos.dll. ​
 +
 +<​code>​
 +.sympath srv*c:​\websymbols*http://​msdl.microsoft.com/​download/​symbols
 +.load clr10\sos
 +</​code>​
kb/windbgtips.txt · 마지막으로 수정됨: 2014/11/12 12:50 저자 excel96