LLDB(Low Lever Debug)

断点

  • 设置断点(C语言)
    $breakpoint set -n XXX
    set 是子命令
    -n 是选项 是--name 的缩写!

*设置断点(OC)
$breakpoint set -n "[ViewController pauseGame:]"
设置多个
$breakpoint set -n "[ViewController pauseGame:]" -n "[ViewController pauseGame1:]"
在某个文件里面设置
$breakpoint set --file ViewController.m --selector touchesBegan:withEvent:
遍历整个项目的方法
$breakpoint set -r Game:

  • 查看断点列表
    $breakpoint list

  • 删除
    $breakpoint delete 组号

  • 禁用/启用
    $breakpoint disable 禁用
    $breakpoint enable 启用

  • 遍历整个项目中满足Game:这个字符的所有方法
    $breakpoint set -r Game:

  • 查看更多断点
    $breakpoint help 或者 help

流程控制

  • 继续执行
    $continue c
  • 单步运行,将子函数当做整体一步执行
    $n next
  • 单步运行,遇到子函数会进去
    $s

查看堆栈信息

$bt

* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
    frame #0: 0x000000010003a3a8 LLDB`-[ViewController pengTest4:](self=0x0000000100205180, _cmd="pengTest4:", str=@"peng") at ViewController.m:105
    frame #1: 0x000000010003a35c LLDB`-[ViewController pengTest3:](self=0x0000000100205180, _cmd="pengTest3:", str=@"peng") at ViewController.m:101
  * frame #2: 0x000000010003a2d8 LLDB`-[ViewController pengTest2:](self=0x0000000100205180, _cmd="pengTest2:", str=@"peng") at ViewController.m:96
    frame #3: 0x000000010003a254 LLDB`-[ViewController pengTest1:](self=0x0000000100205180, _cmd="pengTest1:", str=@"peng") at ViewController.m:91
    frame #4: 0x000000010003a0bc LLDB`-[ViewController touchesBegan:withEvent:](self=0x0000000100205180, _cmd="touchesBegan:withEvent:", touches=1 element, event=0x00000001700f0f80) at ViewController.m:51
    frame #5: 0x000000019643401c UIKit`forwardTouchMethod + 336
    frame #6: 0x0000000196433eb8 UIKit`-[UIResponder touchesBegan:withEvent:] + 60
    frame #7: 0x00000001962d817c UIKit`-[UIWindow _sendTouchesForEvent:] + 1948
    frame #8: 0x00000001962d3728 UIKit`-[UIWindow sendEvent:] + 3192
    frame #9: 0x00000001962a433c UIKit`-[UIApplication sendEvent:] + 340
    frame #10: 0x0000000196a9e014 UIKit`__dispatchPreprocessedEventFromEventQueue + 2400
    frame #11: 0x0000000196a98770 UIKit`__handleEventQueue + 4268
    frame #12: 0x0000000196a98b9c UIKit`__handleHIDEventFetcherDrain + 148
    frame #13: 0x000000019012142c CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 24
    frame #14: 0x0000000190120d9c CoreFoundation`__CFRunLoopDoSources0 + 540
    frame #15: 0x000000019011e9a8 CoreFoundation`__CFRunLoopRun + 744
    frame #16: 0x000000019004eda4 CoreFoundation`CFRunLoopRunSpecific + 424
    frame #17: 0x0000000191ab8074 GraphicsServices`GSEventRunModal + 100
    frame #18: 0x0000000196309058 UIKit`UIApplicationMain + 208
    frame #19: 0x000000010003a4f0 LLDB`main(argc=1, argv=0x000000016fdcbae0) at main.m:14
    frame #20: 0x000000018f05d59c libdyld.dylib`start + 4

  • 跳入堆栈对应函数
    $frame select 3
