1. 程式人生 > >使用WinDbg檢視非當前執行緒所在模組的記憶體資料資訊

使用WinDbg檢視非當前執行緒所在模組的記憶體資料資訊

在工作中經常需要檢視dump,雖然現在VC2015已經做的非常好了,尤其是對map的解析,非常方便,而且enum可以直接顯示定義字串。但windbg卻有一些vc沒有提供的功能(可能我沒有發現~~),比如檢視非當前執行緒所在模組的記憶體資料資訊。下面對此方法做一下說明,以備遇到此問題的同學快速查閱。

材料:dt dll名字 結構體名字 mem地址。

其實挺簡單。只要使用dt命令就行。

格式: dt dll_name!struct_name mem_addr

即 dt dll名字(不能帶字尾名)! 結構體名字 記憶體地址

截圖舉例

   dt NXDecoder!Classname 000000011fc44e30
   +0x000 __VFN_table : 0x000007fe`e90e9228 
   +0x008 m_p    : 0x00000001`1fdcbf50 
   +0x010 m_stParam : tag_NXParam
   +0x028 m_stGroup : std::vector<CNXItem *,std::allocator<CNXPixelItem *> >
   +0x058 .....

由於某種原因,將上面的dt內容做了整形,有點面目全非,但基本能看出來。

這個是要通過一個類指標解析類的內容。000000011fc44e30 -- 類指標地址。

由於這個類是幾個繼承的子類,因此在指標記憶體0偏移處是一個虛表,可以忽略,其實是父類指標。

   +0x028 m_stGroup : std::vector<CNXItem *,std::allocator<CNXPixelItem *> >

這個是我們要解析的重點,可以看到是一個vector,vector的記憶體地址是 000000011fc44e30 +0x028

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

於是我們接著解析這個vector。

dt NXDecoder!NXtemGroup 11FC44E58
   +0x000 _Myownedaux      : 0x00000000`336882f0 std::_Aux_cont
   +0x008 _Alaux           : std::allocator<std::_Aux_cont>
   +0x010 _Alval           : std::allocator<CNXPixelItem *>
   +0x018 _Myfirst         : 0x00000002`15edf680  -> 0x00000002`153e7a40 CNXPixelItem 
   +0x020 _Mylast          : 0x00000002`15edf708  -> 0x00000002`157e3c60 CNXPixelItem 
   +0x028 _Myend           : 0x00000002`15edf878  -> 0x80000062`386b5530 CNXPixelItem 

可以看到這個vector的元素是指標,64位程式一個指標8位元組,這樣,這個vector就有(0x00000002`15edf708 - 0x00000002`15edf680) / 8 + 1 = 12個元素,這裡是閉區間。

0x00000002`153e7a40 -- vector中第一個元素的值,是一個指標值。

記得遍歷vector元素時,要偏移0x00000002`15edf680。

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

可以按照上面的方法繼續遍歷你想要知道的結構體資料資訊。