lldb 內存讀取

因此許多時候須要調試原始的C語言指針。Xcode的調試器LLDB提供了許多有趣的調試指令,下面來看看針對內存數據的讀取和修改指令。html

爲了更好地演示,先寫一段測試代碼,以下:app

int ints[] = {1, 2, 3};
double doubles[] = {1.1, 2.2, 3.3};
NSMutableData *data = [NSMutableData data];
[data appendBytes:ints length:sizeof(ints)];
[data appendBytes:doubles length:sizeof(doubles)];
char *bytes = (char *)[data bytes];

OK!而後在bytes變量後加入斷點,運行,接着在Xcode下方輸入調試指令。post

 

首先是LLDB的內存讀取指令,這個其實能夠用memory read指令,可是這個指令寫起來太繁瑣了,幸虧LLDB繼承了GDB的x命令,能夠快速的用簡短的指令來完成多種內存讀取操做。測試

好比顯示bytes變量前三個int的內容:編碼

(lldb) x/3xw bytes
0x100107980: 0x00000001 0x00000002 0x00000003

這裏x表明用16進制來顯示結果,w表明Word(16位)大小。因此x/3xw就是用16進制來顯示bytes所指空間的3個16位的元素內容。對於x命令的詳細格式能夠參考,這篇文章,或者這篇加密

常見的大小格式爲:b – byte 1字節,h – half word 2字節,w – word 4字節和最後的g – giant word 8字節。spa

格式字符串則相似printfx是16進制,f是浮點,d是十進制等等。指針

 

後面的地址變量也能夠加表達式,若是有表達式的化需用單引號擴上內容。OK,有了上面的知識,咱們能夠作更多有意思的事情。調試

好比,查看後四個字節(也就是第二個int,注意表達式需用單引號擴住):code

(lldb) x/4xb 'bytes + 4'
0x100107984: 0x02 0x00 0x00 0x00

顯示後面3個double的內容:

(lldb) x/3fg 'bytes + 12'
0x10010798c: 1.1000000000000001
0x100107994: 2.2000000000000002
0x10010799c: 3.2999999999999998

或者顯示所有36個字節:

(lldb) x/36xb bytes
0x100107980: 0x01 0x00 0x00 0x00 0x02 0x00 0x00 0x00
0x100107988: 0x03 0x00 0x00 0x00 0x9a 0x99 0x99 0x99
0x100107990: 0x99 0x99 0xf1 0x3f 0x9a 0x99 0x99 0x99
0x100107998: 0x99 0x99 0x01 0x40 0x66 0x66 0x66 0x66
0x1001079a0: 0x66 0x66 0x0a 0x40

 

至於內存數據的寫入,對應LLDB的memory write命令,這裏LLDB沒有繼承GDB的set命令,因此只能直接用memory write。注意能夠經過-s參數來指定寫入數據的大小,同時memory write也支持寫入多個值。

好比:把第二個字節設置爲1:

(lldb) memory write 'bytes+1' 1
(lldb) x/4xb bytes
0x100107980: 0x01 0x01 0x00 0x00

能夠看到,這裏寫入的1大小默認是字節。固然,也可使用-s參數指定一個大小,好比把第二個int設置成15:

(lldb) memory write -s 4 'bytes+4' 15
(lldb) x/12xb bytes
0x100107980: 0x01 0x01 0x00 0x00 0x15 0x00 0x00 0x00
0x100107988: 0x03 0x00 0x00 0x00

最後,多值寫入,把bytes的前8字節寫入4個2字節的數字,分別是1,2,3,4:

(lldb) memory write -s 2 'bytes' 1 2 3 4
(lldb) x/12xb bytes
0x100107980: 0x01 0x00 0x02 0x00 0x03 0x00 0x04 0x00
0x100107988: 0x03 0x00 0x00 0x00

Related posts:

  1. .NET(C#):字符編碼(Encoding)和字節順序標記(BOM)
  2. .NET(C#):從文件中覺察編碼
  3. .NET(C#):靈活運用CryptoStream,加密不是必須用CryptoStreamMode.Write
  4. WPF: 和有索引的PNG8圖像發生致命衝突
相關文章
相關標籤/搜索