因此許多時候須要調試原始的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
格式字符串則相似printf
,x
是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