lldb的若干技巧及拾遗
来源:互联网 发布:1512端口 编辑:程序博客网 时间:2024/05/17 22:52
机缘
以前有一阵觉得 chisel 真的挺好用的,后来翻看了历年的WWDC关于lldb的video 还是发现一些tips
Tip
lldb 统一格式
<noun> <verb> [options] [argument [argument ...]]
lldb 命令行都遵循上述格式,例如:
target create /bin/lsbreakpoint set —-name mallocprocess attach --pid 1234breakpoint set --file hello.c --line 100breakpoint modify —condition “self = $myModel"
lldb简写
help
-> h
expression -O --
-> po
expression --
-> p
thread until 11
-> th u 11
breakpoint modify —condition "self = $myModel"
-> br m -c “self == $myModel"
lldb command alias
lldb 启动都会加载 ~/.lldbinit
,故而我们可以通过修改它来实现自己的增强
例如 command alias
,常见的例子,譬如耳熟能详的 Reveal
能通过下列命令启动
command alias reveal_load_sim expr (void*)dlopen("/Applications/Reveal.app/Contents/SharedSupport/iOS-Libraries/libReveal.dylib", 0x2);
我自己扩展了这个别名 pwv
:
command alias pwv expr (void)NSLog((NSString*)[[[UIApplication sharedApplication] keyWindow] recursiveDescription])
该命令可以打印keyWindow上的view的层级结构。
command regex
同样放在 ~/.lldbinit
,跟alias类似,不过可以带参数,使用正则。
command regex pv 's/(.+)/expr (void)NSLog((NSString*)[(UIView*)%1 recursiveDescription])/'command regex postNoti 's/(.+)/expr (void)[[NSNotificationCenter defaultCenter] postNotificationName:%1 object:nil]/'
命令 pv %1
用来打印 %1
上的所有view的层级结构。
命令 postNoti %1
用来post 一个notication如:
(lldb) postNoti @"MyNotification"
根据日常开发的需要, alias
和 regex
都可以用来当做打开/关闭某些扩展功能,如第三方的调试工具:
打开/关闭FLEXcommand alias flex expr [[FLEXManager sharedManager] toggleExplorer]
regex
我用得也比较简单,基本跟alias差不多。相信还会有更geek的用法。
command script
chisel就是用下列命令初始化的:
command script import /path/to/fblldb.py
simple example
myCommands.py
def caflushCommand(debugger, command, result, internal_dict):debugger.HandleCommand("e (void)[CATransaction flush]")
command script import ~/myCommands.py
lldb关于python的接口我看得也不细,具体参见wwdc和lldb。chisel的github上也有讲。
流程控制
下列命令其意不言自明,日常其实不一定能用到,但 thread return
在debug时还是相当有用的,调试时发现某些bug,当重现步骤又太麻烦,不想修改代码后重新编译,可以在某些critical method中进行fake return。
process continue
continue
c
thread step-over
next
n
thread step-in
step
s
thread step-out
finish
thread return
thread returnthread return NOthread return @"hi"
Examining Data
fr
ame v
ariable
(lldb) fr v self
(MyProject.ViewController) self = 0x00007fd63c221fa0 {UIKit.UIViewController = {
UIResponder = { NSObject = { isa = AFTask.ViewController } _hasAlternateNextResponder = false _hasInputAssistantItem = false}_overrideTransitioningDelegate = nil以下省略
其他拾遗
寄存器相关
(lldb) register readGeneral Purpose Registers: rax = 0x0000000010004005 rbx = 0x00000000ffffffff rcx = 0x00007fff5559b718 rdx = 0x0000000000000000 rdi = 0x00007fff5559b880 rsi = 0x0000000007000806 rbp = 0x00007fff5559b760 rsp = 0x00007fff5559b718 r8 = 0x0000000000001403 r9 = 0x00000000ffffffff r10 = 0x0000000000000c00 r11 = 0x0000000000000206 r12 = 0x0000000000000c00 r13 = 0x0000000000000000 r14 = 0x00007fff5559b880 r15 = 0x0000000000001403 rip = 0x000000010e151386 libsystem_kernel.dylib`mach_msg_trap + 10 rflags = 0x0000000000000206 cs = 0x000000000000002b fs = 0x0000000000000000 gs = 0x0000000000000000
platform shell
在lldb中执行shell命令,如
(lldb)platform shell ls
objective-c set exception 断点
(lldb) br s -E objc
查看类型
(lldb) type lookup ErrorTypeprotocol ErrorType { var _domain: Swift.String { get } var _code: Swift.Int { get }}extension ErrorType { var _domain: Swift.String { get {} }}
其他wwdc上有说修好了lldb的一些known issue,比如
(lldb) p NSLog(@“%d”, i)error: 'NSLog' has unknown return type; cast the call to its declared return typeerror: 1 errors parsing expression
(lldb) p [NSApplication sharedApplication].undoManager error: property ‘undoManager’ not found on object of type ‘id’error: 1 errors parsing expression
这些问题都修好了。
总结
其他的以后再补充。有些东西其实对于大多数开发者用处不大,大家随便看看。
- lldb的若干技巧及拾遗
- Xcode之lldb的技巧
- LLDB 调试 UI 的技巧
- LLDB 调试技巧总结
- LLDB调试技巧待续
- lldb一些技巧
- VC6.0的若干实用小技巧
- VC的若干实用小技巧 (转)
- VC的若干实用小技巧
- VC的若干实用小技巧
- VC的若干实用小技巧 (转)
- VC6.0的若干实用小技巧
- VC6.0的若干实用小技巧
- vc++的若干实用小技巧
- VC的若干实用小技巧(一)
- VC的若干实用小技巧(二)
- VC的若干实用小技巧(三)
- VC的若干实用小技巧(四)
- 说说XcodeLLDB调试的那些事儿
- Android自定义View画饼类图
- [分块 随机Hash] Romanian IOI 2017 Selection #6 Jolteon
- 2017中科大信息安全课程总结一
- 如何获取编译器预定义宏的值
- lldb的若干技巧及拾遗
- PAT乙级题解合集
- 使用Git分布式版本控制系统
- 关于git
- [C++ Primer Plus]学习笔记
- Centos6.x Nagios安装配置
- java多线程知识浅析
- Log4j简单配置(后续补充)
- codeforces 459B Pashmak and Flowers