文章目录
- 前言:
- 1. 新建工程
- 2. 远程编译环境配置
- 2.1 下载sshfs并挂载目录
- 2.2 Debug配置
- 2.3安装EclipseCDT的远程插件
- 2.4 拷贝gdbserver
- 3. 调试
- 总结:
前言:
之前写过一篇VSCode远程调试linux,当时是把程序以及代码通过远程的方式,在从机上进行GCC编译,主机上远程GDB调试。这有个弊端就是从机里面会有源代码,同时从机还需要支持GCC和GDB。
后面进一步拓展,VSCoede通过从机的交叉编译链远程编译,把生成的程序放到从机上运行,但是并没有实现远程调试,要想远程调试还得从机编译,这个问题目前还未解决。后面考虑出个博客解决一下VScode远程调试的这个问题,当然了这篇博客其实解决了远程调试的这个问题,只不过是换了个平台。
1. 新建工程
这个新建工程,跟着走一轮就可以了,有工程的话就直接跳过这个章节。
step1:File->New->C Project
step2:输入项目名称,选择makefileproject项目,工具链选otherToolchain->Finish
step3:右键项目->New->Source File
step4:按照如下图配置创建源文件
step5:右键hello工程->New->File
step6: 选择hello工程,创建名为makefile的文件。
step7:粘贴测试代码和makefile规则
hello.c
源码
#include<stdio.h>
int main()
{
printf("hello1\n");
printf("edwinwzy\n");
printf("chengchei\n");
printf("hello2\n");
return 0;
}
makefile规则
注意修改自己的路径
#这里是自己的GCC路径
gcc_path = /opt/Xilinx/SDK/2015.4/gnu/arm/lin/bin/
#这里是GCC路径下的GCC编译器
CC = $(gcc_path)arm-xilinx-linux-gnueabi-gcc
#生成的可执行文件的文件名
execName = hello
all:
#要单步调试的话这里一定要加 -g 选项
$(CC) -g hello.c -o $(execName)
#生成的文件移动到这个目录下
mv -f $(execName) /home/alinx/remote
clean:
rm $(execName) *.o *~
最终效果图:
2. 远程编译环境配置
因为我们的文件要放到从机上,所以我们需要把从机内我们需要使用的目录挂载到主机上,在主机上对挂载的目录进行操作等效于对远程目录操作,有点类似于共享目录。
只有这样EclipseCDT中才可以指定调试程序为远程从机上的可执行文件。
看了几个这个作用的插件,最终找到一个简单又好用的插件sshfs。
2.1 下载sshfs并挂载目录
在控制台输入sudo apt install sshfs
后面输入y即可安装
安装完成后进行挂载
正常的sshfs的命令是 sudo sshfs 用户名@IP地址: 从机要被挂载的目录 挂载到主机的目录位置
这样写没问题,但是我遇到了一个无法打开什么的问题,后面排查到是权限问题,所以需要相关参数。
我这里使用的命令是:
sudo sshfs -o allow_other root@192.168.1.172:/home/ /home/alinx/remote/
这个命令里面的的参数就解决了权限问题,后面的主机挂载目录对应的文件最好是空的,
至于为什么可以参考我的博客:文件系统挂载
输入完成后,还需要输入密码,就是你ssh远程登录从机用户的密码。
2.2 Debug配置
step1:右键工程->DebugAs->DebugConfigurations
step2:新建debug配置
step3:配置Debugger
2.3安装EclipseCDT的远程插件
搜索这个安装,这个插件支持远程调试。
右下角有个进度条,满了以后会弹出小窗口,选择信任
选择Restart Now
重启后Eclipse后,如果右上角没有remote的图标,则右上角点击Open Perspective
最好把Debug也点上,这样后面方便切换视图。
点击Remote System Explore
模式的视图,左侧一栏,右键Local位置,选择新建Connection
选择SSH Only
再点next
按自己需要配置后,选择Finish
此时界面的左边会出现刚创建的配置信息,
右键Ssh Shells,选择Launch Shell
这里User ID就是你登录从机的用户名,下面就是对应的密码。
配置完成后中间会出现Remote Shell
的小窗口,验证账户名和密码正确后就会进入ssh界面。
2.4 拷贝gdbserver
找到自己交叉编译工具链中对应的gdbserver
,把它直接复制粘贴到从机系统文件的/usr/bin/
目录下即可。
一般gdbserver和刚才交叉编译链的gcc在同一个文件夹下。
对了,别忘了给权限,用sduo chmod 777 xxx-xxx-gdbserver
,xxx表示你交叉编译链中gdbserver的前缀,根据实际情况改变。
如何拷贝呢?那就用对应的一些软件直接远程传输数据呗,比如WinSCP。
当然,如果从机支持图形化操作,那就直接U盘传输。
再万能一些就用一些集成SSH,FTP传输的这种协议进行传输。比如:SecureCRT
当然,刚才提到的sshfs挂载,用类似于共享文件的方式也可以传输。
方法很多,因人而异,我只写这么多。
3. 调试
因为刚才在配置Debug的时候选择了自动生成:Enable auto to build
,所以我们的文件其实是先生成再开启调试。
单击debug小虫子旁边的下拉按钮,选择刚才配置好的debug配置。
这时候右下角大概会卡在百分之96,因为从机没有开启gdbserver服务
打开Remote Shell视图
远程连接上以后,在输入栏输入gdbserver 192.168.1.102:1234 /home/hello
,注意:这个内容要修改
解释一下字段含义:gdbserver 主机IP:端口号 调试程序所在目录
,这里根据自己的主从机进行修改。
接着界面会自动跳转到hello.c的main函数的第一句话停住,后面就可以单步调试了,而且代码也能一一对应。
总结:
这一套配置流程刚开始弄的时候整体下来比较费时间,但是作用还是非常大的。
目前远程调试还存在的问题是,我用makefile编写中型工程的时候,对cpp文件生成中间文件.o
文件之后,再把所有的.o
中间文件集合生成一个目标文件。虽然编译的时候使用了-g
选项,但是还是出现了无法定位到源文件即.cpp
的情况,暂未解决。