生活随笔
收集整理的這篇文章主要介紹了
windbg-!address、!vadump、!vprot(读取内存状态)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
!address
!address?擴展顯示目標進程或目標機使用的內存信息
這個學習起來比較簡單:我們直接使用!address -?就可以找到它的使用說明:
[cpp]?view plaincopy
0:000>?!address?-??? !address?????????????????-?prints?information?on?the?entire?address?space?? !address?-???????????????-?prints?this?help?? !address?<address>???????-?prints?available?information?about?the?region?? ???????????????????????????of?the?address?space?containing?this?address?? !address?-summary????????-?prints?only?summary?information?? !address?-RegionUsageXXX?-?fiters?the?output?limiting?the?dispaly?to?one?? ???????????????????????????of?the?following?types:?? ??RegionUsageIsVAD????????????-?`busy`?region?that?could?be?charcterized?better?? ?????????????????????????????????this?includes?Virtual-Alloc-ed?blocks,?SBH?heap,?? ?????????????????????????????????memory?from?custom?allocators,?etc?? ??RegionUsageFree?????????????-?availalble?(neither?committed?nor?reserved)?region?? ??RegionUsageImage????????????-?region?used?by?mapped?images?of?binaries?? ??RegionUsageStack????????????-?stack?of?threads?? ??RegionUsageTeb??????????????-?TEB?of?threads??? ??RegionUsageHeap?????????????-?region?in?used?by?a?heap?? ??RegionUsagePageHeap?????????-?region?in?use?by?full?page-heap?? ??RegionUsagePeb??????????????-?PEB?of?the?process?? ??RegionUsageProcessParametrs?-?parameters?of?the?process?? ??RegionUsageEnvironmentBlock?-?environment?block??
那么一個個說明吧:
!address顯示整個地址空間和使用摘要的信息
這個太長了,它會把從0-7ffefff的全打印出來,熟悉核心編程的應該知道,正常的2G用戶地址空間是這樣劃分的:0-ffff為64K空指針區,10000-7ffeffff為用戶模式分區
之后64K為禁入分區,之后就是內核模式分區,要看它們的信息,需要用到以下的表,
Filter?值顯示的內存區域
| RegionUsageIsVAD | "busy" 區域。包括所有 虛擬分配塊、SBH堆、自定義內存分配器(custom allocators)的內存、以及地址空間中所有屬于其他分類的內存塊。 |
| RegionUsageFree | 目標的虛擬地址空間中所有可用內存。包括所有非提交(committed)和非保留(reserved)的內存。 |
| RegionUsageImage | 用來映射二進制映像的內存區域。 |
| RegionUsageStack | 用作目標進程的線程的堆棧的內存區域。 |
| RegionUsageTeb | 用作目標進程中所有線程的線程環境塊(TEB)的內存區域。 |
| RegionUsageHeap | 用作目標進程的堆的內存區域。 |
| RegionUsagePageHeap | 用作目標進程的整頁堆(full-page heap)的內存區域。 |
| RegionUsagePeb | 目標進程的進程環境塊(PEB)的內存區域。 |
| RegionUsageProcessParametrs | 用作目標進程啟動參數的內存區域。 |
| RegionUsageEnvironmentBlock | 用作目標進程的環境塊的內存區域。 |
下面這些Filter值按照內存類型來指定內存。
Filter?值顯示的內存類型
| MEM_IMAGE | 映射的文件屬于可執行映像一部分的內存。 |
| MEM_MAPPED | 映射的文件不屬于可執行映像一部分的內存。這種內存包含哪些從頁面文件映射的內存。 |
| MEM_PRIVATE | 私有的(即不和其他進程共享)并且未用來映射任何文件的內存。 |
下面的Filter?值按照狀態來指定內存:
Filter?值顯示的內存狀態
| MEM_COMMIT | 當前已提交給目標使用的所有內存。已經在物理內存或者頁面文件中為這些內存分配了物理的存儲空間。 |
| MEM_RESERVE | 所有為目標以后的使用保留的內存。這種內存還沒有分配物理上的存儲空間。 |
| MEM_FREE | 目標虛擬地址空間中所有可用內存。包括所有未提交并且未保留的內存。該Filter?值和RegionUsageFree一樣。 |
比如一般30000不會被分配:
[cpp]?view plaincopy
0:000>?!address?30000?? ?TEB?7efdd000?in?range?7efdb000?7efde000?? ?TEB?7efda000?in?range?7efd8000?7efdb000?? ?TEB?7efd7000?in?range?7efd5000?7efd8000?? ?ProcessParametrs?00641a40?in?range?00640000?00648000?? ?Environment?00640810?in?range?00640000?00648000?? ????00030000?:?00030000?-?00010000?? ????????????????????Type?????00000000??? ????????????????????Protect??00000001?PAGE_NOACCESS?? ????????????????????State????00010000?MEM_FREE?? ????????????????????Usage????RegionUsageFree??
表示輸出表明這是以地址0x30000開頭的一個大的內存區域,該區域中包含一個以0x30000 開頭,大小為0x10000的小一些的區域。因此,這個小區域是從0x30000 到0x40000。它的內存類型為0、狀態為 MEM_FREE、使用方式為
RegionUsageFree
。 (這些值的含義,查看前面的表格。)?
我們調用.dvalloc來強制分配
[cpp]?view plaincopy
0:000>?.dvalloc?/b?30000?100?? Allocated?1000?bytes?starting?at?00030000??
[cpp]?view plaincopy
0:000>?!address?30000?? ?TEB?7efdd000?in?range?7efdb000?7efde000?? ?TEB?7efda000?in?range?7efd8000?7efdb000?? ?TEB?7efd7000?in?range?7efd5000?7efd8000?? ?ProcessParametrs?00641a40?in?range?00640000?00648000?? ?Environment?00640810?in?range?00640000?00648000?? ????00030000?:?00030000?-?00001000?? ????????????????????Type?????00020000?MEM_PRIVATE?? ????????????????????Protect??00000040?PAGE_EXECUTE_READWRITE?? ????????????????????State????00001000?MEM_COMMIT?? ????????????????????Usage????RegionUsageIsVAD??
!vadump
這個會顯示所有的虛擬內存區域和它的保護屬性
?
[cpp]?view plaincopy
0:000>?!vadump?? BaseAddress:???????00000000?? RegionSize:????????00010000?? State:?????????????00010000??MEM_FREE?? Protect:???????????00000001??PAGE_NOACCESS?? ?? BaseAddress:???????00010000?? RegionSize:????????00010000?? State:?????????????00001000??MEM_COMMIT?? Protect:???????????00000004??PAGE_READWRITE?? Type:??????????????00040000??MEM_MAPPED?? ?? BaseAddress:???????00020000?? RegionSize:????????00010000?? State:?????????????00010000??MEM_FREE?? Protect:???????????00000001??PAGE_NOACCESS??
!vprot
!vprot擴展命令顯示虛擬內存保護信息??梢杂糜诨顒诱{試和dump文件調試。
[cpp]?view plaincopy
0:001>?x?test1!g_char?? 00a67004?test1!g_char?=?0x00a6573c?"I?am?string"?? 0:001>?!vprot?00a67004??? BaseAddress:???????00a67000?? AllocationBase:????00a50000?? AllocationProtect:?00000080??PAGE_EXECUTE_WRITECOPY?? RegionSize:????????00002000?? State:?????????????00001000??MEM_COMMIT?? Protect:???????????00000004??PAGE_READWRITE?? Type:??????????????01000000??MEM_IMAGE?? 0:001>?!vprot??30000?? BaseAddress:???????00030000?? AllocationBase:????00000000?? RegionSize:????????00010000?? State:?????????????00010000??MEM_FREE?? Protect:???????????00000001??PAGE_NOACCESS ?
總結
以上是生活随笔為你收集整理的windbg-!address、!vadump、!vprot(读取内存状态)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。