LLDB是个开源的内置于XCode的具有REPL(read-eval-print-loop)特征的Debugger,其可以安装C++或者Python插件。

本系列针对于已经知道何为debugger,且有gdb或者lldb使用经验的读者。对于lldb的娴熟使用者,也可以用来作为查阅手册。

这一篇,我们讲述lldb内建的命令。

lldb与gdb命令名的对照表:http://lldb.llvm.org/lldb-gdb.html

1.help命令

单单执行help命令会列出所有命令列表,用户加载的插件一般来说列在最后。

执行help 可以打印指定command的帮助信息,至于插件提供的命令,其帮助信息取决于插件本身的实现。

例如 help print会打印内建命令print的使用帮助。

2.print命令

print命令的简化方式有prin pri p,唯独pr不能用来作为检查,因为会和process混淆,幸运的是p被lldb实现为特指print。

实际上你会发现,lldb对于命令的简称,是头部匹配方式,只要不混淆,你可以随意简称某个命令。

例如:

值得说明的是,返回的$0是命令结果的引用名,使用$0可以进行print $0 + 7这样打印出106,当然,$0可以被用于任何其他表达式或者接收参数的命令。

3.expression命令

expression命令可以用来修改变量的值,当然大部分情况下,使用xcode提供的可视化编辑器更方便。

1
2
3
4
(lldb) p count
(NSUInteger) $4 = 12
(lldb)e count = 42
(NSUInteger) $5 = 42

实际上print相当于expression --,而--的意思是命令的参数终止,跟在--后面的都是命令的输入数据。

要打印一个对象,则需要使用e -O -- anObj,而e -O -- 的缩写正是我们常用的po命令:

1
2
3
4
5
(lldb) po $8
(
foo,
bar
)

要按特定格式来打印一个变量则使用p/
命令:

1
2
3
4
5
6
7
8
(lldb) p 16
16
(lldb)p/x 16
0x10
(lldb) p/t 16
0b00000000000000000000000000010000
(lldb) p/t (char)16
0b00010000

或者使用p/c打印字符,p/s打印c字符串,详细格式查阅这里

既然我们已经知道print实际上是expression --的简写,那么在p(或者po)后面跟上复杂的表达式则可以先计算表达式再打印最后的计算结果。

1
2
3
4
5
6
7
8
9
10
11
(lldb) e int $a = 2
(lldb) p $a * 19
38
(lldb) e NSArray *$array = @[ @"Saturday", @"Sunday", @"Monday" ]
(lldb) p [$array count]
3
(lldb) po [[$array objectAtIndex:0] uppercaseString]
SATURDAY
(lldb) p [[$array objectAtIndex:$a] characterAtIndex:0]
error: no known method '-characterAtIndex:'; cast the message send to the method's return type
error: 1 errors parsing expression

值得注意的是,一旦出现了上述错误提示,说明lldb无法判定某一步的计算结果是什么数据类型,这时需要强制类型转换来告诉lldb:

1
2
3
4
(lldb) p (char)[[$array objectAtIndex:$a] characterAtIndex:0]
'M'
(lldb) p/d (char)[[$array objectAtIndex:$a] characterAtIndex:0]
77

4.流程控制命令

实际上使用xcode自带的可视化工具来控制“继续”“暂停”“下一步”“进入”“跳出”更简单,但这里还是列出其所对应的命令名:

继续:process continue, continue, c

下一步:thread step-over, next, n

进入:thread step-in, step, s

跳出:thread step-out, finish, f

5.thread return命令

执行thread return命令可以使得当前函数立即返回,也就是说,后续代码都不会执行了。当然执行此命令可能会使得arc的计数追踪出现错乱。

thread return命令需要一个参数来指明函数强制返回时的返回值。

6.断点命令

一般来说,在xcode中新建/删除“行断点”是很容易的,但是断点还有很多进阶使用方法:

