lldb入坑指北(4)-打印任意函数的汇编代码
时间:2022-07-28
本文章向大家介绍lldb入坑指北(4)-打印任意函数的汇编代码,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
前言
如下所示,通常情况下,我们只能看到触发断点线程的指令代码。
如果希望看到另外一个函数或方法的指令,通常需要打开另外的工具。比如 Hopper。
x 命令
实际上,lldb 已经提供了一个方便的工具查看汇编代码。
x
是 lldb 的 memory read
命令缩写,它支持部分 GDB 简写格式的语法 GDB to LLDB command map
x [Address expression]
- Length 代表重复次数,默认是 1。通过它,可以控制多少个单位的内存进行输出。
- Format 输出内容的格式,常见对应关系如下所示, o - octal x - hexadecimal d - decimal u - unsigned decimal t - binary f - floating point a - address c - char s - string i - instruction b - bytes h - Halfwords(two bytes) w - Words (four bytes) g - Giant words (eight bytes)
- [Address expression]
任意合法的地址表达
- (lldb) x/3i NSLog
- 0x1a8dcb72c: 0xd10083ff sub sp, sp, #0x20 ; =0x20
- 0x1a8dcb730: 0xa9017bfd stp x29, x30, [sp, #0x10]
- 0x1a8dcb734: 0x910043fd add x29, sp, #0x10 ; =0x10
- (lldb) b NSLog
- Breakpoint 4: where = Foundation`NSLog, address = 0x00000001a8dcb72c
- (lldb) x/3i 0x00000001a8dcb72c
- 0x1a8dcb72c: 0xd10083ff sub sp, sp, #0x20 ; =0x20
- 0x1a8dcb730: 0xa9017bfd stp x29, x30, [sp, #0x10]
- 0x1a8dcb734: 0x910043fd add x29, sp, #0x10 ; =0x10
- (lldb) b dic
- Breakpoint 5: where = testLock`-[DataManager dic] at DataManager.m:14, address = 0x0000000104ee9d24
- (lldb) x/3i 0x0000000104ee9d24
- 0x104ee9d24: 0xd10043ff sub sp, sp, #0x10 ; =0x10
- 0x104ee9d28: 0xf90007e0 str x0, [sp, #0x8]
- 0x104ee9d2c: 0xf90003e1 str x1, [sp]
- (lldb) x/3i $pc
- -> 0x104ee9bc4: 0xf85c83a0 ldur x0, [x29, #-0x38]
- 0x104ee9bc8: 0x940001e5 bl 0x104eea35c ; symbol stub for: objc_release
- 0x104ee9bcc: 0xf85e83a8 ldur x8, [x29, #-0x18]
- (lldb) x/3i 4377713956
- 0x104ee9d24: 0xd10043ff sub sp, sp, #0x10 ; =0x10
- 0x104ee9d28: 0xf90007e0 str x0, [sp, #0x8]
- 0x104ee9d2c: 0xf90003e1 str x1, [sp]
- 合法的地址,如
0x0000000104ee9d24
4377713956
- 函数名
NSLog
- 寄存器名
$pc
实战
如下所示,我们可以通过以下步骤打印。 1、获取任意函数或者方案的地址。
2、以汇编格式打印该地址后方的内容。
下面,我们验证一下上面的汇编内容。
首先,我们先查看通过 Xcode 生成的汇编代码,(655-673行)
略以 .
"
Lfunc
Ltmp
开头的辅助信息后,我们可以发现两份数据完全一致。
至此,可以确认,通过 x
命令可以正确打印任意函数的汇编代码
参考文章
GDB to LLDB command map GDB Memory
lldb
- linuxmint下pycharm创建桌面快捷方式
- hdu 1811 Rank of Tetris (并查集+拓扑排序)
- Pycharm常用技巧
- hdu 1598 find the most comfortable road(枚举+卡鲁斯卡尔最小生成树)
- 查询IP地址归属详情
- oracle commit详解
- hdu 4315 Climbing the Hill(阶梯博弈转nim博弈)
- iftop实时网络流量监控工具的安装使用
- hdu 3908 Triple(组合计数、容斥原理)
- hdu 4034 Graph (floyd的深入理解)
- hdu 4033Regular Polygon(二分+余弦定理)
- Debian8配置SSH允许root登陆
- hdu 4405Aeroplane chess(概率DP)
- hdu 3853LOOPS (概率DP)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Nginx简易防CC策略规则
- 如何编写和优化WordPress网站的Robots.txt
- 如何处理WordPress网站404状态死链
- (三)RecyclerView简单滑动场景分析
- AWS EC2实例开启IPv6方法 阅读模式
- centos7宝塔环境安装VeryNginx waf系统实现高级防火墙功能
- 腾讯云中关于授权子用户QCloudResourceFullAccess权限后使用api接口创建购买cvm没有支付权限的解决办法
- centos7中systemctl系统服务和资源限制故障
- centos7 安装zabbix并监控windows服务器
- 宝塔面板插件-shadowsocks可视化管理
- Android面试知识笔记:那些年面试官常问的知识点...(附详细解析)
- 聊聊dubbo-go的failbackCluster
- Docker环境准备
- js实现HTML页面时钟动态显示
- WordPress标题的分隔符-被转义为–的解决办法