使用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。
----------------------------------------------------------------------------------------------------------------
可以按照上面的方法繼續遍歷你想要知道的結構體資料資訊。