EclipseCDT远程交叉编译远程单步调试基于makefile例程(实测有效)

news2024/12/27 12:57:21

文章目录

  • 前言:
  • 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的情况,暂未解决。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/591451.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pycharm内置Git操作失败的原因

文章目录 问题简介解决方案DNS缓存机制知识的自我理解 问题简介 最近在pycharm中进行代码改动递交的时候&#xff0c;总是出现了连接超时或者推送被rejected的情况&#xff0c;本以为是开了代理导致的&#xff0c;但是关闭后还是推送失败&#xff0c;于是上网查了以后&#xf…

查看MySQL服务器是否启用了SSL连接,并且查看ssl证书是否存在

文章目录 一、查看MySQL服务器是否启用了SSL连接 1.登录MySQL服务器 2.查看SSL配置 二、查看证书是否存在 前言 查看MySQL服务器是否启用了SSL连接&#xff0c;并且查看ssl证书是否存在 一、查看MySQL服务器是否启用了SSL连接 1.登录MySQL服务器 在Linux终端中&#xf…

【Windows驱动篇】解决Windows驱动更新导致AMD Software软件无法正常启动问题

【Windows驱动篇】解决Windows驱动更新导致AMD Software软件无法正常启动问题 【操作前先备份好电脑数据&#xff01;&#xff01;&#xff01;设置系统还原点等&#xff0c;防止系统出现问题&#xff01;&#xff01;&#xff01;谨慎请操作&#xff01;】 【操作前先备份好…

Windows本地提权 · 上篇

目录 at 命令提权 sc 命令提权 ps 命令提权 利用的是windows的特性&#xff0c;权限继承&#xff0c;命令或者服务创建调用的时候会以system权限调用&#xff0c;那么这个命令或者服务的权限也是system。 进程迁移注入提权 pinjector进程注入 MSF进程注入 令牌窃取提权…

chatgpt赋能python:Python中日期转换:从字符串到日期对象

Python中日期转换&#xff1a;从字符串到日期对象 作为一个经验丰富的Python工程师&#xff0c;日期转换在我的日常编码工作中经常遇到。Python提供了一些内置函数和模块&#xff0c;可以将字符串转换为日期对象或将日期对象格式化为特定的字符串。本篇文章将带您深入了解Pyth…

chatgpt赋能python:Python中的并运算:介绍及应用

Python中的并运算&#xff1a;介绍及应用 Python是一种功能强大且易于使用的编程语言&#xff0c;它的灵活性使得我们可以应用各种算法和数据结构进行处理。其中&#xff0c;位运算是Python中非常棒的特性之一&#xff0c;而其中又有一个重要的运算符——并运算。 什么是并运…

chatgpt赋能python:Python中的或运算:学习这个重要概念

Python中的或运算&#xff1a;学习这个重要概念 或运算是Python编程语言中一个重要的概念。了解如何使用或运算可以帮助程序员编写更有效和有意义的代码。在此文章中&#xff0c;我们将介绍Python中或运算的基础知识以及如何使用它来编写各种类型的代码。 什么是或运算&#…

Android笔记--内存管理

内存(Memory)是计算机的重要部件&#xff0c;也称主存储器&#xff0c;它用于暂时存放CPU中的运算数据&#xff0c;以及与硬盘等外部存储器交换的数据。Android中&#xff0c;内存是如何分配的&#xff1f;当启动一个android程序时&#xff0c;会启动一个dalvik vm进程&#xf…

linux条件变量知识点总结

与条件变量相关API 条件变量是线程另一可用的同步机制。条件变量给多个线程提供了一个会合的场所。条件变量与互斥量一起使用时&#xff0c;允许线程以无竞争的方式等待特定的条件发生。 条件本身是由互斥量保护的。线程在改变条件状态前必须首先锁住互斥量&#xff0c;其他线程…

chatgpt赋能python:Python中的“5“+“5“:了解运算符重载和字符串拼接

Python中的 “5”“5”: 了解运算符重载和字符串拼接 Python中的运算符重载允许我们自定义类型的操作符行为。当我们使用加号运算符将两个对象相加时&#xff0c;Python会动态地确定该使用哪种类型的操作符行为。在使用字符串时&#xff0c;加号可以用于字符串的连接&#xff…

