2014. 4. 27. 14:13

[ windbg command 모음집 ] 암기해야 할 명령어들 정리 

‘srv*C: \WebSymbols*http://msdl.microsoft.com/download/symbols’

----------------- 일반적인 명령어들 ----------------------

uf      ==    (gdb) disass 


bl     ==    breakpoint list

bp    ==    set BreakPoint

bu    ==    set Unresolved Breakpoint (defers the actual setting of the breakpoint until the moudule is loaded)

ba    ==    break on address

bc     ==    breakpoin clear 

be, bd    ==    breakpoint enable, disable


k      ==     callstack 을 보여준다 .

lm     ==     load 된 파일과 unload 된 모듈들을 보여준다. 

ex) lm vm msvcrt

lmD   ==     -||- ( output in Debugger Markup Language )

  

dt nt!_TEB  //Thread enviroment block 설정들을 보여줌 == !teb

dt nt!_PEB  //Process Enviroment Block 설정들을 보여줌 ==  !peb

ex )dt nt!_PEB -r @$peb // @$peb = address of our process’s PEB (see pseudo-register syntax)

ex2)dt nt!_TEB Addr   // full TEB dump


!dlls  == dll 정보들을 보여준다. 

!dlls -c kernel32       ==        same as before for kernel32 only  ( kernel32 대신 다른것을 써도된다)

ex) !dlls -c msvcrt 


!tls   ==  tls 정보들을 보여준다


!mgreloc     ==     relocation 정보를 보여준다.

!dh kernel32     ==      kernel32 의 헤더정보를 보여준다.

 

~         ==        thread statues for all thread

~0        ==         thread status for thread 0 

~.           ==       thread statues for currently active thread

~*        ==       thread status for all threads with some extra info (priority, startAdress)

~*k      ==       call stacks for all thread ~ !uniqstack

~<trehad>s     ==    set current thread

!gle     ==     get last error


?       ==    ' = ' 의미와 비슷하다 결과를 알려줌

ex) ? 00130000 - 0012c0000

result ) evalute expression : 16384 = 00100000


!uniqstack  == 모든 thread들에 대한 현재 프로세스의 콜스택을 보여준다.


k == 콜스택을 보여준다

kP == P의 의미는 각 호출되는 함수들의 full 파라미터를 의미함.

kf  == f == distance between adjacent frames to be displayed (useful to check stack consumption of each frame

kv == v == display FPO information + calling convention 

kb == 각각의 함수들의 처음 3파라미터를 보여준다. 

dds == stack trace 


------------------------------Memory handling ------------------------------------------------

dd     ==    double word 형태로 보여줌

da     ==    문자열 형태로 보여줌 

du     ==    유니코드 형태로 보여줌 

f        ==    fill memory

dds     ==    words 와 심볼들을 보여준다.

ddp     ==     참조되는 메모리들을 보여준다.

!address -RegionUsageStack    ==    Dispaly stack regions for all threads in the process

----------------------------- Heap Information    ------------------------------------------------

!heap ?     ==    간단 요약

!heap -h        ==    범위내의 힙 리스트 나열 

!heap -s 0     ==    summary for all heaps

!heap -p     ==    Gflags settings HeapHandle list

!heap -p -all ==    Details of all allocations in all heaps in the process 

dds == stack trace 


-------------------------------------------------------------------------------------------------

!locks       ==    프로세스 크리티컬 섹션같은 락킹된 리스트를 보여줌 -v 옵션을 주면 모두 출력 

!cs [ Opt ] [CsAddr ] == 크리티컬 섹션트리를 보여줌

!avrf -cs  == Display a list of deleted critical section



[ Automatic Pseudo -Registers ]

$ra         ==    스택의 현재 주소를 반환   ex ) g $ra

$ip         ==     Instruction Pointer   ( x86 = EIP , itanium=IIP , x64 = RIP )  

$exentry  ==    현재 프로세스의 첫 EP 값

$retreg     ==    리턴되는 주소를 갖는 값 (EAX, RAX ) 

