C++程序開發過程中,內存往往是一個經常需要關心的話題,特別是在進行Debug時,能正確的找出內存中的異常數據更是非常有用。
如對一個void*類型的數據void* data,在很多IDE中都可以對其直接進行內存查的,如下圖是在Xcode中查看的結果:
從圖中可以很清楚地看出data所指向內存的數據,具體方法就是xcode中,選中變量,直接右鍵選擇查看內存即可。
但是在Android studio中問題就變得相對複雜了,AS並沒有像xcode一樣具有非常好的集成環境,因此需要使用一些更為原始的手段,可能會有一個插件,因為對AS並不熟悉,所以也沒找到好的plugin。所以平時工作時一般會選擇使用LLDB的命令來進行內存探查。
如圖中所示,在debug時,懷疑data的數據是有問題的,需要確切知道data的值是不是我們預期的值,最好的方式是像xcode的提供的memory viewer來進行查看,但是AS中並沒有找到相關的view,右鍵也沒有相關提示。
一切回到最原始的做法,沒有GUI幫助,那還是使用命令行吧,畢竟AS的斷點調試還是基於LLDB的,所以使用LLDB的命令應該能搞定一切(這裡比較好的一點是LLDB的命令和GDB的命令差不多)。
啟動進程,當斷點到當前行後,可以在debug view進行中操作了,如下圖所示:
AS的debug view提供了兩種模式,Variables和LLDB,大部分情況下,直接在Variables模式下足以,但當需要更加細緻的操作時,還是需要回歸到最原始的命令行模式(LLDB)。
1. frame variable
切到命令行後,也無需擔心,依然可以快速查看所有的變量信息,並且得到的信息可能反而更加直觀,如
2. 打印變量
除了查看所有變量之外,還是逐個查看單個變量,使用p(print)命令,如:
3. 調試內存
前面兩個操作只是LLDB命令的簡單用法,並非本文的重點,本文的重點debug內存,現在回到之前的問題,我們需要知道data中的值是否正確,當然這很多方法,比如輸出log等。這裡我使用lldb提供的memory命令。
memory read --size 4 --format x --count 4 0xbffff3c0
memory命令讀取的地址可以是當前frame的變量,也可以是一個地址,如上圖所示,兩種方式得到的結果是相同的。
其中:
- --size 指定的是每個值所佔用字節數,可以是1,2,4,8等等,與要顯示的數據類型要匹配
- --format 顯示類型 x表16進制,也可以是f(float), d(int), u(unsigned int)等。
- --count 要顯示的值的個數
- 0xbffff3c0 是要調試的內存地址。
上面指令也可以簡化成
emory read -s4 -fx -c4 data
結果如下:
如果查看每個byte的數據,還可以更加簡化一下指令,其中最多隻能顯示1024個字節的數據,如果需要顯示更多,需要自行做偏移,如
memory read -s1 -c128 data
本文的核心內容到此基本就結束了,除此之外,LLDB還提供了一個parray命令來輸出數組類型的內容,如下圖所示
注意,使用parray時,必然將void* 強制轉換成具體類型。
本文只是簡單使用了lldb的部分特性,其它更多內容需要各位自己查找LLDB的相關文檔,希望能幫助各位正在使用Android studio進行c/C++開發的同學,希望至少能起到拋磚引玉的效果吧。
閱讀更多 Real遊戲引擎開發者 的文章