xcode LLDB命令 收集

http://blog.sina.com.cn/s/blog_6dce99b10101gwwv.html
http://www.tuicool.com/articles/fIR3U3

1. 运行时修改变量的值
expr a = 5
2. xcode 抛出异常时候可以用$eax

“$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”,这个命令将会对这个对象调用“description”方法和打印出来,在这个情况下,你也会得到错误的消息。

3. 什么时候用命令 P

例如想打印integer类型的变量或者方法返回值得时候

p (int)[[[self view] subviews] count]

得到的输出是

(int) $2 = 2

细心的朋友可能会发现输出的信息中带有 $1 、 $2 的字样。实际上,我们每次查询的结果会保存在一些持续变量中($[0-9]+),这样你可以在后面的查询中直接使用这些值。比如现在我接下来要重新取回 $1 的值:

(lldb) po $1
(UIView *) $1 = 0x0824c800 <UITableView: 0x824c800; frame = (0 20; 768 1004); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x74c3010>; layer = <CALayer: 0x74c2710>; contentOffset: {0, 0}>
4. 命令call

call即是调用的意思。其实上述的po和p也有调用的功能。因此一般只在不需要显示输出,或是方法无返回值时使用call。 和上面的命令一样,我们依然在 viewDidLoad: 里面设置断点,然后在程序中断的时候输入下面的命令:

call [self.view setBackgroundColor:[UIColor redColor]]

继续运行程序,看看view的背景颜色是不是变成红色的了!在调试的时候灵活运用call命令可以起到事半功倍的作用。

5. 命令bt 或者bt all

打印调用堆栈,加all可打印所有thread的堆栈。

6. 命令image

image 命令可用于寻址,有多个组合命令。比较实用的用法是用于寻找栈地址对应的代码位置。 下面我写了一段代码

NSArray *arr=[[NSArray alloc] initWithObjects:@"1",@"2", nil];
NSLog(@"%@",arr[2]);

这段代码有明显的错误,程序运行这段代码后会抛出下面的异常:

*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayI objectAtIndex:]: index 2 beyond bounds [0 .. 1]'  
*** First throw call stack:  
(  
  0   CoreFoundation                      0x0000000101951495 __exceptionPreprocess + 165  
  1   libobjc.A.dylib                     0x00000001016b099e objc_exception_throw + 43  
  2   CoreFoundation                      0x0000000101909e3f -[__NSArrayI objectAtIndex:] + 175  
  3   ControlStyleDemo                    0x0000000100004af8 -[RootViewController viewDidLoad] + 312  
  4   UIKit                               0x000000010035359e -[UIViewController loadViewIfRequired] + 562  
  5   UIKit                               0x0000000100353777 -[UIViewController view] + 29  
  6   UIKit                               0x000000010029396b -[UIWindow addRootViewControllerViewIfPossible] + 58  
  7   UIKit                               0x0000000100293c70 -[UIWindow _setHidden:forced:] + 282  
  8   UIKit                               0x000000010029cffa -[UIWindow makeKeyAndVisible] + 51  
  9   ControlStyleDemo                    0x00000001000045e0 -[AppDelegate application:didFinishLaunchingWithOptions:] + 672  
  10  UIKit                               0x00000001002583d9 -[UIApplication _handleDelegateCallbacksWithOptions:isSuspended:restoreState:] + 264  
  11  UIKit                               0x0000000100258be1 -[UIApplication _callInitializationDelegatesForURL:payload:suspended:] + 1605  
  12  UIKit                               0x000000010025ca0c -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 660  
  13  UIKit                               0x000000010026dd4c -[UIApplication handleEvent:withNewEvent:] + 3189  
  14  UIKit                               0x000000010026e216 -[UIApplication sendEvent:] + 79  
  15  UIKit                               0x000000010025e086 _UIApplicationHandleEvent + 578  
  16  GraphicsServices                    0x0000000103aca71a _PurpleEventCallback + 762  
  17  GraphicsServices                    0x0000000103aca1e1 PurpleEventCallback + 35  
  18  CoreFoundation                      0x00000001018d3679 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 41  
  19  CoreFoundation                      0x00000001018d344e __CFRunLoopDoSource1 + 478  
  20  CoreFoundation                      0x00000001018fc903 __CFRunLoopRun + 1939  
  21  CoreFoundation                      0x00000001018fbd83 CFRunLoopRunSpecific + 467  
  22  UIKit                               0x000000010025c2e1 -[UIApplication _run] + 609  
  23  UIKit                               0x000000010025de33 UIApplicationMain + 1010  
  24  ControlStyleDemo                    0x0000000100006b73 main + 115  
  25  libdyld.dylib                       0x0000000101fe95fd start + 1  
  26  ???                                 0x0000000000000001 0x0 + 1  
)  
libc++abi.dylib: terminating with uncaught exception of type NSException  

