windbg調試命令5(ln、偽寄存器)
1.ln
ln 命令顯示給定地址處的或者最近的符號。
ln表示list near,ln命令將儘可能地給出與特定地址相關的符號,如果沒有符號能夠精確地與這個地址匹配,那麼調試器將通過指標演算法對靠近這地址的符號進行運逄,
並返回運算結果符號
0:000> ln 01012475
(01012475) calc!WinMainCRTStartup | (0101263c) calc!__CxxFrameHandler
Exact matches:
calc!WinMainCRTStartup = <no type information>
0:000> ln 01012475+1
(01012475) calc!WinMainCRTStartup+0x1 | (0101263c) calc!__CxxFrameHandler
我們發現,第一個顯示為Exact matches:表示精確匹配了一個地址,如果不是精確匹配,我們要小心,是否模組進行了最佳化,在最佳化後,一個函數,可能被拆分為多個部分
分別位於不同的地址,經過最佳化的映像可以通過lm查看:會有perf標識
當你在查看某部分資料,卻不知道這部分資料所表示的內容時,這個命名能帶來極大的協助
2.偽寄存器
對於那些偶爾使用調試器的使用者是很難記得所有平台的指令指標寄存器名字(或其他的名字),為了克服這個問題,調試器的Team Dev引入了各種偽寄存器,由調試器把這些偽寄存器對應到不同的硬體架構上,形式為$name,與標準的寄存器一樣,如果要在運算式中使用偽寄存器,那麼必須使用逸出字元@
$exentry
當前進程的入口地址
0:002> r $exentry
$exentry=01012475
一般可以直接在這下斷點,
這個就對應PE檔案中的ImageBase+AddressOfEntryPoint(_IMAGE_OPTIONAL_HEADER)
$ip
指令指標寄存器
在X86架構上,$ip = eip
在x64架構上,$ip = rip
在Itanium架構上, $ip = iip
0:000> r @$ip$ip=7c92120e0:000> r eipeip=7c92120e
注意到下面顯示的分別是$ip,eip,雖然它們在X86下是同一個東東.
$ra
當前函數的返回地址
0:000> r $ra
$ra=7c95e612
0:000> kb
ChildEBP RetAddr Args to Child
0012fb1c 7c95e612 7ffdd000 7ffde000 00000000 ntdll!DbgBreakPoint
0012fc94 7c94108f 0012fd30 7c920000 0012fce0 ntdll!LdrpInitializeProcess+0xffa
0012fd1c 7c92e437 0012fd30 7c920000 00000000 ntdll!_LdrpInitialize+0x183
00000000 00000000 00000000 00000000 00000000 ntdll!KiUserApcDispatcher+0x7
其實也是對應當前線程,如果要看所有線程的當前函數的返回地址:
0:000> ~* r $ra$ra=77d191be$ra=7c92df2c$ra=7c92df3c$ra=7c970010
$retreg
主要的值寄存器,在函數調用返回後,函數的結果將放在這個寄存器中,根據處理器架構的不同,$retreg的值分別為
在x86架構上,$retreg = eax
在x64架構上,$retreg = rax
在Itanium架構上,$retreg = ret0
0:000> r $retreg
- $retreg=00251eb4
- 0:000> r eax
- eax=00251eb4
0:000> r $retreg$retreg=00251eb40:000> r eaxeax=00251eb4
$csp
當前的棧指標,根據處理器架構的不同,$csp的值分別為
在x86架構上,$csp = esp
在x64架構上,$csp = rsp
在Itanium架構上,$csp = bsp
0:000> r $csp
- $csp=0012fb24
- 0:000> r esp
- esp=0012fb24
0:000> r $csp$csp=0012fb240:000> r espesp=0012fb24
$tpid
當前進程的標識(PID)
0:000> r $tpid
- $tpid=000013f4
0:000> r $tpid$tpid=000013f4
$tid
當前線程的標識(TID0
0:000> r $tid
- $tid=000014a0
0:000> r $tid$tid=000014a0