lldb调试器简介
 
lldb 是一个有着 REPL 的特性和 C++ 、Python 插件的开源调试器。lldb调试器的由来是伴随着Xcode的版本升级而来。
Xcode4.3之前使用的默认调试器是gdb, 到Xcode4.3之后便改成了lldb。gdb是UNIX及UNIX-like下的调试工具,是来自于GNU组织。
后被苹果进行优化,功能添加后,改名为lldb。可以说lldb是gdb的高版本。
 
lldb调试器是一个可执行Mach-O文件,因为通常是和xcode集成在一起,会让人误以为是xcode的一个功能,或者是xcode的一个插件。
然后并非如此,它是一个可执行的应用,可以任意组合,比如:
Mac系统就有自带调试器lldb:
/Library/Developer/CommandLineTools/usr/bin/lldb

Xcode中也自带来了调试器lldb:

/Applications/Xcode.app/Contents/Developer/usr/bin/lldb
lldb调试器使用
 
在Xcode集成环境中,lldb使用方法简单;
运行Xcode工程后暂停项目,在lldb调试器窗口就可以使用lldb命令进行调试了。
 
如果没有Xcode集成环境怎么使用lldb呢?
这就有许多步骤需要我们手动完成了。
 
1.先通过ps查询当前运行的程序:
192:~ zhoufei$ ps aux | grep /Applications

zhoufei           1496   0.8  4.2  6501004 348924   ??  S    10:14下午   0:35.31 /Applications/YoudaoNote.app/Contents/MacOS/YoudaoNote
zhoufei 1255 0.0 2.0 8894360 168828 ?? S 10:01下午 0:43.20 /Applications/Firefox.app/Contents/MacOS/firefox

2.开启调试一个静止的app程序

//通过lldb调试器打开静态程序
192:bin zhoufei$ lldb firefox //或者 //通过lldb调试器打开 带参数的 静态程序
192:bin zhoufei$ lldb firefox 11 22

3.将lldb调试器附加到一个正在运行的app程序

//1.先打开lldb调试器
192:bin zhoufei$ lldb //2.将调试器附加到要调试的目标可执行文件上
(lldb) process attach --name firefox
Process 1255 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP
frame #0: 0x00007fff7570920a libsystem_kernel.dylib`mach_msg_trap + 10
libsystem_kernel.dylib`mach_msg_trap:
-> 0x7fff7570920a <+10>: retq
0x7fff7570920b <+11>: nop libsystem_kernel.dylib`mach_msg_overwrite_trap:
0x7fff7570920c <+0>: movq %rcx, %r10
0x7fff7570920f <+3>: movl $0x1000020, %eax ; imm = 0x1000020
Target 0: (firefox) stopped. Executable module set to "/Applications/Firefox.app/Contents/MacOS/firefox".
Architecture set to: x86_64h-apple-macosx.
(lldb) thread list

4.根据调试命令进行调试

lldb调试器常用命令
 lldb的命令结构如下:
Command  subCommand action -opt argument
命令  子命令  动作  选项  参数。
<command> [<subcommand> [<subcommand>...]] <action> [-options [option-value]] [argument [argument...]]

1.打印命令

//同expression
p
//打印对象
po

2.项目中mach-o文件查询

//在app使用到的所有mach-o文件中查询
image lookup 
//查询 类型UITableViewCell 在mach-o中的定义信息,并打印出最佳匹配
image lookup -t UITableViewCell //查询 崩溃内存地址0x000000010e041b62 在mach-o中的定义信息,并打印出最佳匹配
//4 WYDoctorConsultModule_Example 0x000000010e041b62 -[WYFastConsultViewController //emptyViewModelDidRefreshOrderList:] + 162
image lookup -a 0x000000010e041b62 //查询 方法名或者符号名为emptyViewModelDidRefreshOrderList: 在mach-o中的定义信息,并打印出最佳匹配
image lookup -n emptyModelDidRefreshOrderList: //查询 app中所有使用的mach-o信息,并打印出最佳匹配
image list
3.项目中对某个内存数据进行监控,如:全局变量,静态变量
watchpoint set variable
//对变量self->_pageNo进行监控
watchpoint set variable self->_pageNo //对内存地址&(self->_pageNo)进行监控
watchpoint set expression &(self->_pageNo) //查询所有的内存监控
watchpoint list //删除序号为:1 的内存监控
watchpoint delete 1 //额外命令追加
//当序号:2 断点触发时,执行追加的命令
watchpoint command add 2
//删除序号:2的命令追加
watchpoint command delete 2
//查询所有追加命令的列表
watchpoint command list