frame #3: 0x000000010003a254 LLDB`-[ViewController pengTest1:](self=0x0000000100205180, _cmd="pengTest1:", str=@"peng") at ViewController.m:91
   88   
   89   - (void)pengTest1:(NSString *)str{
   90       NSLog(@"%s",__func__);
-> 91       �[4m[�[0mself pengTest2:str];
   92   }
   93   
   94   - (void)pengTest2:(NSString *)str{
  • 进入堆栈的上一个函数
    $ up

  • 进入堆栈的下一个函数
    $ down

  • 返回堆栈调试
    $ thread return

LLDB动态调试

  • 添加数据(下面伪代码)

$p [self.models addObject:[[Person alloc] init]];

  • 添加多行代码 (换行时:同事按住control + command键)

$p Person *p5 = [[Person alloc] init];p5.name = "nextstep";p5.age = 13;[self.models addObject:p5];

内存断点

  • 设置内存断点
    $watchpoint set expression 0x000000010030ac98
$frame variable
     
     (ViewController *) self = 0x0000000100509a20
     (SEL) _cmd = "viewDidLoad"
     (Person *) p1 = 0x000000010030aaf0
     (Person *) p2 = 0x0000000000000010
     (Person *) p3 = 0x000000016fd060f8
     //查看需要设置内存地址
     $p &p1->_name
     (NSString **) $0 = 0x000000010030ac98
     
     //设置
     $watchpoint set expression 0x000000010030ac98
  • 删除内存断点
    $watchpoint delete

  • 查看内存断点
    $watchpoint list

  • 查看内存断点帮助
    $watchpoint help
    $watchpoint set help

cmmand指令(被动触发)

有时候当我们断点的时候,想让系统帮忙打印下对应信息

#设置断点
(lldb) b -[ViewController pengTest3:]
#输出
     Breakpoint 1: where = LLDB`-[ViewController pengTest3:] + 44 at ViewController.m:135, address = 0x0000000100012314

#查看断点清单
     (lldb) breakpoint list
     Current breakpoints:
     1: name = '-[ViewController pengTest3:]', locations = 1, resolved = 1, hit count = 1
     1.1: where = LLDB`-[ViewController pengTest3:] + 44 at ViewController.m:135, address = 0x0000000100012314, resolved, hit count = 1
     #设置断点指令(后续每次进入该断点 会运行对应指令)
     (lldb) breakpoint command add 1
     Enter your debugger command(s).  Type 'DONE' to end.
     > po self
     > p self.view
     > DONE
    #运行结果
 po self
<ViewController: 0x100405920>


 p self.view
(UIView *) $3 = 0x000000010020e7e0
    
  

*查看断点的指令
$breakpoint command list 1
*删除断点指令
$breakpoint command delete 1

p & po 区别

  • po - :
    Displays any returned value with formatting controlled by the type's author.
    类似 NSlog 格式化打印,自定义的打印方式
  • p - :
    Displays any returned value with LLDB's default formatting.
    expression 的缩写, 会输出对应的内存地址值

stop-hook(被动触发)

让你在每次stop的时候去执行一些命令,只对breadpoint,watchpoint
$target stop-hook add -o "frame variable"
断点一触发就会打印对应信息

Process 821 resuming
(ViewController *) self = 0x0000000100405920
(SEL) _cmd = "touchesBegan:withEvent:"
(__NSSetM *) touches = 0x0000000170246510 1 element
(UITouchesEvent *) event = 0x00000001740ef780
(UIView *) p1 = 0x000000010020e7e0

查看

$target stop-hook list

删除

$target stop-hook delete

直接取消 对应编号hook

$undisplay 2

常用命令

  • 查看使用的动态库 (列出当前可执行的和依赖的共享库
    图像)
    $ image list
  • 查看使用的动态库(在可执行的和依赖的范围内查找信息
    共享库映像)
    $image lookup -a "0x00123"
  • 查看类的详细信息
    $image lookup -t "Person"
Best match found in /Users/pengxicheng/Library/Developer/Xcode/DerivedData/TestLLDB-ducscbzedftwabgaptewzlmqgexq/Build/Products/Debug-iphoneos/TestLLDB.app/TestLLDB:
id = {0x30000002b}, name = "Person", byte-size = 24, decl = Person.h:11, compiler_type = "@interface Person : NSObject{
    int _age;
    NSString * _name;
}
@property ( getter = name,setter = setName:,readwrite,copy,nonatomic ) NSString * name;
@property ( getter = age,setter = setAge:,assign,readwrite,nonatomic ) int age;

  • p
  • b -[xxx xxx] //下断点
  • x 同 memory read 0x0000000104c0c3e0 //内存地址读写
  • register read //寄存器内容读取
  • po

参考1:
http://lldb.llvm.org/index.html
参考2:
http://www.dreamingwish.com/article/lldb-usage-a.html
参考3:
https://developer.apple.com/library/content/documentation/IDEs/Conceptual/gdb_to_lldb_transition_guide/document/lldb-basics.html#//apple_ref/doc/uid/TP40012917-CH2-SW1

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,627评论 6 517
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 95,180评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 169,346评论 0 362
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 60,097评论 1 300
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 69,100评论 6 398
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,696评论 1 312
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,165评论 3 422
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,108评论 0 277
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,646评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,709评论 3 342
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,861评论 1 353
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,527评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,196评论 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,698评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,804评论 1 274
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,287评论 3 379
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,860评论 2 361

推荐阅读更多精彩内容

  •   LLDB的Xcode默认的调试器,它与LLVM编译器一起,带给我们更丰富的流程控制和数据检测的调试功能。平时用...
    Thinkdifferents阅读 1,585评论 1 4
  • LLDB的Xcode默认的调试器,它与LLVM编译器一起,带给我们更丰富的流程控制和数据检测的调试功能。平时用Xc...
    CoderSC阅读 1,365评论 0 2
  • LLDB的Xcode默认的调试器,它与LLVM编译器一起,带给我们更丰富的流程控制和数据检测的调试功能。平时用Xc...
    小笨狼阅读 20,493评论 31 187
  • 逆向课程随堂笔记 断点 设置断点$breakpoint set -n XXXset 是子命令-n 是选项 是--n...
    GTMYang阅读 127评论 0 0
  • 虚拟内存简介 当我们向系统申请内存时,系统并不会给你返回物理内存的地址,而是给你一个虚拟内存地址。每个进程都拥有相...
    哲逗年阅读 200评论 0 0