$peb        ==    process environment block 

$peb        ==   Address of the thread environment block of current Thread

$tpid        ==    Process ID (PID)

$tid        ==    Thread ID(TID)



------------------ Meta or Dot-command 들 ----------------------

.sympath  == 심볼 경로들을 보여줌 ( 설정도 가능 )  

.cls   == 화면 초기화

.lastevent == 방금전 했던 명령어 

.detach == process  deteach

.if == ?? 

.reload /f ntdll.dll   // ntdll 이 없다고 뜰때 해결

 




-------------------- 확장 명령어 ------------------------------

!analyze == 심볼정보등 프로세스의 자체 분석내용을 나열해준다.

!address == section 헤더들의 주소들도 알려주고.. 뭔가 더하는것같은데.. 잘모르겠다

!handle  == 사용되는 핸들러들을 보여준다.

!peb == PEB 파일을 보여줌. 


!ext.help ==  일반적인 확장 도움말

!Uext.help  == 사용자모드의 확장 ( OS에 특화되지 않은 것 )

!Ntsdexts.help == 사용자모드의 확장( OS에 특화됨 )

!Kdexts.help == kernel-Mode Extensions 

!logexts.help == Logger Extensions 

!clr10/sos.help == debugging ManagedCode


 

------------------------------- Symbol 관련  -------------------------------

_NT_SYMBOL_PATH=srv*C:\Symbols\MsSymbols*http://msdl.microsoft.com/download/symbols; //명령어아님


.sympath          ==     심볼을 보여주거나 셋팅이 가능하게 해줌

.sympath + XY  ==     XY 디렉토리를 심볼 경로에 추가함

!sym noisy       ==     심볼 검색에 대한 정보를 표시 

ld kernel32       ==     kernel32 dll 을 불러온다.

ld *                 ==     모든 모듈을 위해 심볼을 불러온다.

.reload            ==     심볼 정보를 모두 재로드한다.

. kernel32!*      ==     kernel32에 대한 자료를 검토한다.

dt ntdll!*          ==     모든 종류의 ntdll 을 보여준다.


 --------------------------------  소스 관련 -------------------------------

.srcpath          == 소스파일을 불러오거나 셋팅할 수 있다.

.srcpath + XY   == XY폴더를 소스파일 검색 폴더에 추가한다.






[ heap 메모리 릭 찾기 ]

0:001> !heap -stat -h 0

Allocations statistics for

heap @ 00150000

group-by: TOTSIZE max-display: 20

size #blocks total ( %) (percent of total busy bytes)

100000 101 - 10100000 (99.99) 0x101 * 1MB allocated. Looks like a good candidate for a memory leak.

928 2 - 1250 (0.00)

64 24 - e10 (0.00)

0:001> !heap -flt s 100000 get all allocations with size: 100000

_DPH_HEAP_ROOT @ 151000

Freed and decommitted blocks

DPH_HEAP_BLOCK : VirtAddr VirtSize

Busy allocations

DPH_HEAP_BLOCK : UserAddr UserSize - VirtAddr VirtSize

024f0698 : 13831000 00100000 - 13830000 00102000

024f0620 : 13721000 00100000 - 13720000 00102000

… There should be 0x101 entries with size 100000 output here.

Let’s take the first one with UserAddr=0x13831000

0:001> !heap -p -a 13831000

address 13831000 found in

_DPH_HEAP_ROOT @ 151000

in busy allocation ( DPH_HEAP_BLOCK: UserAddr UserSize - VirtAddr VirtSize)

24f0698: 13831000 100000 - 13830000 102000

7c91b298 ntdll!RtlAllocateHeap+0x00000e64

0045b74e TestApp!CMyDlg ::OnBnClicked_DoMemoryLeak+0x0000003e

0040b122 TestApp!_AfxDispatchCmdMsg+0x00000043

0040b32f TestApp!CCmdTarget ::OnCmdMsg+0x00000118

00408838 TestApp!CDialog ::OnCmdMsg+0x0000001b




Posted by k1rha