日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Windbg调试

發(fā)布時間:2024/4/14 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Windbg调试 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Windbg中文幫助手冊:http://www.dbgtech.net/windbghelp/

執(zhí)行程序:

  g (F5): ? 運(yùn)行程序

  p(F10):  ? 單步步過執(zhí)行

  ?? t? (F11/F8):  單步步入執(zhí)行

?

斷點(diǎn)處理:

  bl? 顯示斷點(diǎn)狀態(tài)
  bp 斷點(diǎn)下在固定地址
  bu 斷點(diǎn)下在符號上
  ba 斷點(diǎn)下在內(nèi)存上(當(dāng)內(nèi)存被操作時觸發(fā))
  be disable掉斷點(diǎn)
  bc Breakpoints 清除斷點(diǎn)

  其他的斷點(diǎn)操作包括:顯示斷點(diǎn)列表、禁止或恢復(fù)斷點(diǎn)、刪除斷點(diǎn)等。

  bd:禁止斷點(diǎn),d代表Disable。如bd 1,禁止斷點(diǎn)1。斷點(diǎn)被禁止后將不起作用,但亦未刪除。

  be:恢復(fù)斷點(diǎn),e代表Enable。恢復(fù)被禁止的斷點(diǎn)。如be 1恢復(fù)1號斷點(diǎn)。

  bc:清除斷點(diǎn),如:bc 1,清除斷點(diǎn)1;bc *,清除全部斷點(diǎn)。

  br:序號管理,r代表ReNumber,即重新排序。如:br 2 0,將2號斷點(diǎn)重設(shè)為0號斷點(diǎn)。

?

內(nèi)存處理:

!address? [地址]:查看指定地址處的內(nèi)存屬性。

!address :查看所有內(nèi)存區(qū)域的屬性。  

d* (Display Memory) 命令顯示指定內(nèi)存或范圍的內(nèi)容。

e* (Enter Values) 命令在指定內(nèi)存地址寫入數(shù)據(jù)。

?

d[類型] ?[地址范圍]

  d代表Display,類型包括:字符、字符串、雙字等。具體來說,d*命令共有這幾種:d、 da、db、dc、dd、dD、df、dp、dq、du、dw、dW、dyb、dyd、ds、dS。解釋如下:  
  db 以byte查看地址
  dd 以4字節(jié)查看
  dq 以8字節(jié)查看
  da 以字符串查看

e 【地址】【數(shù)據(jù)】

  e{b|d|D|f|p|q|w}?Address?[Values]?
  e{a|u|za|zu}?Address?"String"?
  e?Address?[Values]

注釋

該命令存在以下這些形式。edeD 命令的第二個字符區(qū)分大小寫。見下表:

命令輸入
e輸入數(shù)據(jù)的格式和前一次e* 命令一樣。(如果上一次的e*命令是eaezaeuezu,則最后一個參數(shù)是String并且不能省略。)
eaASCII 字符串(不以NULL結(jié)尾)。
eb字節(jié)值。
ed雙字值(4字節(jié))。
eD雙精度浮點(diǎn)數(shù)(8字節(jié))。
ef單精度浮點(diǎn)數(shù)(4字節(jié))。
ep指針大小的值。該命令根據(jù)目標(biāo)機(jī)的處理器架構(gòu)是32位還是64位,可能分別等于edeq
eq4字值(8字節(jié))。
euUnicode字符串(非NULL結(jié)尾)。
ew字值(2字節(jié))。
ezaNULL結(jié)尾的ASCII字符串。
ezuNULL結(jié)尾的Unicode字符串。

?

其他的內(nèi)存處理命令:

  • m?(Move Memory) 命令將一個內(nèi)存區(qū)域的內(nèi)容移動到另一個。
  • f (Fill Memory) 命令用一個模板寫入內(nèi)存區(qū)域,并重復(fù)直到區(qū)域被填滿。
  • c?(Compare Memory) 命令比較兩個內(nèi)存區(qū)域的內(nèi)容。
  • s?(Search Memory) 在內(nèi)存區(qū)域搜索指定的模板或搜索內(nèi)存區(qū)域中的ASCII或Unicode字符。
  • .holdmem?(Hold and Compare Memory) 命令將一個內(nèi)存區(qū)域和另外一個比較

寄存器查看

  r? :顯示所有寄存器的值

  r 【寄存器】 :顯示某一個寄存器的值

  默認(rèn)每執(zhí)行一步代碼就會顯示寄存器的值,在指令后面加r時候是指不顯示寄存器的值:

    pr????????????執(zhí)行一行源碼,并將寄存器切換為不顯示

