使用Python语言扩展lldb
小标 2018-10-09 来源 : 阅读 993 评论 0

摘要:本文主要向大家介绍了使用Python语言扩展lldb,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助。

本文主要向大家介绍了使用Python语言扩展lldb,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助。

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.

本文由职坐标整理并发布,希望对同学们学习Python有所帮助,更多内容请关注职坐标编程语言Python频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程