LLDB 简单用法

本文介绍了使用LLDB进行调试的基础指令,包括打印变量、修改变量值、控制调试流程及断点管理等关键操作。通过具体示例展示了如何高效利用LLDB解决实际问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LLDB指令
print : 打印值

LLDB会作前缀匹配,所有可以用 print prin pri 或 p。但是不能用pr 因为和process指令有歧义
输出OC 对象,用 po,实质是调用了对象的description方法
打印变量,可以给print 指定不同的打印格式
x - 16进制
d - 带符号10进制
u - 无符号10进制
o - 8进制
t - 2进制
a - 查看内存地址指向的数据
c - 输出字符
f - 浮点型
s - 字符串类型
(lldb) p count
(NSInteger) $2 = 60

(lldb) p str
(__NSCFConstantString *) $3 = 0x0000000100078268 @"fame"
(lldb) po str
fame

//16进制
(lldb) p/x count 
(NSInteger) $1 = 0x000000000000003c
//8进制
(lldb) p/o count
(NSInteger) $2 = 074
//2进制
(lldb) p/t count 
(NSInteger) $3 = 0b0000000000000000000000000000000000000000000000000000000000111100

//输出字符
(lldb) p/c [str characterAtIndex:2]
(unichar) $5 = m\0 U+006d u'm'
//输出字符串
(lldb) p/s str
(__NSCFConstantString *) $6 = @"fame"

(lldb) p/a str
(__NSCFConstantString *) $15 = 0x00000001000d4268 @"fame" @"fame"

//输出 0x00000001000d4268 地址指向的数据
(lldb) p/a 0x00000001000d4268
(long) $16 = 0x00000001000d4268 @"fame"

//浮点型
(lldb) p/f count
(NSInteger) $17 = 2.9643938750474793E-322
expression : 修改、声明变量

简写: e
expression 既可以修改变量的值,又可以声明变量,声明的变量必须以 $ 开头
//修改变量的值
(lldb) e count = 100
(NSInteger) $24 = 100
(lldb) p count
(NSInteger) $25 = 100

//声明变量
(lldb) e int $a = -1
(lldb) p/d $a
(int) $a = -1
(lldb) p/d $a*19
(int) $20 = -19

(lldb) e NSArray *$array = @[@"aaa", @"bbb", @"ccc"]
(lldb) p $array[0]
(NSTaggedPointerString *) $21 = 0xa000000006161613 @"aaa"
(lldb) p/c [$array objectAtIndex:1]
(NSTaggedPointerString *) $22 = #&&\x06\0\0\0\xa0 @"bbb"
(lldb) p/c [[$array objectAtIndex:1] characterAtIndex:1]
error: no known method '-characterAtIndex:'; cast the message send to the method's return type

//LLDB无法返回值的类型,需要指定类型
(lldb) p/c (char)[[$array objectAtIndex:1] characterAtIndex:1]
(char) $23 = 'b'
调试流程控制

继续执行程序 process continue ,它的别名为 continue,缩写为 c。

执行一行代码 thread step-over,next,或者 n 命令。

跳进函数 thread step-in, step ,缩写为 s。

跳出函数 thread step-out ,缩写为 finish.

Thread Return 调试时,还有一个很棒的函数可以用来控制程序流程:thread return 。它有一个可选参数,在执行时它会把可选参数加载进返回寄存器里,然后立刻执行返回命令,跳出当前栈帧。这意味这函数剩余的部分不会被执行。这会给 ARC 的引用计数造成一些问题,或者会使函数内的清理部分失效。但是在函数的开头执行这个命令,是个非常好的隔离这个函数,伪造返回值的方式 。

断点管理

查看所有断点:breakpoint list ,简写 br li
开启断点:breakpoint enable <断点编号>
关闭断点:breakpoint disable <断点编号>

原文地址:https://objccn.io/issue-19-2/

转载于:https://my.oschina.net/mexiaobai1315/blog/883630

### 配置并使用 LLDB 调试器在 VSCode 中 为了在 Visual Studio Code (VSCode) 中配置和使用 LLDB 调试器,需要创建 `launch.json` 文件来定义调试环境。以下是具体方法: #### 创建 `launch.json` 文件 通过设置 `launch.json` 文件中的参数,可以指定调试工具链以及附加选项。例如,当按下 F5 键时,VSCode 将调用 LLDB 来运行和调试程序[^1]。 以下是一个典型的 `launch.json` 配置示例用于 C/C++ 和 LLDB 的组合: ```json { "version": "0.2.0", "configurations": [ { "name": "(lldb) Launch", "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/your_program_name", // 替换为目标可执行文件路径 "args": [], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": true, // 设置为true可以让外部控制台保持打开状态 "MIMode": "lldb" } ] } ``` 在此配置中,“externalConsole”: true 参数确保了即使调试结束之后,终端窗口也不会立即关闭[^2]。 #### 启动调试会话 可以通过多种方式启动调试过程。一种简单的方法是从命令面板 (`Ctrl+Shift+P`) 输入 “Debug: Start Debugging”,或者直接点击左侧活动栏上的调试图标(通常显示为一个小虫子图标),再按“Run and Debug”按钮[^3]。 完成上述操作后,如果一切正常工作,则应该能够顺利进入断点处,并逐步分析代逻辑。 另外需要注意的是,在某些操作系统上可能遇到默认行为差异;比如有提到过的情况是在 macOS 下可能会弹出系统自带终端而不是集成到内部编辑界面里。这种现象属于预期之内,因为不同平台对于如何处理标准输入/输出流存在区别对待策略。 ### 总结 综上所述,要成功地利用LLDB作为主要引擎来进行项目内的源级追踪验证的话,关键是合理调整好个人专属的工作区设定档——即那个至关重要的JSON档案内容结构设计得当与否将直接影响最终效果呈现形式的好坏程度高低之分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值