iOS lldb调试
LLDB 初始
LLDB 是一个有着 REPL 的特性和 C++ ,Python 插件的开源调试器。LLDB 绑定在 Xcode
内部,存在于主窗口底部的控制台中。调试器允许你在程序运行的特定时暂停它,你可以查看变量的值,执行自定的指令,并且按照你所认为合适的步骤来操作程序的进展。
1 expression 简写为e
- 执行一个表达式
- 动态修改当前线程堆栈变量的值
- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view, typically from a nib.NSArray *arr = @[@"alex",@"apple",@"bounce",@"age"];NSString * a = arr[1];NSString * b = arr[1];NSString * c = arr[1];NSString * d = arr[1];NSLog(@"%@",a);NSLog(@"%@",b);NSLog(@"%@",c);NSLog(@"%@",d);
}// 打一个断点 使用e a 控制台输出信息如下 执行一个表示式
2019-01-16 10:52:57.050546+0800 SK_LLDB1[5881:64197] apple
(lldb) e a
(__NSCFConstantString *) $0 = 0x000000010183c090 @"apple"// 动态的修改c 的值 进行打印结果(lldb) e c = @"change_C"
(NSTaggedPointerString *) $2 = 0xb753a84c25bc65ea @"change_C"
2019-01-16 10:58:32.358539+0800 SK_LLDB1[5881:64197] change_C
2 po & p
po
的作用为打印对象。po
命令会尝试调用对象的description
方法来取得对象信息。
使我们调试的时候能获得可读性更强,更全面的信息
- p
即是
print,也是
expression –的缩写,与
po`不同,它不会打出对象的详细信息,只会打印出一个$符号,数字,再加上一段地址信息。打印对象的时候我们也可以指定特定格式
// x 十六进制打印
// d 十进制打印
// u 无符号十进制打印
// o 八进制打印
// t 二进制形式打印
// f 浮点数打印(lldb) p/x a
(__NSCFConstantString *) $3 = 0x0000000105080090 @"apple"
(lldb) p/d a
(__NSCFConstantString *) $4 = 4379377808 @"apple"
3 bt
backtrace thread 打印当前线程完整的堆栈信息
使用frame select 指令进行查看任何一个堆栈的信息
frame 是帧,其实就是当前程序的堆栈
使用frame variable 展示当前作用域下的参数和局部变量
(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1* frame #0: 0x00000001090cd63c SK_LLDB1`-[ViewController viewDidLoad](self=0x00007fd75fc100d0, _cmd="viewDidLoad") at ViewController.m:30frame #1: 0x000000010e2ba4e1 UIKitCore`-[UIViewController loadViewIfRequired] + 1186frame #2: 0x000000010e2ba940 UIKitCore`-[UIViewController view] + 27frame #3: 0x000000010e911c53 UIKitCore`-[UIWindow addRootViewControllerViewIfPossible] + 122frame #4: 0x000000010e91236e UIKitCore`-[UIWindow _setHidden:forced:] + 294frame #5: 0x000000010e9255c0 UIKitCore`-[UIWindow makeKeyAndVisible] + 42frame #6: 0x000000010e8d2833 UIKitCore`-[UIApplication _callInitializationDelegatesForMainScene:transitionContext:] + 4595frame #7: 0x000000010e8d7c2f UIKitCore`-[UIApplication _runWithMainScene:transitionContext:completion:] + 1623frame #8: 0x000000010e0f64e9 UIKitCore`__111-[__UICanvasLifecycleMonitor_Compatability _scheduleFirstCommitForScene:transition:firstActivation:completion:]_block_invoke + 866frame #9: 0x000000010e0ff29c UIKitCore`+[_UICanvas _enqueuePostSettingUpdateTransactionBlock:] + 153frame #10: 0x000000010e0f6126 UIKitCore`-[__UICanvasLifecycleMonitor_Compatability _scheduleFirstCommitForScene:transition:firstActivation:completion:] + 233frame #11: 0x000000010e0f6ae0 UIKitCore`-[__UICanvasLifecycleMonitor_Compatability activateEventsOnly:withContext:completion:] + 1085frame #12: 0x000000010e0f4cb5 UIKitCore`__82-[_UIApplicationCanvas _transitionLifecycleStateWithTransitionContext:completion:]_block_invoke + 795frame #13: 0x000000010e0f495f UIKitCore`-[_UIApplicationCanvas _transitionLifecycleStateWithTransitionContext:completion:] + 435frame #14: 0x000000010e0f9a90 UIKitCore`__125-[_UICanvasLifecycleSettingsDiffAction performActionsForCanvas:withUpdatedScene:settingsDiff:fromSettings:transitionContext:]_block_invoke + 584frame #15: 0x000000010e0fa80e UIKitCore`_performActionsWithDelayForTransitionContext + 100frame #16: 0x000000010e0f97ef UIKitCore`-[_UICanvasLifecycleSettingsDiffAction performActionsForCanvas:withUpdatedScene:settingsDiff:fromSettings:transitionContext:] + 221frame #17: 0x000000010e0fe93a UIKitCore`-[_UICanvas scene:didUpdateWithDiff:transitionContext:completion:] + 392frame #18: 0x000000010e8d644e UIKitCore`-[UIApplication workspace:didCreateScene:withTransitionContext:completion:] + 515frame #19: 0x000000010e47ad09 UIKitCore`-[UIApplicationSceneClientAgent scene:didInitializeWithEvent:completion:] + 357frame #20: 0x0000000115ae62da FrontBoardServices`-[FBSSceneImpl _didCreateWithTransitionContext:completion:] + 448frame #21: 0x0000000115af1443 FrontBoardServices`__56-[FBSWorkspace client:handleCreateScene:withCompletion:]_block_invoke_2 + 271frame #22: 0x0000000115af0b3a FrontBoardServices`__40-[FBSWorkspace _performDelegateCallOut:]_block_invoke + 53frame #23: 0x000000010bd4a602 libdispatch.dylib`_dispatch_client_callout + 8frame #24: 0x000000010bd4db78 libdispatch.dylib`_dispatch_block_invoke_direct + 301frame #25: 0x0000000115b25ba8 FrontBoardServices`__FBSSERIALQUEUE_IS_CALLING_OUT_TO_A_BLOCK__ + 30frame #26: 0x0000000115b25860 FrontBoardServices`-[FBSSerialQueue _performNext] + 457frame #27: 0x0000000115b25e40 FrontBoardServices`-[FBSSerialQueue _performNextFromRunLoopSource] + 45frame #28: 0x000000010a3b1721 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17frame #29: 0x000000010a3b0f93 CoreFoundation`__CFRunLoopDoSources0 + 243frame #30: 0x000000010a3ab63f CoreFoundation`__CFRunLoopRun + 1263frame #31: 0x000000010a3aae11 CoreFoundation`CFRunLoopRunSpecific + 625frame #32: 0x0000000112b251dd GraphicsServices`GSEventRunModal + 62frame #33: 0x000000010e8d981d UIKitCore`UIApplicationMain + 140frame #34: 0x00000001090cd770 SK_LLDB1`main(argc=1, argv=0x00007ffee6b31fa8) at main.m:14frame #35: 0x000000010bdc0575 libdyld.dylib`start + 1frame #36: 0x000000010bdc0575 libdyld.dylib`start + 1(lldb) frame select 2
frame #2: 0x000000010e2ba940 UIKitCore`-[UIViewController view] + 27
UIKitCore`-[UIViewController view]:0x10e2ba940 <+27>: movq 0x124e729(%rip), %rsi ; "_existingView"0x10e2ba947 <+34>: movq %rbx, %rdi0x10e2ba94a <+37>: movq %r14, %rax0x10e2ba94d <+40>: popq %rbx(lldb) frame variable
(ViewController *) self = 0x00007fd75fc100d0
(SEL) _cmd = "viewDidLoad"
(__NSArrayI *) arr = 0x00006000029b9650 @"4 elements"
(__NSCFConstantString *) a = 0x00000001090cf090 @"apple"
(__NSCFConstantString *) b = 0x00000001090cf090 @"apple"
(__NSCFConstantString *) c = 0x00000001090cf090 @"apple"
(__NSCFConstantString *) d = 0x00000001090cf090 @"apple"
4 设置断点
1 直接在界面上进行设置断点进行编辑
添加condition,一般用于多次调用的函数或者循坏的代码中,在作用域内达到某个条件,才会触发程序暂停
忽略次数,这个很容易理解,在忽略触发几次后再触发暂停
添加Action,为这个断点添加子命令、脚本、shell命令
自动继续,配合上面的添加Action,我们就可以不用一次又一次的暂停程序进行调试来查询某些值(大型程序中断一次还是会有卡顿),直接用Action将需要的信息打印在控制台,一次性查看即可。
2 在xcode --debug–breakpoints 中进行设置
Add Exception Breakpoint
异常断点,TableView的数据源与UI操作不一致,或者容器插入了nil的指针,将消息传至野指针,都会导致程序的crash,并且LLDB输出的信息不是很友好。加上异常断点,能够使程序在抛出异常的栈自动暂停,可直接定位导致抛出异常的代码。
Add Symbolic Breakpoint
符号断点。Symbolic Breakpoint 为符号断点。有时候,我们并不清楚程序会在什么情况下调用某一个函数,那我们可以通过符号断点来获取调用该函数时的程序堆栈。
3 全局断点的设置
点击Add Symbolic Breakpoint 设置两次
第一次输入这个表达式
-[NSException raise]
// 第二次输入次表示式 设置断点
objc_exception_throw
iOS lldb调试相关推荐
- iOS LLDB调试命令(Low Lever Debug)
断点 设置断点 $breakpoint set -n XXX set 是子命令 -n 是选项 是--name 的缩写! 查看断点列表 $breakpoint list 删除 $breakpoint d ...
- iOS LLDB调试精解
小笨狼与LLDB: http://jiangliancheng.gitcafe.io/2015/12/13/%E5%B0%8F%E7%AC%A8%E7%8B%BC%E4%B8%8ELLDB%E7%9A ...
- android lldb断点,iOS lldb断点调试
Xcode的使用中总是离不开调试这个环境,在一年多的iOS开发时间中,我更多地依赖于XCode本身提供的GUI工具来进行调试,而对LLDB敬而远之,这段时间好好学习了LLDB的使用,发觉我错过了太多东 ...
- mysql length函数_初识LLDB 调试 MySQL-爱可生
作者:洪斌 MySQL数据库最大的优势,想必就是可以直接通过代码调试来学习数据库内部逻辑.任何问题.任何疑惑在debug源码面前都无法掩盖,还可以提升对数据库内核的理解能力,是不是有一种可以掌控一切的 ...
- Swift 代码调试核武-LLDB调试基础
原创Blog,转载请注明出处 http://blog.csdn.net/hello_hwc?viewmode=list 我的stackoverflow 前言:LLDB是个开源的调试器,与XCode绑定 ...
- iOS各种调试技巧豪华套餐
转载http://www.cnblogs.com/daiweilai/p/4421340.html#biyouji 目录 前言 逼优鸡 知己知彼 百战不殆 抽刀断Bug 普通操作 全局断点(Globa ...
- 使用Python脚本强化LLDB调试器
https://www.cnblogs.com/yuanxiaoping_21cn_com/p/5433286.html LLDB是Xcode自带的调试器,作为一个iOS应用开发程序员,平时我在开发应 ...
- IOS各种调试技巧豪华套餐(好东西)
目录 前言 逼优鸡 知己知彼 百战不殆 抽刀断Bug 普通操作 全局断点(Global BreakPoint) 条件断点(Condational Breakpoints) 打印的艺术 NSLog 开启 ...
- LLDB+Python脚本:增强LLDB调试
在此次WWDC18中.有一个session是说LLDB调试的. 其通过Python脚本大幅度提升了调试效率. 今天讲一下导入脚本的方法. 转载请注明出处:juejin.im/post/5b57e3- ...
最新文章
- 在github上创建自己的第一个项目仓库实录
- python发明者叫什么-python是怎么被发明的
- 天气小工具新增风格-默认无背景,感谢欧阳兄制作
- 【题解】Luogu SP1435 PT07X - Vertex Cover
- first-软件工程
- Aop动态代理解决问题
- 测试点错的来:1024 科学计数法 (20分)
- 流程流转相关业务与流转的分离
- CJOJ 2171 火车站开饭店(树型动态规划)
- 垃圾回收算法_垃圾回收算法有哪些
- 95-134-114-源码-维表-Hbase维表关联:LRU策略
- 弱性能穿戴设备App化之Lua For STM32
- Codeforces 768B - Code For 1(分治思想)
- python正则匹配ip_python实战系列之正则获取IP地址(八)
- Fluent软件零基础入门到精通教程
- VB 2010 (53)Command对象
- SQL SERVER 资源性能监控-资源监视器
- Sql语法-Oracle
- oracle IF_Oracle实时同步大数据平台解决方案
- 因为计算机限制无法访问U盘,U盘拒绝访问怎么办解决教程