大神请无视 T_T
整了个LLDB
的Python
脚本,从此不用辛辛苦苦的敲 n
或 n -c
。脚本的功能是:断点在每处objc_msgSend
,然后打印参数。用法:
启动LLDB
后,输入以下命令:
command script import /path/to/StepTo_objc_msgSend.py
help
iobjc_msgSend
iobjc_msgSended
iprint_args
脚本在iPhone 5S ARM64测试过,有BUG大家见谅改改就好,别鄙视小弟我哈。
StepTo_objc_msgSend.py
:
#!/usr/bin/python
import commands
import optparse
import lldb
import shlex
import re
import os
def iobjc_msgSend(debugger, command, result, internal_dict):
interpreter = lldb.debugger.GetCommandInterpreter()
returnObject = lldb.SBCommandReturnObject()
thread = debugger.GetSelectedTarget().GetProcess().GetSelectedThread()
thread.StepOver()
while True:
interpreter.HandleCommand('dis -p -c 10', returnObject)
disassemble = returnObject.GetOutput();
p = re.compile(r'->.*')
m = p.search(disassemble)
c = m.group(0)
if 'objc_msgSend' in c :
print 'objc_msgSend Hited!'
print disassemble
break
else:
thread.StepOver()
def iobjc_msgSended(debugger, command, result, internal_dict):
iobjc_msgSend(debugger, command, result, internal_dict)
interpreter = lldb.debugger.GetCommandInterpreter()
returnObject = lldb.SBCommandReturnObject()
thread = debugger.GetSelectedTarget().GetProcess().GetSelectedThread()
thread.StepOver()
print 'objc_msgSend Evaluated!'
interpreter.HandleCommand('dis -s `$pc-0x8` -c 5', returnObject)
disassemble = returnObject.GetOutput()
print disassemble
iprint_args(debugger, command, result, internal_dict)
interpreter.HandleCommand('po $x0', returnObject)
ret = returnObject.GetOutput().strip()
print 'Return Value: %s' % ret
def iprint_args(debugger, command, result, internal_dict):
interpreter = lldb.debugger.GetCommandInterpreter()
returnObject = lldb.SBCommandReturnObject()
interpreter.HandleCommand('po $x0', returnObject)
arg1 = returnObject.GetOutput().strip()
interpreter.HandleCommand('p (char *)$x1', returnObject)
arg2 = returnObject.GetOutput().strip()
print '-[%s %s]' % (arg1, arg2)
functionName = '['
functionName += '%s ' % arg1
p = re.compile('"(.*)"')
m = p.search(arg2)
if m is not None:
s = m.group(1)
names = s.split(':')
print names
for i in range(len(names) - 1):
interpreter.HandleCommand('po $x%d' % (i + 2), returnObject)
value = returnObject.GetOutput().strip()
name = names[i]
functionName += ' %s:%s ' % (name, value)
functionName += ']'
print functionName
def __lldb_init_module(debugger, dict):
names = ['iobjc_msgSend', 'iobjc_msgSended', 'iprint_args']
helpTexts = ["Break at next objc_msgSend.", "Evaluate next objc_msgSend.", "Print current objc_msgSend arguments."]
for i in range(len(names)):
name = names[i]
helpText = helpTexts[i]
debugger.HandleCommand('command script add %s -f %s.%s' % (name, __name__, name))
print 'The "%s" python command has been installed and is ready for use.' % name
debugger.HandleCommand('command script add --help "{help}" --function {function} {name}'.format(help=helpText, function=name, name=name))