目錄
一已球,Xcode動(dòng)態(tài)調(diào)試的原理
二臣镣,終端動(dòng)態(tài)調(diào)試的原理
三,建立連接
四智亮,LLDB常用命令
五忆某,ASLR
一,Xcode動(dòng)態(tài)調(diào)試的原理
1鸽素,圖解
2褒繁,說明
-
LLDB
是Xcode自帶的調(diào)試器
- 在真機(jī)調(diào)試時(shí),Xcode會(huì)自動(dòng)將
debugserver
安裝到iPhone上
- 執(zhí)行過程
1>
LLDB
將調(diào)試命令發(fā)送給debugserver
2>debugserver
將調(diào)試命令執(zhí)行到APP上
3>APP將調(diào)試信息反饋給debugserver
4>debugserver
將調(diào)試信息轉(zhuǎn)發(fā)給LLDB
- Xcode只能調(diào)試通過Xcode安裝的APP
二馍忽,終端動(dòng)態(tài)調(diào)試的原理
1棒坏,圖解
2,說明
- 需要手動(dòng)啟動(dòng)
LLDB
需要手動(dòng)建立
LLDB
和debugserver
之間的連接需要手動(dòng)建立
debugserver
和APP之間的連接建立好連接后就可以用終端調(diào)試任何APP了
三遭笋,建立連接
1坝冕,debugserver和APP的連接
- 給
debugserver
授予調(diào)試所有APP的權(quán)限
1>從iPhone中導(dǎo)出
debugserver
,再從debugserver
中導(dǎo)出權(quán)限文件2>在權(quán)限文件中添加兩個(gè)字段:
get-task-allow
瓦呼,task_for_pid-allow
3>將權(quán)限文件重新添加到
debugserver
中4>將授權(quán)后的
debugserver
添加到iPhone的/usr/bin
目錄下(原目錄中的無法替換)
- 連接APP
1>方法一:
debugserver *:[非保留端口號(hào)] -a [APP進(jìn)程名稱]
(先手動(dòng)啟動(dòng)APP)2>方法二:
debugserver -x auto *:[非保留端口號(hào)] [APP可執(zhí)行文件路徑]
(會(huì)自動(dòng)啟動(dòng)APP)
2喂窟,LLDB和debugserver的連接
- 端口映射(10011是Mac端口,222是iPhone端口)
- 連接debugserver:
process connect connect://localhost:[非保留端口號(hào)]
(需要先連接APP)
- 放開斷點(diǎn)(連接成功后會(huì)自動(dòng)打一個(gè)斷點(diǎn))
3央串,圖解
四磨澡,LLDB常用命令
1,frame
-
frame variable
:打印方法內(nèi)部所有局部變量的信息 -
frame variable [變量名]
:打印方法內(nèi)部某個(gè)局部變量的信息
2质和,expression
-
expression [表達(dá)式]
(簡(jiǎn)寫:p [表達(dá)式]
):打印信息或執(zhí)行代碼 -
expression -O -- [表達(dá)式]
(簡(jiǎn)寫:po [表達(dá)式]
):打印信息或執(zhí)行代碼
3稳摄,thread
-
thread backtrace
(簡(jiǎn)寫:bt
):打印當(dāng)前線程的堆棧信息 -
thread return [返回值]
:讓方法直接返回,不執(zhí)行斷點(diǎn)后面的代碼
-
thread continue
(簡(jiǎn)寫:continue
或c
):跳過當(dāng)前斷點(diǎn)饲宿,繼續(xù)運(yùn)行 -
thread step-over
(簡(jiǎn)寫:next
或n
):?jiǎn)尾竭\(yùn)行厦酬,遇到方法不會(huì)進(jìn)入 -
thread step-in
(簡(jiǎn)寫:step
或s
):?jiǎn)尾竭\(yùn)行胆描,遇到方法會(huì)進(jìn)入 -
thread step-out
(簡(jiǎn)寫:finish
):直接執(zhí)行完當(dāng)前方法,回到方法調(diào)用的位置
-
thread step-inst-over
(簡(jiǎn)寫:nexti
或ni
):?jiǎn)涡袇R編運(yùn)行仗阅,遇到函數(shù)不會(huì)進(jìn)入 -
thread step-inst
(簡(jiǎn)寫:stepi
或si
):?jiǎn)涡袇R編運(yùn)行昌讲,遇到函數(shù)會(huì)進(jìn)入
4,breakpoint
-
breakpoint set -n [方法名]
:設(shè)置斷點(diǎn) -
breakpoint set -a [方法地址]
:設(shè)置斷點(diǎn) -
breakpoint set -r [方法關(guān)鍵詞]
:設(shè)置斷點(diǎn)
-
breakpoint list
:列出所有斷點(diǎn)
-
breakpoint disable [斷點(diǎn)編號(hào)]
:禁用斷點(diǎn) -
breakpoint enable [斷點(diǎn)編號(hào)]
:?jiǎn)⒂脭帱c(diǎn) -
breakpoint delete [斷點(diǎn)編號(hào)]
:刪除斷點(diǎn)
-
breakpoint command add [斷點(diǎn)編號(hào)]
:給斷點(diǎn)添加命令减噪,當(dāng)觸發(fā)斷點(diǎn)時(shí)短绸,這些命令就會(huì)按順序執(zhí)行 -
breakpoint command list [斷點(diǎn)編號(hào)]
:列出所有斷點(diǎn)命令 -
breakpoint command delete [斷點(diǎn)編號(hào)]
:刪除斷點(diǎn)命令
5,watchpoint
-
watchpoint set variable [變量名]
:給變量設(shè)置斷點(diǎn)筹裕,當(dāng)變量被修改時(shí)觸發(fā) -
watchpoint set expression [變量地址]
:給變量設(shè)置斷點(diǎn)鸠按,當(dāng)變量被修改時(shí)觸發(fā)
6,image
-
image lookup -t [類型]
:查看某個(gè)類型的信息 -
image lookup -n [方法名]
:根據(jù)方法名查找方法的位置 -
image lookup -a [方法地址]
:根據(jù)方法地址查找方法的位置
-
image list
:列出所有已加載的動(dòng)態(tài)庫
7饶碘,help(查看命令的用法)
五目尖,ASLR
1,Mach-O基本結(jié)構(gòu)
-
Header
:文件類型扎运、架構(gòu)類型等信息 -
Load commands
:描述文件數(shù)據(jù)在內(nèi)存中是如何分布的 -
data
:文件數(shù)據(jù)在內(nèi)存中的具體分布
2瑟曲,Data基本結(jié)構(gòu)
-
_PAGEZERO
:預(yù)留的內(nèi)存空間 -
_TEXT
:代碼段,存儲(chǔ)編譯之后的代碼 -
_DATA
:數(shù)據(jù)段豪治,存儲(chǔ)字符串常量洞拨、全局變量和靜態(tài)變量
3,字段介紹
-
VM Address
:在虛擬內(nèi)存中的位置 -
VM Size
:在虛擬內(nèi)存中的大小 -
File Offset
:在Mach-O文件中的位置 -
File Size
:在Mach-O文件中的大小
4负拟,使用ASLR前的內(nèi)存布局
- 圖解
- 說明
1>
_PAGEZERO
在Mach-O文件中的大小為0x0烦衣,加載進(jìn)內(nèi)存后大小為0x100000000(arm64
架構(gòu)下)
2>Header
和Load commands
都是描述信息,存儲(chǔ)在_TEXT
中掩浙,所以內(nèi)存空間從_PAGEZERO
開始分配
3>代碼編譯完成后花吟,_TEXT
中方法的位置和_DATA
中變量的位置就是固定的,這樣很容易進(jìn)行動(dòng)態(tài)調(diào)試厨姚,為了增加安全性衅澈,從iOS4.3開始就引入了ASLR
技術(shù)
5,使用ASLR后的內(nèi)存布局
- 圖解
- 說明
1>
ASLR
是Address Space Layout Randomization
(地址空間布局隨機(jī)化)的縮寫
2>引入ASLR
技術(shù)后谬墙,當(dāng)Mach-O文件加載進(jìn)內(nèi)存時(shí)今布,會(huì)隨機(jī)生成一個(gè)內(nèi)存地址,然后從該地址開始進(jìn)行內(nèi)存空間的分配
3>雖然方法和變量的位置是固定的拭抬,但是內(nèi)存地址就變得隨機(jī)了部默,這樣就會(huì)增加動(dòng)態(tài)調(diào)試的難度,從而提高了安全性
6造虎,獲取方法的真實(shí)內(nèi)存地址
- 無
ASLR
虛擬內(nèi)存地址
-
ASLR
隨機(jī)內(nèi)存地址(Mach-O文件加載進(jìn)內(nèi)存的起始地址)
- 真實(shí)內(nèi)存地址(調(diào)試其他APP時(shí)傅蹂,需要用真實(shí)內(nèi)存地址來設(shè)置斷點(diǎn),用方法名是無效的)
0x1000055b8 + 0xb4000 = 0x1000b95b8