专栏首页python3使用Python扩展lldb

使用Python扩展lldb

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命令的名称。 ④optparseshlex是用于解析参数的两个重要的库。通过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.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • CMDB学习之六 --客户端请求测试,服

    客户端使用agent 请求测试,agent使用的POST 请求,使用requests模块

    用户2398817
  • python MySQL 插入Elasticsearch

    有一张表,记录的数据特别的多,需要将7天前的记录,插入到Elasticsearch中,并删除原有表7天前的记录。

    用户2398817
  • python中实现sftp

    paramiko很强大,通过python实现SSH协议。可以做到ssh远程登录,sftp上传下载文件。

    用户2398817
  • 相克军_Oracle体系_随堂笔记003-体系概述

    对Oracle生产库来讲,服务器进程(可以简单理解是前台进程)的数量远远大于后台进程。因为一个用户进程对应了一个服务器进程。

    Alfred Zhao
  • 力作|phpcms_v9.6.1 任意文件下载漏洞

    前面咱们一起学习了phpcms_v9.6.0,任意文件上传漏洞复现的过程,不知道小伙伴们后面有没有想到如何进行批量检测呢?我尝试写了个Python脚本,这里要感...

    漏斗社区
  • 正确使用异步函数的姿势[每日前端夜话(0x06)]

    在编写异步函数时,await 、 return与return await之间存在差异,选择正确的处理方式非常重要。

    疯狂的技术宅
  • CSS 全解析实战(二)-HTML基础强化1 HTML常见元素和理解(1)2 HTML常见元素和理解(2)3 HTML常见元素和理解(3)4 HTML版本5 元素分类6 嵌套关系

    JavaEdge
  • 文档驱动式面向服务的敏捷开发与高效运行

    4、 如果需求有变化了,先修改文档,然后还是由支持平台根据文档的改动,自动变更各种相关功能。(插件里面的代码除外)

    用户1174620
  • 2018-09-12 构建大型支付系统时学到的分布式体系结构概念构建大型支付系统时学到的分布式体系结构概念

    两年前我作为一名拥有后台开发经验的移动端软件工程师入职 Uber,并负责 APP 端支付功能的开发以及重构。后来我进入了工程师管理团队,并独立带领一个团队。由于...

    Albert陈凯
  • MAC OS搭建Hadoop伪分布式集群

    输出java版本 虽然默认已经将Java的路径配置到了系统环境变量中,但由于后续需要使用JAVA_HOME,我们最好将JAVA_HOME显式写入到系统的配置文件...

    超哥的杂货铺

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动