原来xcode还可以调试第三方app
操作步骤:
1.第三方app用调试证书重签名打包安装
2.mac连设备,xcode选择设备。
3.xcdoe-debug-attach process-选择依附设备中运行的进程。
4.点击xcode底部调试栏的暂停按钮,就可以看见lldb窗口了。
接下来演示一下如何修改界面元素。
这里我想在lldb中动态修改微信零钱中的数值。
1.微信打开零钱界面。
2.在xcode中按下暂停,进入lldb调试状态,输入以下代码
po [[[UIApplication sharedApplication] keyWindow] recursiveDescription]
从手机上可以看到我当前的零钱是¥528.78。在打印的结果里,cmd+f搜索528,很容易找到这么一段
| | | | | | | | | | <MMUILabel: 0x1384d9f00; baseClass = UILabel; frame = (0 210; 414 48); text = '¥528.78'; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x137f64480>>
可以知道,零钱是个MMUILabel类型的label。
3.我们修改零钱显示为¥99999.99
输入以下指令:
e id $moneyLbl = (id)0x1384d9f00
e (void)[$moneyLbl setText:[NSString stringWithUTF8String:"¥99999.99"]]
4.调试按钮点击执行,可以看到界面上的数值已经变了。
接下来我们来看看怎么查看一个按钮的点击事件
1.首先选择一个按钮,这里我们找充值按钮
| | | | | | | | | | <FixTitleColorButton: 0x1384d3010; baseClass = UIButton; frame = (20 292; 374 47); clipsToBounds = YES; opaque = NO; autoresize = W; layer = <CALayer: 0x137ab39d0>>
| | | | | | | | | | | <UIButtonLabel: 0x1384dc7c0; frame = (169 12.6667; 36 21.6667); text = '充值'; opaque = NO; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x1384d2f30>>
可知按钮内存为0x1384d3010
- 打印按钮的所有targets
e id $btn=(id)0x1384d3010
po [$btn allTargets]
{(
<WCPayBalanceDetailControlLogic: 0x1384c3410>
)}
2.打印0x1384c3410这个对象的action
po [$btn actionsForTarget:(id)0x1384c3410 forControlEvent:0]
<__NSArrayM 0x13828a230>(
BalanceDetailSaveMoney
)
可见,充值按钮点击后触发的事件类型是:0
target是:WCPayBalanceDetailControlLogic(0x1384c3410)
函数是:BalanceDetailSaveMoney
想要给这个函数打断点,因为没有描述符,所以需要找到这个函数的地址。
可以 在lldb中输入以下指令:
po [WCPayBalanceDetailControlLogic _shortMethodDescription]
然后正常情况下会打印出这个类的各种方法以及地址。找到
BalanceDetailSaveMoney这个函数。
Instance Methods:
- (void) startLogic; (0x1011bf1e4)
- (void) onWCBaseLogicDidStop:(unsigned int)arg1; (0x1011bff14)
- (void) OnRealnameVerifySuccessNotification:(id)arg1; (0x1011c09a4)
- (void) doFetchMoney; (0x1011bfd94)
- (void) BalanceDetailBack; (0x1011bf38c)
- (void) BalanceDetailSaveMoney; (0x1011bf420)
- (void) BalanceDetailFetchMoney; (0x1011bf5a0)
- (void) BalanceDetailRequeryBalance; (0x1011bfaa0)
- (int) m_eWCPayBalanceDetailControlLogicScene; (0x1011c0a3c)
- (void) doAddCard; (0x1011bfb38)
- (void) OnGetBindQueryInfo:(id)arg1 Error:(id)arg2; (0x1011c02f0)
- (void) BackToRootView; (0x1011c0014)
- (void) setM_eWCPayBalanceDetailControlLogicScene:(int)arg1; (0x1011c0a4c)
- (void) .cxx_destruct; (0x1011c0a5c)
- (void) dealloc; (0x1011bf15c)
- (id) init; (0x1011bf0c8)
- (void) pause; (0x1011bf388)
可以看到,
- (void) BalanceDetailSaveMoney; (0x1011bf420)
下断点:
(lldb) b 0x1011bf420
接下来开始搞事!自己发挥吧!