【编译、链接、装载二】/lib/ld64.so.1: bad ELF interpreter: 没有那个文件或目录

【编译和链接二】bash: ./test.out: /lib/ld64.so.1: bad ELF interpreter: 没有那个文件或目录 一、问题起因二、ldd查看三、解决方案一&#xff1a;使用gcc链接四、查找其他解决方案五、解决方案二&#xff1a;软链接 bash: ./test.out: /lib/ld64.so.1: bad ELF interpreter…

SpringBoot框架总结

一、SpringBoot框架的概念 1、传统框架的弊端 例如传统的SSM框架整合了MyBatis、Spring、SpringMVC框架&#xff0c;但其需要繁琐且重复的配置使程序员很是痛苦 2、SpringBoot框架 SpringBoot框架在传统框架的基础上对其进一步封装&#xff0c;只需要一些简单的配置&#x…

MySQL第二章、数据库基础

回顾&#xff1a; 目录 一、数据库的操作 1.1创建数据库 1.2显示当前数据库 1.3使用数据库 1.4删除数据库 二、常用数据类型 2.1数值类型&#xff08;分为整型和浮点型&#xff09; 2.2字符串类型 2.3 日期类型 三、表的操作 ​编辑 3.1创建表 3.2查看表结构 ​编…

网络攻防技术--论文阅读--《基于自动数据分割和注意力LSTM-CNN的准周期时间序列异常检测》

英文题目&#xff1a;Anomaly Detection in Quasi-Periodic Time Series based on Automatic Data Segmentation and Attentional LSTM-CNN 论文地址&#xff1a;Anomaly Detection in Quasi-Periodic Time Series Based on Automatic Data Segmentation and Attentional LST…

chatgpt赋能python:Python中清空代码的几种方法

Python中清空代码的几种方法 在Python编程中&#xff0c;清空代码是一个很常见的需求。清空代码指的是在某些情况下&#xff0c;需要将已经定义的变量或内存中存储的对象清除&#xff0c;以便后续使用。在本文中&#xff0c;我们将介绍Python中常用的几种清空代码的方法。 方…

chatgpt赋能python:Python中等待几秒代码:让你的程序更高效

Python中等待几秒代码&#xff1a;让你的程序更高效 在编写Python程序时&#xff0c;有时我们需要让程序等待几秒钟之后再继续执行。这个操作非常常见&#xff0c;尤其是在需要与API接口交互的时候。在本文中&#xff0c;我们将会介绍Python语言中等待几秒的相关知识&#xff…

如何使用Kali进行信息收集?

渗透测试即模拟黑客入侵的手段对目标网络进修安全测试&#xff0c;从而发现目标网络的漏洞&#xff0c;对目标网络进行安全加固与漏洞修复。 Kali 是一个基于 debian 的渗透测试平台&#xff0c;其中集成了很多常见的和不常见的渗透测试工具&#xff0c;如下图&#xff1a; 工…

linux(SystemV标准)进程间通信1

目录&#xff1a; 1.前言 2.共享内存 3.认识接口 ------------------------------------------------------------------------------------------------------------------------- 1.前言 我们之前学的什么匿名管道、命名管道通信都是基于文件的通信方式&#xff01;&#xf…

chatgpt赋能python:Python中的%怎么用

Python中的%怎么用 Python中的%是一个非常重要的运算符&#xff0c;也称为格式化运算符。它用于将一个值插入到另一个字符串中。在本文中&#xff0c;我们将深入了解Python中的%运算符的使用。 %运算符的语法 先看下%运算符的语法&#xff1a; string % values其中&#xf…

求图的最短路径长度的弗洛伊德(Floyd)算法

弗洛伊德算法的适用情况&#xff1a;弗洛伊德算法既可以用来求解有向网的最短路径长度&#xff0c;也可以用来求无向网的最短路径长度&#xff0c;但是对于图中出现负权环的情况&#xff0c;弗洛伊德无法的得到正确的答案 弗洛伊德的算法思想&#xff1a; 以此图为例讲解弗洛…