Android Studio中使用LLDB進行內存調試

C++程序開發過程中,內存往往是一個經常需要關心的話題,特別是在進行Debug時,能正確的找出內存中的異常數據更是非常有用。

如對一個void*類型的數據void* data,在很多IDE中都可以對其直接進行內存查的,如下圖是在Xcode中查看的結果:

Android Studio中使用LLDB進行內存調試

從圖中可以很清楚地看出data所指向內存的數據,具體方法就是xcode中,選中變量,直接右鍵選擇查看內存即可。

但是在Android studio中問題就變得相對複雜了,AS並沒有像xcode一樣具有非常好的集成環境,因此需要使用一些更為原始的手段,可能會有一個插件,因為對AS並不熟悉,所以也沒找到好的plugin。所以平時工作時一般會選擇使用LLDB的命令來進行內存探查。

Android Studio中使用LLDB進行內存調試

如圖中所示,在debug時,懷疑data的數據是有問題的,需要確切知道data的值是不是我們預期的值,最好的方式是像xcode的提供的memory viewer來進行查看,但是AS中並沒有找到相關的view,右鍵也沒有相關提示。

一切回到最原始的做法,沒有GUI幫助,那還是使用命令行吧,畢竟AS的斷點調試還是基於LLDB的,所以使用LLDB的命令應該能搞定一切(這裡比較好的一點是LLDB的命令和GDB的命令差不多)。

啟動進程,當斷點到當前行後,可以在debug view進行中操作了,如下圖所示:

Android Studio中使用LLDB進行內存調試

AS的debug view提供了兩種模式,Variables和LLDB,大部分情況下,直接在Variables模式下足以,但當需要更加細緻的操作時,還是需要回歸到最原始的命令行模式(LLDB)。

1. frame variable

切到命令行後,也無需擔心,依然可以快速查看所有的變量信息,並且得到的信息可能反而更加直觀,如

Android Studio中使用LLDB進行內存調試

2. 打印變量

除了查看所有變量之外,還是逐個查看單個變量,使用p(print)命令,如:

Android Studio中使用LLDB進行內存調試

3. 調試內存

前面兩個操作只是LLDB命令的簡單用法,並非本文的重點,本文的重點debug內存,現在回到之前的問題,我們需要知道data中的值是否正確,當然這很多方法,比如輸出log等。這裡我使用lldb提供的memory命令。

memory read --size 4 --format x --count 4 0xbffff3c0
Android Studio中使用LLDB進行內存調試

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

結果如下:

Android Studio中使用LLDB進行內存調試

如果查看每個byte的數據,還可以更加簡化一下指令,其中最多隻能顯示1024個字節的數據,如果需要顯示更多,需要自行做偏移,如

memory read -s1 -c128 data
Android Studio中使用LLDB進行內存調試

本文的核心內容到此基本就結束了,除此之外,LLDB還提供了一個parray命令來輸出數組類型的內容,如下圖所示

Android Studio中使用LLDB進行內存調試

注意,使用parray時,必然將void* 強制轉換成具體類型。

本文只是簡單使用了lldb的部分特性,其它更多內容需要各位自己查找LLDB的相關文檔,希望能幫助各位正在使用Android studio進行c/C++開發的同學,希望至少能起到拋磚引玉的效果吧。

Android Studio中使用LLDB進行內存調試


分享到:


相關文章: