设为首页 收藏本站
查看: 975|回复: 0

[经验分享] 使用Python扩展lldb-Layne的学习园地

[复制链接]

尚未签到

发表于 2018-8-5 09:12:56 | 显示全部楼层 |阅读模式
  Xcode集成了LLDB,进一步简化了程序调试流程。虽然LLDB很强大,但是它的命令很有限。所幸的是,lldb包含了对python的支持,使得lldb的拓展成为可能。本人在开发过程中很喜欢使用image lookup 命令,但是苦于每次只能执行一条,相当耗时,因此一直想要找到一种批量执行的方法。于是将目光放到了lldb python上......

问题:批量执行image lookup -a

(1)编写python脚本(layne_command.py),代码如下:
  

#coding=utf-8  
#自定义lldb命令
  
import lldb
  
import commands
  
import optparse
  
import shlex
  

  
def layne_imagelookup(debugger, command, result, internal_dict):
  target = debugger.GetSelectedTarget()
  process = target.GetProcess()
  thread = process.GetSelectedThread()
  

  command_args = shlex.split(command)
  parser = create_custom_parser()
  

  try:
  (options, args) = parser.parse_args(command_args)
  except:
  result.SetError ("option parsing failed")
  return
  if args:
  for address in args:
  print("*************************************")
  debugger.HandleCommand('image lookup -a %s'%(address))
  

  
def create_custom_parser():
  usage = "usage: %prog [options]"
  description = '''Parse Symbols to Human-readable Format.'''
  parser = optparse.OptionParser(description=description, prog='print_frame',usage=usage)
  # parser.add_option('-p','--parse',type='string',dest = 'parse',help='parse symbols.');
  return parser
  

  
def __lldb_init_module(debugger, internal_dict):
  debugger.HandleCommand('command script add -f layne_command.layne_imagelookup layne_imagelookup')
  print('The "layne_imagelookup" python command has been installed and is ready for use.')
  

  然后保存为文件layne_command.py,放到如下目录(自己指定):~/Python/lldb/layne_command.py
  说明:
  ①#coding=utf-8指定python脚本编码,否则运行时注释中的中文将会报错。
  ②运行脚本时入口为 __lldb_init_module(debugger,internal_dict) , 即先执行函数   __lldb_init_module(debugger,internal_dict)  中的内容。debugger.HandleCommand是python中执行lldb命令的主要方式。
  ③layne_imagelookup是批量执行image lookup命令的函数,也是自定义的新的lldb命令的名称。
  ④optparse和shlex是用于解析参数的两个重要的库。通过optparse来生成解析器。

(2)xcode中引用python脚本
  在xcode中crash的时候,下方会出现lldb控制台,输入如下命令:
  command script import ~/Python/lldb/layne_command.py
  回车之后将会出现一行提示:The "layne_imagelookup" python command has been installed and is ready for use(这个提示是事先定义在layne_command.py中的)。然后就可以在lldb控制台像po命令那样使用layne_imagelookup了,使用方法:假如crash的时候出现的内存地址为
  0x1111111 0x2222222 0x3333333 0x4444444 0x5555555
  以前的做法是对每个地址使用image lookup -a命令:
  

(lldb)image lookup -a 0x1111111  
(lldb)image lookup -a 0x2222222
  
(lldb)image lookup -a 0x3333333
  
(lldb)image lookup -a 0x4444444
  
(lldb)image lookup -a 0x5555555
  

  现在只需要:
  

(lldb)layne_imagelookup 0x1111111 0x2222222 0x3333333 0x4444444 0x5555555  

  结果将会以"************"分隔开显示,如:
  

(lldb) layne_imagelookup 0x0000000107bcd914 0x000000010de2435a 0x000000010de2b245 0x000000010e1e6865 0x000000010e832998  
*************************************
  Address: Maketion[0x0000000100004914] (Maketion.__TEXT.__text + 8356)
  Summary: Maketion`-[AppDelegate application:didFinishLaunchingWithOptions:] + 196 at AppDelegate.m:251
  
*************************************
  Address: UIKit[0x000000000002135a] (UIKit.__TEXT.__text + 128650)
  Summary: UIKit`-[UIApplication _handleDelegateCallbacksWithOptions:isSuspended:restoreState:] + 267
  
*************************************
  Address: UIKit[0x0000000000028245] (UIKit.__TEXT.__text + 157045)
  Summary: UIKit`-[UIApplication _runWithMainScene:transitionContext:completion:] + 1720
  
*************************************
  Address: UIKit[0x00000000003e3865] (UIKit.__TEXT.__text + 4070293)
  Summary: UIKit`-[__UICanvasLifecycleMonitor_Compatability _scheduleFirstCommitForScene:transition:firstActivation:completion:] + 249
  
*************************************
  Address: UIKit[0x0000000000a2f998] (UIKit.__TEXT.__text + 10673352)
  Summary: UIKit`-[_UICanvasLifecycleSettingsDiffAction performActionsForCanvas:withUpdatedScene:settingsDiff:fromSettings:transitionContext:] + 231
  

(3)自动加载python脚本
  手动加载自定义的python脚本有个缺点:程序再次运行之后,若还想使用自定义的命令,则必须再次调用
  command script import ~/Python/lldb/layne_command.py,然后才能使用layne_imagelookup命令。因此这里配置一下使其自动加载。
  原理:xcode启动的时候会读取一个默认文件:~/.lldbinit,只需要将命令command script import ~/Python/lldb/layne_command.py写入这个文件即可。
  ①打开Terminal,使用vim打开文件~/.lldbinit(若没有,vim会自动创建)。
  ②将命令command script import ~/Python/lldb/layne_command.py写入文件~/.lldbinit,保存退出。 (注意:layne_command.py的路径必须正确!)
  以后只要xcode启动起来就可以在lldb控制台使用layne_imagelookup.

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-546784-1-1.html 上篇帖子: Python实现atm机的功能 下篇帖子: 利用python实现IP扫描
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表