lldb

lldb 内存读取

我是研究僧i 提交于 2020-02-29 08:42:28
所以许多时候需要调试原始的C语言指针。Xcode的调试器LLDB提供了许多有趣的调试指令,下面来看看针对内存数据的读取和修改指令。 为了更好地演示,先写一段测试代码,如下: int ints[] = { 1 , 2 , 3 }; double doubles[] = { 1.1 , 2.2 , 3.3 }; NSMutableData *data = [ NSMutableData data ]; [data appendBytes :ints length : sizeof (ints)]; [data appendBytes :doubles length : sizeof (doubles)]; char *bytes = ( char *)[data bytes ]; OK!然后在bytes变量后加入断点,运行,接着在Xcode下方输入调试指令。 首先是LLDB的内存读取指令,这个其实可以用 memory read 指令,但是这个指令写起来太繁琐了,幸好LLDB继承了GDB的 x 命令,可以快速的用简短的指令来完成多种内存读取操作。 比如显示bytes变量前三个 int 的内容: (lldb) x/3xw bytes 0x100107980: 0x00000001 0x00000002 0x00000003 这里 x 代表用16进制来显示结果, w 代表Word(16位

iOS调试 LLDB使用

心已入冬 提交于 2020-02-28 07:25:03
我们职责是开发iOS应用,我们要做的就是生产bug和解决bug,调试对于每一个开发人员来说都是亘古不变的操作。如何高效调试提高我们的装X技能了,所以掌握Xcode的LLDB最为重要。 LLDB 首先瞟一眼LLDB长啥样,如下图: LLDB 是一个有着 REPL 的特性和 C++ 、Python 插件的开源调试器。 LLDB命令结构 < command > [ < subcommand > [ < subcommand > .. . ] ] < action > [ -options [ option-value ] ] [ argument [ argument .. . ] ] 其中: command、subcommand:LLDB调试命令的名称。命令和子命令按层级结构来排列:一个命令对象为跟随其的子命令对象创建一个上下文,子命令又为其子命令创建一个上下文,依此类推。 action:命令操作,想在前面的命令序列的上下文中执行的一些操作。 options:命令选项,行为修改器(action modifiers)。通常带有一些值。 argument:命令参数,根据使用的命令的上下文来表示各种不同的东西。 []:表示命令是可选的,可以有也可以没有。 比例 po isFinish, po就是命令操作(print -object 简写), isFinish就是命令参数 原始命令

IOS调试lldb常用命令

大兔子大兔子 提交于 2020-02-27 12:38:25
LLDB在xcode4.3或者之后的版本里面是默认的调试器。假如你正在使用老一点版本的xcode的话,你又GDB调试器。他们有一些基本的相同的命 令,因此假如你的xcode使用的是“(gdb)”提示,而不是“(lldb)”提示的话,你也能够更随一起做,而没有问题。 “po”命令是“print object”(打印对象)的简写。“$eax”是cup的一个寄存器。在一个异常的情况下,这个寄存器将会包含一个异常对象的指针。注意:$eax只会在模拟器里面工作,假如你在设备上调试,你将需要使用”$r0″寄存器。 例如,假如你输入: (lldb) po [$eax class] 你将会看像这样的东西: (id) $2 = 0x01446e84 NSException 这些数字不重要,但是很明显的是你正在处理的NSException对象在这里。 你可以对这个对象调用任何方法。例如: (lldb) po [$eax name] 这个将会输出这个异常的名字,在这里是NSInvalidArgumentException,并且: (lldb) po [$eax reason] 这个将会输出错误消息: (unsigned int) $4 = 114784400 Receiver () has no segue with identifier 'ModalSegue' 注意:当你仅仅使用了“po $eax”

IOS调试lldb命令常用,po,

杀马特。学长 韩版系。学妹 提交于 2020-02-27 12:36:06
lldb命令常用(备忘) 假如你准备在模拟器里面运行这个,你可以在“(lldb)”提示的后面输入下面的: (lldb) po $eax LLDB在xcode4.3或者之后的版本里面是默认的调试器。假如你正在使用老一点版本的xcode的话,你又GDB调试器。他们有一些基本的相同的命令,因此假如你的xcode使用的是“(gdb)”提示,而不是“(lldb)”提示的话,你也能够更随一起做,而没有问题。 “po”命令是“print object”(打印对象)的简写。“$eax”是cup的一个寄存器。在一个异常的情况下,这个寄存器将会包含一个异常对象的指针。注意:$eax只会在模拟器里面工作,假如你在设备上调试,你将需要使用”$r0″寄存器。 例如,假如你输入: (lldb) po [$eax class] 你将会看像这样的东西: (id) $2 = 0x01446e84 NSException 这些数字不重要,但是很明显的是你正在处理的NSException对象在这里。 你可以对这个对象调用任何方法。例如: (lldb) po [$eax name] 这个将会输出这个异常的名字,在这里是NSInvalidArgumentException,并且: (lldb) po [$eax reason] 这个将会输出错误消息: (unsigned int) $4 = 114784400

LLDB调试器

佐手、 提交于 2020-02-27 12:34:42
你是否曾经苦恼于理解你的代码,而去尝试打印一个变量的值? NSLog(@"%@", whatIsInsideThisThing); 或者跳过一个函数调用来简化程序的行为? NSNumber *n = @7; // 实际应该调用这个函数:Foo(); 或者短路一个逻辑检查? if (1 || theBooleanAtStake) { ... } 或者伪造一个函数实现? int calculateTheTrickyValue { return 9; /* 先这么着 ... } 并且每次必须重新编译,从头开始? 构建软件是复杂的,并且 Bug 总会出现。一个常见的修复周期就是修改代码,编译,重新运行,并且祈祷出现最好的结果。 但是不一定要这么做。你可以使用调试器。而且即使你已经知道如何使用调试器检查变量,它可以做的还有很多。 这篇文章将试图挑战你对调试的认知,并详细地解释一些你可能还不了解的基本原理,然后展示一系列有趣的例子。现在就让我们开始与调试器共舞一曲华尔兹,看看最后能达到怎样的高度。 LLDB LLDB 是一个有着 REPL 的特性和 C++ ,Python 插件的 开源 调试器。LLDB 绑定在 Xcode 内部,存在于主窗口底部的控制台中。调试器允许你在程序运行的特定时暂停它,你可以查看变量的值,执行自定的指令,并且按照你所认为合适的步骤来操作程序的进展。

iOS 创建xcode插件

强颜欢笑 提交于 2020-02-05 09:09:31
苹果的"一个足以应付所有"策略使得它的产品越来越像一个难以下咽的药丸。尽管苹果已经将一些工作流带给了iOS/OS X的开发者,我们仍然希望通过插件来使得Xcode更加顺手! 虽然苹果并没有提供任何的官方文档来指导我们如何创建一个xcode插件,但是开发者社区做了大量的工作开发了一些非常有用的工具,通过这些工具,可以用来帮助开发者。 从 自动完成图片名的插件 ,到 清除缓存的插件 再到 使Xcode变成一个vim编辑器的插件 ,Xcode的插件社区已经拓展了我们的思维,我们可以让Xcode变得更加智能。 在这个不算短的三部分教程中,你将创建一个Xcode的插件来娱乐你的同事,其特色莫过于显示的内容并不是他所期望看到的!尽管这个插件是很轻量级的,你仍然可以学习到很多知识,例如,通过调试Xcode,怎样找出你感兴趣的元素并且修改它,怎样将系统的功能函数替换为你自己的函数(通过swizzle技术)! 你将会使用 x86汇编知识 , 代码定技能 以及 LLDB调试技能 来查阅未公开的私有framework,并且要探索这些私有framework中的私有API,还要使用 method swizzleing 来进行代码的注入。正因为有这么多内容,所以本教程的讲解速度会很快。在继续之前,请务必确定你已经掌握了相关的 iOS/OS X的开发。 使用Swift来开发插件,还是一个比较复杂的主题

What changed in xcode7 debugger that I can no longer view variables with “po” / Swift

假装没事ソ 提交于 2020-01-30 05:28:56
问题 ok what changed in xCode7 / Swift that I can no longer use "po frame" to view the contents of a CGRect anylonger? The print statment works just fine in the code. How come I can't view that in the debugger console like I used to? var frame = self.myLabel.frame frame.origin.x = self.startingFrame.origin.x + translation.x frame.origin.y = self.startingFrame.origin.y + translation.y print(frame) self.myLabel.frame = frame yet in the debugger if I break on the self.myLabel.frame = frame statement

How to 'catch syscall' in LLDB?

痞子三分冷 提交于 2020-01-25 14:54:26
问题 As known,we can use command 'catch syscall' in GDB to break on every system function. Is there a similar command in LLDB? (gdb) catch syscall Catchpoint 1 (syscall) (gdb) r Starting program: /tmp/catch-syscall Catchpoint 1 (call to syscall 'close'), \ 0xffffe424 in __kernel_vsyscall () (gdb) c Continuing. Catchpoint 1 (returned from syscall 'close'), \ 0xffffe424 in __kernel_vsyscall () (gdb) 回答1: Not yet, feel free to file an enhancement request using the http://lldb.llvm.org Bug Report link

How to 'catch syscall' in LLDB?

我与影子孤独终老i 提交于 2020-01-25 14:52:16
问题 As known,we can use command 'catch syscall' in GDB to break on every system function. Is there a similar command in LLDB? (gdb) catch syscall Catchpoint 1 (syscall) (gdb) r Starting program: /tmp/catch-syscall Catchpoint 1 (call to syscall 'close'), \ 0xffffe424 in __kernel_vsyscall () (gdb) c Continuing. Catchpoint 1 (returned from syscall 'close'), \ 0xffffe424 in __kernel_vsyscall () (gdb) 回答1: Not yet, feel free to file an enhancement request using the http://lldb.llvm.org Bug Report link

How to 'catch syscall' in LLDB?

扶醉桌前 提交于 2020-01-25 14:52:06
问题 As known,we can use command 'catch syscall' in GDB to break on every system function. Is there a similar command in LLDB? (gdb) catch syscall Catchpoint 1 (syscall) (gdb) r Starting program: /tmp/catch-syscall Catchpoint 1 (call to syscall 'close'), \ 0xffffe424 in __kernel_vsyscall () (gdb) c Continuing. Catchpoint 1 (returned from syscall 'close'), \ 0xffffe424 in __kernel_vsyscall () (gdb) 回答1: Not yet, feel free to file an enhancement request using the http://lldb.llvm.org Bug Report link