现在,我们怀疑出错的地址是0x0000000100004af8(可以根据执行文件名判断,或者最小的栈地址)。为了进一步精确定位,我们可以输入以下的命令:

image lookup --address 0x0000000100004af8

命令执行后返回:

我们可以看到,出错的位置是 RootViewController.m 的第53行。

Address: ControlStyleDemo[0x0000000100004af8] (ControlStyleDemo.__TEXT.__text + 13288)
Summary: ControlStyleDemo`-[RootViewController viewDidLoad] + 312 at RootViewController.m:53
7. 简称和别名

很多时候,LLDB完整的命令是很长的。比如前面所说的 image lookup --address 这个组合命令。为了方便日常的使用,提高效率,LLDB命令也提供通过简称的方式调用命令。还是这个命令,我们用简称就可以写为 im loo -a ,是不是简单多了。
如果你是从gdb时代就开始使用调试器的,你会发现,有些命令如 p 、 call 等命令和gdb下是一致的。其实这些命令是LLDB一些命令的别名,比如 p 是 frame variable 的别名, p view 实际上是 frame variable view 。除了系统自建的LLDB别名,你也可以自定义别名。比如下面这个命令

command alias ioa image lookup --address %1

是将我前面所介绍过的一个命令 image lookup --address 添加了一个 ioa 的别名。然后执行下面的命令:

(lldb) ioa 0x0000000100004af8
  Address: ControlStyleDemo[0x0000000100004af8] (ControlStyleDemo.__TEXT.__text + 13288)
  Summary: ControlStyleDemo`-[RootViewController viewDidLoad] + 312 at RootViewController.m:53
8. 常见问题

上面我们简单的学习了如何使用LLDB命令。但有时我们在使用这些LLDB命令的时候,依然可能会遇到一些问题。比如下面这个命令。

(lldb) p NSLog(@"%@",[self.view  viewWithTag:1001])
error: 'NSLog' has unknown return type; cast the call to its declared return type
error: 1 errors parsing expression

如果在使用LLDB命令中发现有 unknown type 的类似错误(多见于id类型,比如NSArray中某个值),那我们就必须显式声明类型。比如上面这个命令,我们得这么修改。

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

推荐阅读更多精彩内容

  • LLDB的Xcode默认的调试器,它与LLVM编译器一起,带给我们更丰富的流程控制和数据检测的调试功能。平时用Xc...
    CoderSC阅读 1,334评论 0 2
  • [转]浅谈LLDB调试器文章来源于:http://www.cocoachina.com/ios/20150126/...
    loveobjc阅读 2,463评论 2 6
  • LLDB的Xcode默认的调试器,它与LLVM编译器一起,带给我们更丰富的流程控制和数据检测的调试功能。平时用Xc...
    小笨狼阅读 20,415评论 31 187
  • 转载 与调试器共舞 - LLDB 的华尔兹: https://objccn.io/issue-19-2/ 推荐:i...
    F麦子阅读 3,321评论 0 10
  • [TOC] spring-ioc spring快速入门 1、导包 core、context、expression、...
    呦後阅读 178评论 0 0