前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >XCode调试器LLDB

XCode调试器LLDB

作者头像
用户1941540
发布于 2018-05-11 05:18:07
发布于 2018-05-11 05:18:07
1.4K00
代码可运行
举报
文章被收录于专栏:ShaoYLShaoYL
运行总次数:0
代码可运行

与调试器共舞 - LLDB 的华尔兹

  • 你是否曾经苦恼于理解你的代码,而去尝试打印一个变量的值?
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
NSLog(@"%@", whatIsInsideThisThing);
  • 或者跳过一个函数调用来简化程序的行为?
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
NSNumber *n = @7; // 实际应该调用这个函数:Foo();
  • 或者短路一个逻辑检查?
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if (1 || theBooleanAtStake) { ... }
  • 或者伪造一个函数实现?
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int calculateTheTrickyValue {
  return 9;

  /*
   先这么着
   ...
   */
}
  • 并且每次必须重新编译,从头开始?
  • 构建软件是复杂的,并且 Bug 总会出现。一个常见的修复周期就是修改代码,编译,重新运行,并且祈祷出现最好的结果。
  • 但是不一定要这么做。你可以使用调试器。而且即使你已经知道如何使用调试器检查变量,它可以做的还有很多。
  • 这篇文章将试图挑战你对调试的认知,并详细地解释一些你可能还不了解的基本原理,然后展示一系列有趣的例子。现在就让我们开始与调试器共舞一曲华尔兹,看看最后能达到怎样的高度。

LLDB

  • LLDB 是一个有着 REPL 的特性和 C++ ,Python 插件的开源调试器。LLDB 绑定在 Xcode 内部,存在于主窗口底部的控制台中。调试器允许你在程序运行的特定时暂停它,你可以查看变量的值,执行自定的指令,并且按照你所认为合适的步骤来操作程序的进展。(这里有一个关于调试器如何工作的总体的解释。)
  • 你以前有可能已经使用过调试器,即使只是在 Xcode 的界面上加一些断点。但是通过一些小的技巧,你就可以做一些非常酷的事情。GDB to LLDB 参考是一个非常好的调试器可用命令的总览。你也可以安装 Chisel,它是一个开源的 LLDB 插件合辑,这会使调试变得更加有趣。
  • 与此同时,让我们以在调试器中打印变量来开始我们的旅程吧

基础

  • 这里有一个简单的小程序,它会打印一个字符串。注意断点已经被加在第 8 行。断点可以通过点击 Xcode 的源码窗口的侧边槽进行创建。
  • 程序会在这一行停止运行,并且控制台会被打开,允许我们和调试器交互。那我们应该打些什么呢?
help
  • 最简单命令是 help,它会列举出所有的命令。如果你忘记了一个命令是做什么的,或者想知道更多的话,你可以通过 help command 来了解更多细节,例如 help print 或者 help thread。如果你甚至忘记了 help 命令是做什么的,你可以试试 help help。不过你如果知道这么做,那就说明你大概还没有忘光这个命令。
print
  • 打印值很简单;只要试试 print 命令:
  • LLDB 实际上会作前缀匹配。所以你也可以使用 prin,pri,或者 p。但你不能使用 pr,因为 LLDB 不能消除和 process 的歧义 (幸运的是 p 并没有歧义)。
  • 你可能还注意到了,结果中有个 $0。实际上你可以使用它来指向这个结果。试试 print $0 + 7,你会看到 106。任何以美元符开头的东西都是存在于 LLDB 的命名空间的,它们是为了帮助你进行调试而存在的。
expression
  • 如果想改变一个值怎么办?你或许会猜 modify。其实这时候我们要用到的是 expression 这个方便的命令。
  • 这不仅会改变调试器中的值,实际上它改变了程序中的值。这时候继续执行程序,将会打印 42 red balloons。神奇吧。
  • 注意,从现在开始,我们将会偷懒分别以 p 和 e 来代替 print 和 expression。
什么是 print 命令
  • 考虑一个有意思的表达式:p count = 18。如果我们运行这条命令,然后打印 count 的内容。我们将看到它的结果与 expression count = 18 一样。和 expression 不同的是,print 命令不需要参数。比如 e -h +17 中,你很难区分到底是以 -h 为标识,仅仅执行 +17 呢,还是要计算 17 和 h 的差值。连字符号确实很让人困惑,你或许得不到自己想要的结果。
  • 幸运的是,解决方案很简单。用 -- 来表征标识的结束,以及输入的开始。如果想要 -h 作为标识,就用 e -h -- +17,如果想计算它们的差值,就使用 e -- -h +17。因为一般来说不使用标识的情况比较多,所以 e -- 就有了一个简写的方式,那就是 print。
  • 输入 help print,然后向下滚动,你会发现:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