条件断点、条件执行、记录日志、自动继续、重复断点跳过。

使用xcode提供的可视化工具来操作是很容易的:

7.在debugger中执行任意代码

1
2
3
4
5
6
7
(lldb) e char *$str = (char *)malloc(128)
(lldb) e (void)strcpy($str, "wxrld of warcraft")
(lldb) e $str[1] = 'o'
(char) $0 = 'o'
(lldb) p $str
(char *) $str = 0x00007fd04a900040 "world of warcraft"
(lldb) e (void)free($str)

所以,在debugger中可以修改view的颜色、尺寸、甚至创建controller来push。

8.watchpoint

watchpoint可以在某个变量被写入/读取时暂停程序运行:

1
2
3
4
5
6
7
8
9
10
11
(lldb) watchpoint set expression -- (int*)&_abc4
Watchpoint created: Watchpoint 7: addr = 0x15e36d3c size = 4 state = enabled type = w
    new value: 0x00000000
(lldb) watchpoint set v -w read _abc4
Watchpoint created: Watchpoint 8: addr = 0x15e36d3c size = 4 state = enabled type = r
    watchpoint spec = '_abc4'
    new value: 0
(lldb) watchpoint set v -w read_write _abc3
Watchpoint created: Watchpoint 9: addr = 0x15e36d38 size = 4 state = enabled type = rw
    watchpoint spec = '_abc3'
    new value: 0

实际上可以使用watchpoint来监视任意一段内存的读写。

使用XCode也可以方便地创建watchpoint。

XCode的可视化debug工具中的watch是一个write类型watchpoint(也就是默认的)

另外,上述语句中 v是variable的简写,同样的,set可以简写为s,watch可以简写为wa,而-w后面的参数是不可以简写的必须为read、write或者read_write。

当前在arm和x86上,我们一次最多创建4个watchpoint,继续创建会提示错误。

9.符号断点

用xcode的可视化工具创建符号断点很简单,在Add symbolic breakpoint中填入符号名即可,这里给出objective-c的函数符号断点的写法:

1
2
-[MyViewController viewDidAppear:]
+[MyViewController sharedInstance]

10.查看内存

使用XCode的可视化工具来查看memory,要注意watch memory of "p" 和watch memory of "*p"的区别。

手动执行命令可以help x或者 help memory。

小结

lldb的用法很灵活多样,但是XCode的可视化调试工具覆盖面有限,一些高级用法仍需手动输入命令,甚至结合python脚本。

下一篇,我们将讲解lldb中的python脚本使用。

http://www.dreamingwish.com/article/lldb-usage-a.html