4.为项目源码外的第三方静态库,动态库添加断点

breakpoint set
breakpoint set -a 函数地址
breakpoint set -n 函数名称
//为符合正则表达式函数全部添加断点
breakpoint set -r 任意包含此字符串的函数名称 //breakpoint set -s 动态库名称 -n 动态库方法名
breakpoint set -s dyld -n load
5.函数调用堆栈控制
比Xcode视图展示的线程堆栈更加详细
//打印当前栈帧frame的堆栈信息
thread backtrace
bt命令同上 //函数提前返回
thread return [返回值] //当前栈帧的所有局部变量
frame variable //源码级 代码单步执行,下一步
thread step-over, next, n
//指令级 汇编单步执行,下一步
thread step-inst-over, nexti, ni
6.原始命令
原始命令命令后面默认都是参数, 
如果要跟选项的话,需要添加 — 声明结束,后面跟着参数。
expression (就是 p/print/call)
expression -o(就是 po) //打印对象内存地址
expression -o -- 0x1111
7.辅助命令 apropos
可以通过模糊搜索,查询带有关键字的命令
如: apropos list    //查询出所有包含list命令的lldb命令。
 
 lldb调试器扩展
 
chisel是facebook开源的插件
安装方式简单:
brew install chisel
 安装成功后,修改~/.lldbinit文件,在文件的末尾增加一行:
command script import /usr/local/opt/chisel/libexec/fblldb.py

后保存, 重启Xcode或者重新打开终端,让修改生效。

最后

平时的iOS开发中,使用的OC或者Swift是编译性语言,每次修改都有重新编译后才能看到结果,如果合理使用lldb调试器,将会大大提高开发效率。

 
 
 
 
 
 

lldb调试器知多少的更多相关文章

  1. iOS LLDB调试器

    随着Xcode 5的发布,LLDB调试器已经取代了GDB,成为了Xcode工程中默认的调试器.它与LLVM编译器一起,带给我们更丰富的流程控制和数据检测的调试功能.LLDB为Xcode提供了底层调试环 ...

  2. 使用Python脚本强化LLDB调试器

    LLDB是Xcode自带的调试器,作为一个iOS应用开发程序员,平时我在开发应用时会使用LLDB来调试代码.在逆向应用时,也会用到LLDB来跟踪应用的执行过程. LLDB还内置了一个Python解析器 ...

  3. 学习笔记之--认识Xcode中的重要成员:lldb调试器

    之前对lldb调试器了解比较少,平时主要用来打印日志和暂定时用鼠标查看属性数据以及使用p po一些简单的命令语句. 今天看了一些关于lldb的文章,顿时觉得之前对它了解太少了,原来它还有那么多的功能. ...

  4. iOS LLDB调试器和断点调试

    技巧一:运行时修改变量的值 你以前怎么验证是不是某个变量的值导致整段程序不能正常工作?修改代码中的变量的值,然后cmd+r重新启动app?现在你不需要这么做了,只需要设置一个断点,当程序在这进入调试模 ...

  5. iOS - 浅谈LLDB调试器

    摘要 LLDB是Xcode默认的调试器,它与LLVM编译器一起,带给我们更丰富的流程控制和数据检测的调试功能.平时用Xcode运行程序,实际走的都是LLDB.熟练使用LLDB,可以让你debug事半功 ...

  6. LLDB调试器

    你是否曾经苦恼于理解你的代码,而去尝试打印一个变量的值? NSLog(@"%@", whatIsInsideThisThing); 或者跳过一个函数调用来简化程序的行为? NSNu ...

  7. iOS之LLDB调试器

    LLDB被定位为下一代的高性能调试器,默认内置于Xcode IDE内, 支持在PC.iOS设备以及模拟器上调试C.Objective-C和C++. 关于LLDB的官方介绍:LLDB 常用命令: 1.  ...

  8. Ubuntu18.04上使用LLDB调试Chromium Android C++代码。

    ###动机###Chromium Android源代码庞大且复杂.在调试器LLDB下能帮助我们更好的理解代码流程.介绍使用LLDB调试器调试android上chromium的C++代码. [1] 编译 ...

  9. 在lldb调试中调用c++函数

    在lldb调试时,调用oc对象的方法不足为奇,因为msgSend是有原型导出的,oc对象的方法都运行期绑定的,绑定信息都在objc_class中.只要在调试中[receiver sel]之类,lldb ...