'print' is an abbreviation for 'expression --'.
(print是 `expression --` 的缩写)

打印对象

  • 尝试输入
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
p objects
  • 输出会有点啰嗦
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(NSString *) $7 = 0x0000000104da4040 @"red balloons"
  • 如果我们尝试打印结构更复杂的对象,结果甚至会更糟
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(lldb) p @[ @"foo", @"bar" ]

(NSArray *) $8 = 0x00007fdb9b71b3e0 @"2 objects" 
  • 实际上,我们想看的是对象的 description 方法的结果。我么需要使用 -O (字母 O,而不是数字 0) 标志告诉 expression 命令以 对象 (Object) 的方式来打印结果。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(lldb) e -O -- $8
<__NSArrayI 0x7fdb9b71b3e0>(
    foo,
    bar
)
  • 幸运的是,e -o -- 有也有个别名,那就是 po (print object 的缩写),我们可以使用它来进行简化:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(lldb) po $8
<__NSArrayI 0x7fdb9b71b3e0>(
    foo,
    bar
)
(lldb) po @"lunar"
lunar
(lldb) p @"lunar"
(NSString *) $13 = 0x00007fdb9d0003b0 @"lunar"

变量

  • 现在你已经可以打印对象和简单类型,并且知道如何使用 expression 命令在调试器中修改它们了。现在让我们使用一些变量来减少输入量。就像你可以在 C 语言中用 int a = 0 来声明一个变量一样,你也可以在 LLDB 中做同样的事情。不过为了能使用声明的变量,变量必须以美元符开头。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(lldb) e int $a = 2
(lldb) p $a * 19
38
(lldb) e NSArray *$array = @[ @"Saturday", @"Sunday", @"Monday" ]
(lldb) p [$array count]
2
(lldb) po [[$array objectAtIndex:0] uppercaseString]
SATURDAY
(lldb) p [[$array objectAtIndex:$a] characterAtIndex:0]
error: no known method '-characterAtIndex:'; cast the message send to the method's return type
error: 1 errors parsing expression
// 悲剧了,LLDB 无法确定涉及的类型 (译者注:返回的类型)。这种事情常常发生,给个说明就好了:

