iOS开发之LLDB常用调试技巧

原文地址
iOS开发之LLDB常用调试技巧
用好了LLDB,让调试变得轻松愉快,本文会写出并示例讲解一些常用的指令,以让你爱上它~~
Debug的技巧有NSLog, LLDB, 但是NSLog效率低下,尽量少用NSLog。LLDB中强大的功能,完全能取代NSLog。

调试技巧:NSLog

NSLog比printf的效率要低几十倍,因为NSLog会向ASL写log,同时向Terminal写log,而且同时会出现在Console.app中。NSLog尽量不要在release中打开,在Debug中可以写一个宏:

#ifdef DEBUG
#define NSLog(FORMAT, ...) do {fprintf(stderr,"%s:%d\t%s\n",[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], __LINE__, [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);} while(0)
#else
#define NSSLog(...)
#endif

调试技巧:LLDB

设置断点

  • 在LLDB中设置断点,可以用breakpoint set命令(简写br set):
(lldb) br set -f WebpImageViewController.m -l 104
Breakpoint 10: where = DemoCollectOC`-[WebpImageViewController addTestButton] + 26 at WebpImageViewController.m:104, address = 0x000000010f8a859a
  • 用b也可以创建断点,不过格式不同:
(lldb) b WebpImageViewController.m:97
Breakpoint 12: where = DemoCollectOC`-[WebpImageViewController testDict] + 588 at WebpImageViewController.m:97, address = 0x000000010f8a84ac
  • b也可以在C语言函数上直接创建,断点停在函数的开始:
(lldb) b DecodeInto
Breakpoint 13: where = DemoCollectOC`DecodeInto + 30 at webp.c:453, address = 0x000000010f95977e
  • 也可以在自定义函数、OC函数上设置断点:
(lldb) br set -F "-[UIView setBackgroundColor:]"
Breakpoint 14: where = UIKit`-[UIView(Rendering) setBackgroundColor:], address = 0x0000000112acae65
  • Condition & Action断点

    在断点处右键编辑断点,Log Message可以在符合条件时断住并打印出自定义信息:
    Condition断点图
    Condition断点图
    , 还有全局断点,符号断点。
  • 断点继续运行

thread return

打印当前线程堆栈:bt

打印所有线程中堆栈bt all

寻找栈地址对应代码位置: image

image lookup --address 0x000000000000

常用的po

po可以打印一个对象,p可以打印基本数据类型,po也可以打印出视图的层级关系:[self.view recursiveDescription],但打印不出frame,打印frame可以使用call来调用一句代码:call self.view.frame

LLDB更新UI

查看App整个层次:

(lldb) po [[[UIApplication sharedApplication] keyWindow] recursiveDescription]
<UIWindow: 0x7f96c7e0b080; frame = (0 0; 375 667); gestureRecognizers = <NSArray: 0x608000244f80>; layer = <UIWindowLayer: 0x6080000288c0>>
   | <UILayoutContainerView: 0x7f96c7e07b90; frame = (0 0; 375 667); autoresize = W+H; gestureRecognizers = <NSArray: 0x608000247d40>; layer = <CALayer: 0x608000029840>>
   |    | <UINavigationTransitionView: 0x7f96c7d0a590; frame = (0 0; 375 667); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x600000025500>>
   |    |    | <UIViewControllerWrapperView: 0x7f96c7e0bc30; frame = (0 0; 375 667); autoresize = W+H; layer = <CALayer: 0x608000029b00>>
   |    |    |    | <UIView: 0x7f96c7f0e6d0; frame = (0 0; 375 667); autoresize = W+H; layer = <CALayer: 0x608000025460>>
   |    |    |    |    | <_UILayoutGuide: 0x7f96c7f11040; frame = (0 0; 0 64); hidden = YES; layer = <CALayer: 0x6080000255c0>>
   |    |    |    |    | <_UILayoutGuide: 0x7f96c7c01550; frame = (0 667; 0 0); hidden = YES; layer = <CALayer: 0x600000024980>>
   |    |    |    |    | <UITableView: 0x7f96c801a000; frame = (0 0; 375 667);

在当前断点下,展示的为UITableView: 0x7f96c801a000,取到这个view:

(lldb) e id $myview = (id)0x7f96c801a000

改变颜色:

(lldb) e (void)[$myview setBackgroundColor:[UIColor redColor]]

我不想继续运行程序,还能看到颜色变化,也可以做到。渲染服务是一个另外的进程(backboardd),调试内容所在的进程被打断了,backdboardd也在运行着,可以用下面的命令也即时展示颜色改变:

(lldb) e (void)[CATransaction flush]

查找UIButton的target

如果你在LLDB中有一个button变量,可以新创建的,也可以是在UI中找到的,或者是断点处正在这个变量上,假设是断点在这个testButton变量上:

(lldb) po [testButton allTargets]
{(
    <WebpImageViewController: 0x7fb2b670e2f0>
)}
(lldb) po [testButton actionsForTarget:(id)0x7fb2b670e2f0 forControlEvent:0]
<__NSArrayM 0x60800005c3b0>(
testButtonPressed:
)

观察实例变量变化

后面跟变量地址

(lldb) watchpoint set e -- 0x0000600000228d40

非重写方法符号断点

在子类中没有实现viewDidAppear方法,而是在父类中实现的,用breakpoint设置不可以,需要用Chisel中bmessage命令:

(lldb) bmessage -[WebpImageViewController viewDidAppear:]
Setting a breakpoint at -[UIViewController viewDidAppear:] with condition (void*)object_getClass((id)$rdi) == 0x000000010888aeb0
Breakpoint 2: where = UIKit`-[UIViewController viewDidAppear:], address = 0x000000010babd132

参考文章

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

推荐阅读更多精彩内容