【VSCode】作为GDB前端调试目标进程
一般情况下调试都是在本机上直接进行的,即使是调试远程主机也是在VSCode中连接到远程主机进行调试的,这种方法下不存在什么问题。
但是我现在遇到的问题就是我不想将代码放到远程主机上去编译,远程主机性能很拉跨,跑不了,但是本机又是 x86_64 架构的,远程主机是 ARM64 架构的,本机还需要交叉编译才行。
我的想法是在本机上使用交叉编译器编译远程主机的 ARM64 代码,然后将编译后的可执行程序发送过去,再在远程主机上执行 GDB Server,打开对该可执行程序的调试,然后使用 VSCode 连接到远程主机的 GDB Server 上进行调试。
这里为了测试的方便,两个环境都使用的一样的架构。
因为远程主机是在 Linux 环境下的,所有先使用 Docker 创建两个容器用于测试
1
2docker run -itd --name remote_gdb_test --privileged ubuntu:20.04
docker run -itd --name remote_gdb_test_edit --link remote_gdb_test ubuntu:20.04然后使用 VSCode 远程工具连接到 remote_gdb_test_edit 容器并安装插件
- Native Debug
提供 SSH 远程gdb调试支持 - C/C++ Extension Pack
提供 c/c++ 断点调试及自动补全支持
- Native Debug
然后在 remote_gdb_test_edit 中创建 c 语言源文件
main.c
1
2
3
4
5
6
7
int main(void)
{
printf("Hello World\r\n");
return 0;
}使用软件进行编译
1
2apt update -y && apt install -y gcc gdb
gcc main.c -rdynamic -ldl -o main -g生成了个 main 可执行程序,使用命令在 remote_gdb_test_edit 上运行一下看
1
./main
会输出一个
Hello World
然后使用 VSCode 远程工具连接到 remote_gdb_test 中安装依赖
1
2
3
4
5apt update -y && apt install -y gdb openssh-server
/etc/init.d/ssh start
echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
service ssh restart
echo -e "123456\n123456" | passwd root在 remote_gdb_test_edit 的 VSCode 中点击左侧的
运行和调试
按钮,然后点击按钮右侧的创建 launch.json 文件
然后选择
GDB
,文件内容如下1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Debug",
"type": "gdb",
"request": "launch",
"target": "./main",
"remote": true,
"cwd": "${workspaceRoot}",
"valuesFormatting": "parseText",
"ssh": {
"forwardX11": false,
"host": "remote_gdb_test",
"cwd": "/root",
"user": "root",
"password": "123456"
}
}
]
}将 remote_gdb_test_edit 中编译出的
main
以任何方式复制到 remote_gdb_test 的/root
目录下,并赋予权限1
chmod a+x main
在 remote_gdb_test_edit 中的
main.c
文件中的printf("Hello World\r\n");
语句下一个断点,然后点击调试,观察现象,可以发现调试器成功命中该语句
小结
远程调试必须要将编译好的文件复制到远程主机中,不然无法调试
【VSCode】作为GDB前端调试目标进程