跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

如何使用LLDB调试器替代GDB? (常用命令对比)

LLDB启动需显式加载目标或用--分隔参数,传参必须用--;断点设置更严格,条件断点语法不同;寄存器需用reg read而非p/x $rax;内存查看用memory read;STL容器需加载libcxx插件;线程控制命令命名不同且默认行为有异。 lldb 启动和加载目标程序时要注意什么 LLDB 不像 GDB 那样默认支持
gdb ./a.out
这种直接带路径启动的方式。你必须显式用
file
命令加载二进制,或在启动时用
--
分隔参数。 正确方式一(推荐):
lldb ./my_program
正确方式二:
lldb (lldb) file ./my_program
错误方式:
lldb ./my_program -- -arg1 -arg2
—— 这会把
-arg1
当作 lldb 子命令解析,报错
error: unrecognized option '-arg1'
传参必须用
--
显式分隔:
lldb ./my_program -- -arg1 -arg2
如果程序依赖动态库路径,记得提前设置
target.exec-search-paths
或用
dyld_library_path
环境变量 ( mac OS),否则
run
时可能报
Library not loaded
断点设置和管理的差异在哪 GDB 的
break main
在 LLDB 里基本可用,但底层机制不同:LLDB 默认按符号名解析,不自动 fallback 到地址;且函数重载、模板实例化时行为更严格。
breakpoint set -n main
和
b main
等价,但后者是别名,不是所有版本都启用(可通过
settings set plugin.jit-loader.gdb-compat true
启用部分兼容) 按行号设断点:
b source.cpp:42
(GDB 是
b 42
),注意路径需匹配 debug info 中记录的绝对路径 条件断点写法不同:
breakpoint set -n foo -c 'x > 10'
(GDB 是
b foo if x > 10
) 禁用/启用断点用
disable 1
/
enable 1
,不是
disable breakpoint 1
;编号查看用
breakpoint list
(GDB 是
info breakpoints
) 临时断点不存在原生命令,得用
breakpoint set -o -n foo
(
-o
表示 one-shot) 查看变量和内存时容易出错的操作 LLDB 的
print
默认调用表达式解析器(Clang-based),支持 C++11+ 语法,但也因此对未求值表达式更敏感;GDB 的
print
更“宽容”,有时会静默失败。 Trae win Trae Windows 官方版本现已全面支持 Win10 和 Win11 系统(64位)。国内开发者可直接访问 Trae 中文官网(trae.cn 或 trae.com.cn),一键下载官方正版 .exe 安装包,享受国内直连的高速稳定体验。安装过程极其简便,双击即可运行,并支持一键无缝导入 VS Code 或 Cursor 的原有主题、快捷键及插件配置。登录支持手机号、微信或稀土掘金账号。内置免费的豆包与 DeepSeek 等顶级大模型,让你开箱即用,轻松开启高效的 AI 智能编程之旅。 下载
p/x $rax
在 LLDB 中无效 —— 寄存器要加
$
,但必须用
register read rax
或
reg r rax
;
p/x $rax
会报错
use of undeclared identifier '$rax'
查看内存用
memory read -f x -c 10 0x1000
(GDB 是
x/10x 0x1000
),缩写为
mem r -fxw 0x1000
(
w
表示 word ,4 字节 ) 打印 STL 容器(如
std::vector
)需加载
libcxx
插件,否则只显示原始字段;运行
command script import /Applications/Xcode.app/Contents/SharedFrameworks/LLDB.framework/Resources/Python/lldb/formatters/cpp/libcxx.py
后再
p vec
frame variable
(简写
fr v
)比
p
更安全:它只读取当前栈帧中已知变量,不触发表达式求值,适合调试崩溃后变量 作用域 失效的场景 线程和进程控制命令怎么对应 LLDB 的线程模型更贴近 Dar win 内核抽象,多线程调试时默认只显示当前线程状态;GDB 则倾向于汇总所有线程信息。 查看线程列表:
thread list
(GDB 是
info threads
),当前线程前有
*
标记 切换线程:
thread select 2
(GDB 是
thread 2
) 单步进入函数:
thread step-in
(
step
或
s
),但若符号缺失,LLDB 默认不会跨汇编指令步进,需加
-a
强制:
s -a
(GDB 的
stepi
对应
thread step-inst
) 继续所有线程:
process continue
(
c
或
continue
),但注意:LLDB 默认不暂停其他线程,GDB 默认会(可通过
set scheduler-locking on
模拟) 杀掉进程:
process kill
(GDB 是
kill
),之后需重新
run
,不能复用旧进程上下文 LLDB 的表达式求值深度绑定 Clang,遇到模板特化、内联函数或未导出符号时,
p
很可能静默失败或返回
couldn't get the value
;这时候别硬试,先用
fr v -R
(带类型和地址)确认变量是否真在栈上,再决定是否切到寄存器或内存视角。

相关文章