macOS 上使用 lldb 和 gdb
# 背景
在尝试调试 JS 引擎的时候,发现需要用到这些工具
其中 v8 用 gdb, JavaScriptCore 用 lldb
macOS 版本: 10.15
先来说说 gdb 的使用吧
# gdb 安装与签名
brew install gdb
gdb -v
# 9.2
1
2
3
2
3
网上有说什么高版本有坑的需要下特定版本的,反正我暂时没遇到
上面安装完后还会输出以下信息(很关键)
gdb requires special privileges to access Mach ports.
You will need to codesign the binary. For instructions, see:
https://sourceware.org/gdb/wiki/BuildingOnDarwin
On 10.12 (Sierra) or later with SIP, you need to run this:
echo "set startup-with-shell off" >> ~/.gdbinit
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
安装完需要进行签名,否则会报类似以下的错误
Starting program: /x/y/foo
Unable to find Mach task port for process-id 28885: (os/kern) failure (0x5).
(please check gdb is codesigned - see taskgated(8))
1
2
3
2
3
网上大部分文章 (opens new window)讲的都是 10.14 之前的做法,按之前的做法还是会签名失败。
可以看上面输出的地址 -- https://sourceware.org/gdb/wiki/BuildingOnDarwin ,里面讲了如何解决这个问题。
sudo killall taskgated
codesign -fs gdb_codesign "$(which gdb)"
1
2
2
# gdb 调试命令
权当记录
list(l) # 查看程序代码
回车 # 表示执行上一条命令
start(s) # 开始执行程序
run(r) #从头开始调试
quit(q) #退出程序
next(n) #单步执行
step(s) #进入函数
backtrace(bt) #查看函数调用栈帧 结果显示: #0 xxx #1 xxx
frame(f) x #选择 x 号栈帧
info(i) locals #查看变量信息
info(i) breakpoints #查看断点信息
info(i) watchpoints #查询观察点
print(p) x #输出变量 x 的值
finish #将程序运行到当前函数返回
continue(c) #将程序运行到结束或者断点处
set var 变量=XX #进行变量赋值
display 变量 #追踪变量值,每次执行(next)都会对追踪变量进行输出显示
undisplay 编号 #取消追踪
break(b) 行号/函数名 <条件语句> #设置断点
delete breakpoints 断点编号 #删除断点,没带断点编号则删除所有断点
disable breakpoints 断点编号 #禁用断点
enable 断点编号 #启用断点
#观察点是当程序访问某个存储单元时中断
watch arr[4] # 访问arr[4] 时中断
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# gdb 调试-实例分析
gcc test.c -g -o test
gdb test
1
2
2
GDB调试工具总结 (opens new window) 这篇文章举了几个例子,并一步步教命令怎么使用,建议阅读,这里就不重复了。
# gdb 与 vscode
利用命令进行调试,对于新手来说有点麻烦,那么用 vscode 来进行调试就是一个不错的选择
需要先安装 c/c++ 插件
启动调试,此时需要一个启动的 json 文件
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "gcc - 生成和调试活动文件",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceRoot}/test",
"args": [],
"stopAtEntry": true,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "lldb",
"preLaunchTask": "build"
}
]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
等价于 gdb test
test 是我们要调试的程序,再执行之前我们需要先编译链接生成它,所以又创了一个任务 build
版本不一样,配置也不一样,根据系统提示的进行创建
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "build",
"type": "shell",
"command": "gcc test.c -g -o test.o"
}
]
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# peda 插件:增强 gdb 的显示
git clone https://github.com/longld/peda.git ~/peda
echo "source ~/peda/peda.py" >> ~/.gdbinit
1
2
2
# lldb 使用
https://lldb.llvm.org/
与 gdb 命令的映射 (opens new window)
# chisel 插件:增强 lldb 的显示
brew install chisel
echo "command script import /usr/local/opt/chisel/libexec/fblldb.py" >> ~/.lldbinit
1
2
2
# 参考文档
编辑 (opens new window)
上次更新: 2024/09/01, 23:56:56