LLDB使用篇(上)的更多相关文章

  1. Apache Maven 入门篇 ( 上 )

    作者:George Ma 写这个 maven 的入门篇是因为之前在一个开发者会的动手实验中发现挺多人对于 maven 不是那么了解,所以就有了这个想法. 这个入门篇分上下两篇.本文着重动手,用 mav ...

  2. [转]Apache Maven 入门篇 ( 上 )

    原文地址:Apache Maven 入门篇 ( 上 ) 作者:George Ma 写这个 maven 的入门篇是因为之前在一个开发者会的动手实验中发现挺多人对于 maven 不是那么了解,所以就有了这 ...

  3. c++学习笔记之封装篇(上)

    title: c++学习笔记之封装篇(上) date: 2017-03-12 18:59:01 tags: [c++,c,封装,类] categories: [学习,程序员,c/c++] --- 一. ...

  4. Netty实现高性能IOT服务器(Groza)之手撕MQTT协议篇上

    前言 诞生及优势 MQTT由Andy Stanford-Clark(IBM)和Arlen Nipper(Eurotech,现为Cirrus Link)于1999年开发,用于监测穿越沙漠的石油管道.目标 ...

  5. 【转】Shell编程基础篇-上

    [转]Shell编程基础篇-上 1.1 前言 1.1.1 为什么学Shell Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应 ...

  6. 前端开发工程师 - 03.DOM编程艺术 - 第1章.基础篇(上)

    第1章.基础篇(上) Abstract:文档树.节点操作.属性操作.样式操作.事件 DOM (Document Object Model) - 文档对象模型 以对象的方式来表示对应的html,它有一系 ...

  7. 6-C++远征之封装篇[上]-学习笔记

    C++远征之封装篇(上) 课程简介 类(抽象概念),对象(真实具体) 配角: 数据成员和成员函数(构成了精彩而完整的类) 构造函数 & 析构函数(描述了对象的生生死死) 对象复制和对象赋值 ( ...

  8. SpringBoot图文教程「概念+案例 思维导图」「基础篇上」

    有天上飞的概念,就要有落地的实现 概念+代码实现是本文的特点,教程将涵盖完整的图文教程,代码案例 每个知识点配套自测面试题,学完技术自我测试 本文初学向,所以希望文中所有的代码案例都能敲一遍 大哥大姐 ...

  9. 4.1/4.2 多线程进阶篇<上>(Pthread & NSThread)

    本文并非最终版本,如有更新或更正会第一时间置顶,联系方式详见文末 如果觉得本文内容过长,请前往本人 “简书” 本文源码 Demo 详见 Githubhttps://github.com/shorfng ...

随机推荐

  1. poj--3250--Bad Hair Day(模拟)

    Bad Hair Day Time Limit: 2000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u Submit ...

  2. MySQL循环语句之while循环测试

    转自:http://www.nuoweb.com/database/7614.html MySQL有循环语句操作,while 循环.loop循环和repeat循环,目前我只测试了 while 循环,下 ...

  3. VBA 第一天

    公司实习第一天,excel搞不定啊,学点VBA留着用: 录制宏: 点击录制宏按钮以后,在这段期间你做的每一个操作都会被记录下来,直到你点击停止录制按钮才能够停下,停下来后在此期间每一个操作都会以宏代码 ...

  4. .net core @Html 自定义属性中包含特殊符号解决

    最近自己在练手项目用到了VUE 绑定属性的时候发现 有: -符号 这样显然是不支持的.之前发现 v-on  这种-符号也是不支持的 但是可用 @v_on 替代.可是找遍了所有资料也没找到:转义符 当时 ...

  5. Excel中将字符串中从右起第n个指定字符替换的方法

    比如你想把www.baidu.com.cn中的倒数第二个”.”替换成@,则可以用: =SUBSTITUTE(A1,".","@",LEN(A1)-LEN(SUB ...

  6. avalon 双工绑定以及一个按钮多个事件

    <html xmlns="http://www.w3.org/1999/xhtml"><head runat="server">    ...

  7. HDU 1892 See you~ 【 二维树状数组 】

    题意:二维的树状数组注意的有三个地方,输入进去的坐标都加1,防止lowbit(0) + 0造成死循环还有就是询问矩形面积的时候,输入进去的x1,x2,y1,y2,可能不是正对角线,要转化成正对角线 初 ...

  8. RelativeLayout.addRule()方法

    RelativeLayout.addRule()方法 通过LayoutParams的 addRule方法来额外的添加别的规则了,android.widget.RelativeLayout.Layout ...

  9. 3ds Max 2018 在安装后无法启动或出现不稳定

    问题: 安装 3ds Max 2018 后,软件无法正常启动,或在打开后不久出现不稳定和崩溃. 原因: 有多种原因可能会导致这些错误: ▪ 3ds Max.Windows 更新和 ProSound.d ...

  10. 理解ZBrush中的笔触

    笔触主要配合笔刷来使用,同样的笔刷搭配不同的笔触可以绘制出各种不同的效果.简言之,ZBrush 4R8就是提供了各种各样的笔触效果,例如,有模拟连贯笔触的效果,也有模拟喷枪喷洒的笔触效果. 下面简单认 ...