随机推荐

  1. Node.js 安装及环境配置 以及google浏览器安装插件并使用

    一.安装环境 1.本机系统:Windows 10 企业版(64位)2.Node.js:node-v10.16.0-x64.msi(64位) 二.安装Node.js步骤 1.下载对应自己系统对应的 No ...

  2. nginx服务器究竟是怎么执行php项目

    https://jingyan.baidu.com/article/4f34706e3af779e387b56dc7.html CGI全称是“公共网关接口”(Common Gateway Interf ...

  3. 浅谈集合框架五——集合框架扩展:Collections工具类的使用,自定义比较器

    最近刚学完集合框架,想把自己的一些学习笔记与想法整理一下,所以本篇博客或许会有一些内容写的不严谨或者不正确,还请大神指出.初学者对于本篇博客只建议作为参考,欢迎留言共同学习. 之前有介绍集合框架的体系 ...

  4. 通过作用域链解析js函数一些难以理解的的作用域问题

    基本原理 js函数在执行时,系统会创建一个隐式的属性scope,scope中存储的是函数的作用域链. 通过对这个scope的分析,就能解释JavaScript中许多难以理解的问题: 例1: funct ...

  5. linux进程唤醒的细节

    我们已展现的唤醒进程的样子比内核中真正发生的要简单. 当进程被唤醒时产生的真正动 作是被位于等待队列入口项的一个函数控制的. 缺省的唤醒函数[22]22设置进程为可运行的 状态, 并且可能地进行一个上 ...

  6. 2018-8-10-win10-uwp-商业游戏-1.2.1

    title author date CreateTime categories win10 uwp 商业游戏 1.2.1 lindexi 2018-08-10 19:16:50 +0800 2018- ...

  7. Linux内存页大小

    当使用内存时, 记住一个内存页是 PAGE_SIZE 字节, 不是 4KB. 假定页大小是 4KB 并且 硬编码这个值是一个 PC 程序员常见的错误, 相反, 被支持的平台显示页大小从 4 KB 到 ...

  8. Linux 创建和销毁 urb

    struct urb 结构在驱动中必须不被静态创建, 或者在另一个结构中, 因为这可能破坏 USB 核心给 urb 使用的引用计数方法. 它必须使用对 usb_alloc_urb 函数的调用而被创 建 ...

  9. vue-learning:7-template-v-bind-with-class-and-style

    绑定元素样式的指令v-bind:class 和v-bind:style 在HTML元素结构中,class和style特性(attribute)是非常突出的,可以为元素添加样式属性(property). ...

  10. IPv4数据报格式及其语义

    一.IP数据报的格式如下图所示 版本 首部长度 服务类型 数据报长度 16比特标识 标志 13比特片偏移 寿命 上层协议 首部检验和 32比特源IP地址 32比特目的IP地址 选项(如果有的话) 数据 ...