(lldb) p (char)[[$array objectAtIndex:$a] characterAtIndex:0]
'M'
(lldb) p/d (char)[[$array objectAtIndex:$a] characterAtIndex:0]
77
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-02-22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
lldb-入坑指北(1)-给xcode添加批量启用禁用断点功能
如果都是NO,那么,请先阅读 https://objccn.io/issue-19-2/ 后再回来阅读本文章。相信我,掌握甚至精通 lldb 能够快速的提供你的生产力,提高生活品质。
酷酷的哀殿
2020/10/26
1.1K0
lldb-入坑指北(1)-给xcode添加批量启用禁用断点功能
深入浅出GDB调试器
GDB全称GNU symbolic debugger,它是诞生于GNU开源组织的(同时诞生的还有 GCC、Emacs 等)UNIX及UNIX-like下的调试工具,是Linux下最常用的程序调试器,GDB 支持调试多种编程语言编写的程序,包括C、C++、Go、Objective-C、OpenCL、Ada 等。但是在实际应用中,GDB 更常用来调试C和C++程序。虽然说在Linux系统下我们可以借助诸多集成开发工具来完成程序的编写和调试,但实际上,调试C/C++程序一定是直接或者间接使用GDB完成的。所以说GDB调试几乎可以说是Linux程序员必备的基本技能。本文将手把手教你使用GDB调试程序,并带你深入了解什么是GDB调试器。
mindtechnist
2024/08/08
4140
深入浅出GDB调试器
深入iOS系统底层之XCODE对汇编的支持介绍
一个好的IDE不仅要提供舒适简洁和方便的源代码编辑环境,还要提供功能强大的调试环境。XCODE是目前来说对iOS应用开发支持的最好的IDE(虽然Visual Studio2017也开始支持iOS应用的开发了),毕竟XCODE和iOS都是苹果公司的亲生儿子。唯一要吐槽的就是系统和编译环境绑的太死了,每当手机操作系统的一个小升级,都需要去升级一个好几G的新版本程序,这确实是有点坑爹! 目前市面上有很多反编译的工具,比如IDA、Hopper Disassembler等还有操作系统自带的工具诸如otool、lldb。这些工具里面有的擅长静态分析有的擅长调试的,这里就不展开分析了。如果在程序运行时去窥探一些系统内部实现以及做实时调试分析我觉得XCODE本身也非常的棒,既然深入系统我们必须要了解和学习一些关于汇编的东西,那么就必须要了解和掌握一些工具,而XCODE其实就是你手头上最方便的工具之一。
欧阳大哥2013
2018/08/22
1.2K0
深入iOS系统底层之XCODE对汇编的支持介绍
iOS开发 Xcode的各种调试、DEBUG
BUG,简单来说就是程序运行结果与预期的不同,下面来说说Xcode中的DEBUG方法 参考博文 断点调试 普通断点 全局断点 条件断点 1.普通断点 看图 当程序运行到断点处时会停下,然后进行单步
BY
2018/05/11
2.3K0
逆向开发从零到整(LLDB)
LLDB是个开源的内置于XCode的具有REPL(read-eval-print-loop)特征的Debugger,其可以安装C++或者Python插件。在日常的开发和调试过程中给开发人员带来了非常多的帮助。
CC老师
2019/01/23
1.1K0
lldb 入坑指北(1) - 给Xcode批量添加启用&禁用断点功能
如果都是NO,那么,请先阅读 与调试器共舞 - LLDB 的华尔兹[1] 后再回来阅读本文章。相信我,掌握甚至精通 lldb 能够快速的提供你的生产力。
酷酷的哀殿
2021/03/03
1.1K0
lldb 入坑指北(1) -  给Xcode批量添加启用&禁用断点功能
iOS——调试工具LLDB学习
  LLDB是个开源的内置于XCode的具有REPL(read-eval-print-loop)特征的Debugger,其可以安装C++或者Python插件。在日常的开发和调试过程中给开发人员带来了非常多的帮助。了解并熟练掌握LLDB的使用是非常有必要的。这篇文章将会带着大家一起了解在iOS开发中LLDB调试器的使用。
mukekeheart
2019/09/29
1K0
iOS——调试工具LLDB学习
XCode LLDB调试小技巧基础篇提高篇汇编篇
导语: 记录平时用到的XCode LLDB调试小技巧 工欲善其事必先利其器,介绍一些LLDB调试的命令和小技巧~ 基础篇 1.print命令 p 输出基本类型,例如double,int po 输
MelonTeam
2018/01/04
4.9K0
XCode LLDB调试小技巧基础篇提高篇汇编篇
iOS代码调试之LLDB命令
在LLDB模式下,根据需要输入相关的LLDB调试命令既可进行代码调试,下面小编将给大家介绍几款常用的LLDB命令。 1.打印 打印是代码调试中最常用的命令,相关的命令有:p和po。 p 命令: print 命令的简写,使用p 命令可以查看基本数据类型的值;如果使用p命令查看的是对象,那么只会返回对象的指针地址。 p命令后面除了可以接变量、常量,还可以接表达式。 po 命令:print object的缩写,可以理解为打印对象。功能与p命令类似,也可以打印常量、变量,打印表达式返回的对象等。p 和 po 的区别在于使用 po 只会输出对应的值,而 p 则会返回值的类型以及命令结果的引用名。 用法如下:
用户5521279
2019/06/02
1.9K0
iOS_Xcode_LLDB调试常用命令
需要设置:Debug → Debug workflow → Always Show Disassembly
mikimo
2024/01/29
1540
iOS_Xcode_LLDB调试常用命令
配合LLDB调试器进行iOS代码调试 原
        在一款完整iOS移动应用的开发中,代码的调试和编写占着同等重要的地位。Xcode默认使用LLDB作为代码调试器,LLDB功能丰富且强大,恰当的使用它,可以帮助开发者事半功倍的完成代码调试的工作。
珲少
2018/08/15
1.9K0
配合LLDB调试器进行iOS代码调试
                                                                            原