查看調(diào)用堆棧:

  使用下面一些方法顯示調(diào)用堆棧:

  k?(Display Stack Backtrace) 命令是基本的堆棧追蹤命令。該命令顯示棧幀的基指針、返回地址和函數(shù)名。如果有源碼行號信息,k命令還會顯示源碼模塊和行號。

  kb?(Display Stack Backtrace) 命令和k命令一樣顯示堆棧,并且顯示傳遞給函數(shù)的前三個參數(shù)。

  kp?(Display Stack Backtrace) 命令和kb命令一樣顯示堆棧,并且顯示傳遞給函數(shù)的完整參數(shù)列表。

  kv?(Display Stack Backtrace) 命令和kb一樣顯示堆棧,并且再顯示幀指針省略信息(FPO)。在基于x86的處理器上,該命令還顯示調(diào)用約定的信息。在基于Itanium的處理器上,該命令顯示非易失性寄存器。

  kd?(Display Stack Backtrace) 命令顯示原始堆棧信息,不按照任何格式。

?

匯編模式的調(diào)試:

  反匯編指令:

  • u?(Unassemble) 命令反匯編并顯示一段機(jī)器碼。
  • uf?(Unassemble Function) 命令反匯編并顯示一個函數(shù)。
  • up?(Unassemble from Physical Memory) 命令反匯編并顯示保存在物理內(nèi)存中的一段機(jī)器碼。
  • ur?(Unassemble Real Mode BIOS) 命令反匯編并顯示指定的16位實(shí)模式代碼。
  • ux?(Unassemble x86 BIOS) 命令反匯編并顯示指定地址處的x86 BIOS代碼指令。
  • (僅WinDbg) 反匯編窗口反匯編并顯示指定節(jié)的機(jī)器碼。如果在Window 菜單中選擇了Automatically Open Disassembly,該窗口會自動激活。也可以通過點(diǎn)擊View 菜單的Disassembly 、按下ALT+7或點(diǎn)擊工具欄上的Disassembly window 按鈕()。

個人常用: 

查看堆命令:

  !heap

  !heap -a

  !heap也有一些很好用的命令

  !heap?-stat?顯示進(jìn)程中所有堆的信息,通過這個命令可以找到堆噴分配內(nèi)存塊所屬的堆

  !heap?-a?HEAP_HANDLE?顯示指定句柄的堆的情況

  !heap?-stat?-h?HEAP_HANDLE?可以看到堆中塊的分布情況

  !heap?-flt?s?size?顯示所有指定大小的塊

  !heap?-p?-a?堆分配記錄

?

r 查看地址和寄存器
k 查看棧空間
u 查看指令
lmi 查看加載的模塊
ln 查看當(dāng)前地址所在符號
s -a 搜索字符串
s -d 搜dword
s -

g -> go 繼續(xù)執(zhí)行

?

F10 (p) 逐過程單步

F8?? 繼續(xù)單步跟入

F5?? (g)繼續(xù)執(zhí)行

F9

!address 擴(kuò)展命令可以顯示指定的內(nèi)存地址的信息

dv? 命令可以查看當(dāng)前作用域下局部變量的類型和值

.reload命令重新加載模塊的符號信息

kv 可以查看函數(shù)異常的函數(shù)調(diào)用棧?

kn 命令查看棧貞的編號?

uf 命令反匯編

dv 命令顯示當(dāng)前作用域的所有局部變量的名字和值。

.hh 用來在Windbg中打開幫助文檔,比如使用.hh k則幫助文檔會打開到索引k命令處。

poi 操作符是WinDBG中可以被用來對指針進(jìn)行解引用。類似C語言中對指針的操作符*

?

.attach 0n4220 // 4220為十進(jìn)制pid,使用該命令附加調(diào)試時,必須先存在一個調(diào)試會話

.detach // 分離調(diào)試

.restart // 重啟并調(diào)試

.kill // 強(qiáng)制結(jié)束當(dāng)前調(diào)試

q // 退出windbg

?

  掌握有這些基本的調(diào)試指令,基本上可以調(diào)試一般的程序了,如果需要使用更多的功能需要查看windbg的幫助文檔來提升調(diào)試。后面我也會在調(diào)試和使用的過程中加以總結(jié)和完善。

1、poi指令:Poi操作符在WinDBG中可以被用來對指針進(jìn)行解引用. 類似C語言中對指針的操作符*.?

例如:0×00123456?? 中存放的是:0×00420000

   0×00420000? 中存放的是:1234

   dd poi(0×00123456) 顯示的就是1234

2、 查看多個地址數(shù)據(jù):dd 起始地址 目標(biāo)地址:

  dd 7ffd5000??? 7ffd5000 +128

?3、ba?Access?Size?[地址]  Access 是訪問的方式, 比如?e?(執(zhí)行),?r?(讀/寫),?w?(寫)

 ?? Size?是監(jiān)控訪問的位置的大小,以字節(jié)為單位。 值為 1、2或4,還可以是 8(64位機(jī))。

  比如要對內(nèi)存0x0483DFE進(jìn)行寫操作的時候下斷點(diǎn),可以用命令?ba w4 0x0483DFE。

?

轉(zhuǎn)載于:https://www.cnblogs.com/Yable/p/8633511.html

總結(jié)

以上是生活随笔為你收集整理的Windbg调试的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。