欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

LLDB XCODE 使用组织

最编程 2024-03-01 22:20:20
...
  • 执行、打印、修改代码
    p (expression -O --)
    po (expression --)
  • 查看某块列表
    image list
  • 读取寄存器
    register read
  • 写入寄存器
    register write
  • 读取内存值
    Memory read

堆栈信息

  1. bt -- 查看当前堆栈
  2. bt all --查看所有堆栈
  3. up -- 跳转到上一个堆栈
  4. down -- 跳转到下一个堆栈
  5. frame select指令:选择指定函数
  6. frame variable -- 打印当前frame(帧)的所有变量 
  7. thread return -- 直接返回,不执行后面的代码

其他指令

  • br command add指令:给断点添加命令的命令
  • target stop-hook add -o "xxx":每次stop的时候去执行一些命令,针对breadpointwatchpoint
  • 配置lldb初始化文件,当lldb启动,就会加载此文件,执行文件内的指令,

 watchpoint内存断点 

watchpoint set variable

在p1对象的name上设置断点
当调用name属性的get/set方法,都会触发此断点。可获取到name属性的原始值,和即将修改的值。配合bt指令,查看函数调用栈,可以跟踪name属性的修改是由哪个方法触发的
watchpoint set variable p1->_name
-------------------------
Watchpoint created: Watchpoint 1: addr = 0x280207570 size = 8 state = enabled type = w
   declare @ '/Users/zang/Zang/Spark/LG/14/LLDB/001--LLDB调试/ViewController.m:13'
   watchpoint spec = 'p1->_name'
   new value: 0x0000000102404088
watchpoint set expression


对属性地址设置内存断点.进入断点,获取name属性的地址
p &p1->_name
-------------------------
(NSString **) $0 = 0x0000000281e2ebb0

watchpoint set expression 0x0000000281e2ebb0
-------------------------
Watchpoint created: Watchpoint 1: addr = 0x281e2ebb0 size = 8 state = enabled type = w
   new value: 4371808392

 

.lldbinit文件

我们可以在LLDB初始化的时候去设置自己需要的指令

 

image:可用于寻址(这个命令和图片没有任何关系)  这个功能很强大了  比如我们经常项目出现crash  控制台上就会打印下面的信息  这个时候我们可以根据这个信息来准确找到闪退位置(虽然闪退原因头部写的很清楚了  但是假如这个文件有很多setValueForKey方法呢,我们一个个找起来太费劲  我们就可以通过image来准确定位)

首先我们在上面信息中查找我们运行的程序的内存地址:也就是第4个 KVODemo对应的内存地址 0x00000001089faf99

然后在LLDB控制器面板输入命令:image lookup --address 0x00000001089faf99 然后回车

就看到打印信息:

Address: KVODemo[0x0000000100001f99] (KVODemo.__TEXT.__text + 1113)
Summary: KVODemo`-[ViewController touchesBegan:withEvent:] + 265 at ViewController.m:126:5

Summary就会显示哪个文件多少行   在ViewController.m文件的126行

po [[[UIApplication sharedApplication] keyWindow] recursiveDescription] <UIWindow: 0x15e771c0; frame = (0 0; 320 568); gestureRecognizers = <NSArray: 0x15e96210>; layer = <UIWindowLayer: 0x15e988e0>> | <UIView: 0x15eb4180; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0x15eb4300>> | | <UIButton: 0x15eb32d0; frame = (277 285; 46 30); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x15eb2e30>> | | | <UIButtonLabel: 0x15db5220; frame = (0 6; 46 18); text = 'Button'; opaque = NO; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x15db5410>> | | <_UILayoutGuide: 0x15eb4360; frame = (0 0; 0 20); hidden = YES; layer = <CALayer: 0x15eb4540>> | | <_UILayoutGuide: 0x15eb4af0; frame = (0 568; 0 0); hidden = YES; layer = <CALayer: 0x15eb4b70>> expression UIButton *$btn = (UIButton *)0x15eb32d0 expression [$btn setHidden:YES]

推荐阅读