Swift进阶-LLDB调试
工欲善其事,必先利其器。程序猿最好的利器就是开发工具,iOS开发者最基本,最关键的一点就是熟练使用Xcode,而LLDB则是Xcode中至关重要的一环。 作为开发者,我们大部分的工作时间都用于调试,调试协议,调试UI,调试bug,用好LLDB,打遍iOS无敌手。
sweet说好的幸福
2020/12/23
8820
Xcode Debug 大全
我们如果在一个循环里面使用了断点,如果这个循环执行了100万次,那你的断点要执行那么多次,你不觉得蛋蛋都凉了的忧伤么?所以我们这么做:
零式的天空
2022/03/22
1.2K0
Xcode Debug 大全
XCode基本使用及调试技巧
对于初学iOS开发的同学,了解了Objective-C的基本使用后,最关心的应该是如何把OC程序运行起来。由于Xcode的基本使用比较简单,所以本文着重介绍一些Xcode的调试技巧。 一、基本使用 二、断点 三、常用命令 四、多线程 五、UI调试 六、其他 一、基本使用 1、如何创建一个工程: 打开Xcode -> File -> New -> Project 创建一个最简单的Single View Application。 一路Next,输入工程名,选择工程所在目录,最后Create。 2、Xcode
微信终端开发团队
2018/01/29
6.6K0
XCode基本使用及调试技巧
Go 语言源码级调试器 Delve
Delve 是一个简单、强大和易用的 Go 语言源代码层级的调试器,也是 Go 官方推荐使用的调试器。
frank.
2022/07/01
2.1K0
iOS各种调试技巧豪华套餐
前言 最近博主临近毕业季,为了完美的写一篇毕业论文,真是:“锄禾日当午,汗滴禾下土”<—— 这句诗跟毕业我写毕业论文没任何一毛钱关系,我就是突然想吟湿了。不过博主作为网络工程专业的好青年,曾经的愿望和理想就是在下水道干出一番轰轰烈烈的大事业,没错是就是下水道,我们的征途在下水道!!不过大家别误会,我不是忍者龟的脑残粉!听我继续说!我想的是等我在各大排水系统各大下水道功成名就的时候,我就可以指着一个井盖对我的孙子说:“诺 那个下面的通信光缆是爷爷我接的!!” 我满脸自豪地接受着这孙子的敬仰!但是啊,曾经的愿
王大锤
2018/05/17
1.9K0
iOS逆向(7)-LLDB,自制LLDB脚本,窜改微信红包金额
https://juejin.im/post/5caad5d6f265da251d4b875a”
iOSSir
2019/06/14
1.1K0
iOS逆向(7)-LLDB,自制LLDB脚本,窜改微信红包金额
lldb 入坑指北(3) - 打印 c++ 实例的虚函数表
打印 c++ 的虚函数表可以快速的帮助我们了解 c++ 父类与子类的 override 关系。 但是,lldb 目前却只支持常用的变量或者地址打印功能。所以,我们通过自定义 vt 实现打印虚函数表的诉求。
酷酷的哀殿
2020/10/26
1.7K0
lldb 入坑指北(3) - 打印 c++ 实例的虚函数表
Xcode 调试技巧 --常用命令和断点
Xcode 中的调试技巧与我们的日常开发息息相关,而这些调试技巧在我们解决Bug时,常常有事半功倍的作用,经常会用到的有各种断点 和 命令。而这些调试技巧也经常会在面试中问到,所以不知道的就来看看吧。
Haley_Wong
2018/08/22
3.2K0
Xcode 调试技巧 --常用命令和断点
iOS逆向工程之Hopper+LLDB调试第三方App
LLDB是Low Level Debugger的简称,在iOS开发的调试中LLDB是经常使用的,LLDB是Xcode内置的动态调试工具。使用LLDB可以动态的调试你的应用程序,如果你不做其他的额外处理,因为debugserver缺少task_for_pid权限,所以你只能使用LLDB来调试你自己的App。那么本篇博客中就要使用LLDB来调试从AppStore下载安装的App,并且结合着Hopper来分析第三方App内部的结构。LLDB与Hopper的结合,会让你看到不一样的东西,本篇博客就会和你一起领略LL
lizelu
2018/01/11
2.3K0
iOS逆向工程之Hopper+LLDB调试第三方App
相关推荐
lldb-入坑指北(1)-给xcode添加批量启用禁用断点功能
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验