Eclipse搭建linux C/C++ 编辑、调试环境

作者按:作者之前一直是用sourceinsight看代码和编辑代码,但是曾经有前辈说linux下用eclipse平台很不错,这几天闲下来冒着当小白鼠的危险,实践一下看看eclipse怎么样,之后就开始在网上搜索,。。。经过一番查阅后,在ubuntu12.04安装上eclipse程序,摸索的过程是痛苦的,建工程都搞了好久,遇到新鲜事物多试验试验就好了,eclipse的函数提示功能还是很好用的。

http://hi.baidu.com/dudangyimian/item/fe8555c3149fd5bb0d0a7b8e

现在的开源C代码非常多,读代码一般有专用的工具,比如source insight等。但如果要修改代码呢?用eclipse就好了。

  这里讲一下个人使用经验,即用Eclipse阅读、编译、调试test。

一、创建一个空项目

  一个C项目,名称就叫 MyPrj,默认配置

二、为项目添加文件

  将test放入MyPrj文件夹,有好几种导入方式,暂时用这一种,其他的自己慢慢摸索吧

  然后,eclipse中,刷新MyPrj工程(点右键,Refresh),所有的文件都在MyPrj项目中了

三、配置Makefile
  选择:Project->Properties->C/C++Build->Builder Settings
  去掉“Generate Makefiles automatically”的勾选
  Build Directory 选择Makefile所在目录即可,即:

  ${workspace_loc:/MyPrj/test}

  现在,就可以Build Project了。

  其后的调试也很简单,就不讲了,最起码,现在整个工程中没有任何的编译、链接之类的错误。

 

网上搜索,一般是新建空的makefile项目,然后用文件系统导入功能导入代码

实际上:eclipse3.7提供了这一功能:

file-->new-->makefile project with existing code

导入后发现报错:

[plain]  view plain copy
  1. **** Build of configuration Default for project PTAM ****  
  2.   
  3. make all   
  4. make: *** 没有规则可以创建目标“all”。 停止。  
  5.   
  6. **** Build Finished ****  

原因是 找不到目标“all”,注意大小写。

检查Makefile,没有all,添加all目标后

继续编译,搞定。

makefile内容如下:
cc -g -o st main.c -lpthread --static
使用--static选项是为了防止调试时找不到库
四、调试

gdb+gdbserver总体介绍 
远程调试环境由宿主机GDB和目标机调试stub共同构成,两者通过串口或TCP连接。使用 GDB标准程串行协议协同工作,实现对目标机上的系统内核和上层应用的监控和调试功能。调试stub是嵌入式系统中的一段代码,作为宿主机GDB和目标机调试程序间的一个媒介而存在。 
就目前而言,嵌入式Linux系统中,主要有三种远程调试方法,分别适用于不同场合的调试工作:用ROM Monitor调试目标机程序、用KGDB调试系统内核和用gdbserver调试用户空间程序。这三种调试方法的区别主要在于,目标机远程调试stub 的存在形式的不同,而其设计思路和实现方法则是大致相同的。 
而我们最常用的是调试应用程序。就是采用gdb+gdbserver的方式进行调试。在很多情况下,用户需要对一个应用程序进行反复调试,特别是复杂的程序。采用GDB方法调试,由于嵌入式系统资源有限性,一般不能直接在目标系统上进行调试,通常采用gdb+gdbserver的方式进行调试。 
一、配置编译及安装下载 

1. 到http://www.gnu.org/software/gdb下载gdb-6.8.tar.gz到/tmp目录 

2. 解压到/opt目录下 
#cd /opt 
#tar xzvf /tmp/gdb-6.8.tar.gz 

3. 建立配置文件、编译 
gdb允许把编译配置和编译结果放到任意的目录,因此可以在gdb目录之外建立一个专门存放编译结果目录. 
#cd /opt 
#mkdir -p arm-gdb/build 
#cd arm-gdb/build 
#/opt/gdb-6.8/configure --target=arm-linux --prefix=/opt/arm-gdb 
#make 
#make install 

(--target配置gdb的目标平台,--prefixp指定了编译结果的存放位置,也就是安装目录。编译完后可以在/opt/arm-gdb/bin目录下找到可执行的arm-linux -gdb, arm-linux -gdbtui, arm-linux-run。 拷贝arm-linux-gdb 到/usr/bin目录 
#cd /opt/arm-gdb/bin/ 
#cp arm-linux-gdb /usr/bin/ 

4. gdbserver的移植 
gdbserver要用到gdb源码目录下的一些头文件,因此无法在gdb源码目录之外编译文件。 
进入gdb/gdbserver目录: 
[root@dding gdbserver]# pwd 
/opt/gdb-6.8/gdb/gdbserver 
[root@dding gdbserver]# 必须在gdbserver目录下运行配置命令,此时才能用相对路径 
#./configure --target=arm-linux --host=arm-linux 
(--target=arm-linux表示目标平台,--host表示主机端运行的是arm-linux-gdb,不需要配置—prefix,因为gdbserver不在主机端安装运行) 
#make CC=/usr/bin/arm/4.3.2/bin/arm-linux-gcc 
(这一步要指定你自己的arm-linux-gcc的绝对位置,我试过相对的不行,提示make: arm-linux-gcc: Command not found,可好多人都用的相对路径,即直接赋值arm-linux-gcc,可采取make时传递参数,也可以直接修改gdbserver目录下的Makefile文件中的环境变量CC) 

没有错误的话就在gdbserver目录下生成gdbserver可执行文件,注意此时要更改其属性,否则可能会出现无法访问的情况,chmod 777 gdbserver将其更改为任何人都可以读写执行;使用arm-linux-strip命令处理一下gdbserver,将多余的符号信息删除,可让elf文件更精简,通常在应用程序的最后发布时使用;然后把它烧写到flash的根文件系统分区的/usr/bin(在此目录下,系统可以自动找到应用程序,否则必须到gdbserver所在目录下运行之),或通过nfs mount的方式都可以。只要保证gdbserver能在开发板上运行就行。 

二、gdb+gdbserver nfs调试流程 
下面就可以用gdb+gdbserver调试我们开发板上的程序了。在目标板上运行 gdbserver,其实就是在宿主机的minicom下。连接主机和开发板.我选择了串口线和网线连接起了主机和开发板连接好电源,串口线,网线,打开串口终端. 
通过NFS启动系统后,在开发板终端输入 
# mount -t nfs -oonolock192.168.50.72:/opt/FriendlyARM/mini2440/root_qtopia  /mnt/ 
hello程序放在root_qtopia  下面.hello为要调试的程序(必须-g加入调试信息)。 
# arm-linux-gcc -g -o hello hello.c 

要进行gdb调试,首先要在目标系统上启动gdbserver服务。在gdbserver所在目录下输入命令: 
#cd /mnt/ 
#gdbserver 192.168.50.72:2345 hello 

192.168.50.72为宿主机IP,在目标系统的2345端口(你也可以设其他可用的值,当然必须跟主机的gdb一致)开启了一个调试进程,hello为要调试的程序(必须-g加入调试信息)。 
出现提示: 

Process /mnt/hello created: pid=80 
Listening on port 2345 
(另一个终端下) 
#cd /opt/FriendlyARM/mini2440/root_qtopia  
#arm-linux-gdb hello 
最后一行显示:This GDB was configured as “--host=i686-pc-linux-gnu,--target=arm-linux”...,如果不一致说明arm-linux-gdb有问题 
说明此gdb在X86的Host上运行,但是调试目标是ARM代码。 
(gdb) target remote 192.168.50.168:2345 
(192.168.50.168为开发板IP) 

Remote debugging using 192.168.50.168:2345 
[New thread 80] 
[Switching to thread 80] 
0x40002a90 in ??() 
同时在minicom下提示: 
Remote debugging from host 192.168.50.72(gdb) 

注意:你的端口号必须与gdbserver开启的端口号一致,这样才能进行通信。建立链接后,就可以进行调试了。调试在Host端,跟gdb调试方法相同。注意的是要用“c”来执行命令,不能用“r”。因为程序已经在Target Board上面由gdbserver启动了。结果输出是在Target Board端,用超级终端查看。连接成功,这时候就可以输入各种GDB命令如list、run、next、step、break等进行程序调试了。 

建立连接后进行gdb远程调试和gdb本地调试方法相同

eclipse debug (调试) 学习心得 进入debug模式: 1、设置断点 2、启动servers端的debug模式 3、运行程序,在后台遇到断点时,进入debug调试状态 ============================= 作用域 功能 快捷键 
全局 单步返回 F7 
全局 单步跳过 F6 
全局 单步跳入 F5 
全局 单步跳入选择 Ctrl+F5 
全局 调试上次启动 F11 
全局 继续 F8 
全局 使用过滤器单步执行 Shift+F5 
全局 添加/去除断点 Ctrl+Shift+B 
全局 显示 Ctrl+D 
全局 运行上次启动 Ctrl+F11 
全局 运行至行 Ctrl+R 
全局 执行 Ctrl+U 
============================= 1.Step Into (also F5) 跳入
2.Step Over (also F6) 跳过
3.Step Return (also F7) 执行完当前method,然后return跳出此method
4.step Filter 逐步过滤 一直执行直到遇到未经过滤的位置或断点(设置Filter:window-preferences-java-Debug-step Filtering)
5.resume 重新开始执行debug,一直运行直到遇到breakpoint。
    例如 :A和B两个断点,debug过程中发现A断点已经无用,去除A断点,运行resume就会跳过A直接到达B断点。
6.hit count 设置执行次数 适合程序中的for循环(设置 breakpoint view-右键hit count)
7.inspect 检查 运算。执行一个表达式显示执行值
8.watch 实时地监视对象、方法或变量的变化 9.我们常说的断点(breakpoints)是指line breakpoints,除了line breakpoints,还有其他的断点类型:field(watchpoint)breakpoint,method breakpoint ,exception breakpoint.
10.field breakpoint 也叫watchpoint(监视点) 当成员变量被读取或修改时暂挂
11.添加method breakpoint 进入/离开此方法时暂挂(Run-method breakpoint)
12.添加Exception breakpoint 捕抓到Execption时暂挂(待续...)
断点属性:
   1.hit count 执行多少次数后暂挂 用于循环
   2.enable condition 遇到符合你输入条件(为ture\改变时)就暂挂
   3.suspend thread 多线程时暂挂此线程
   4.suspend VM 暂挂虚拟机 13.variables 视图里的变量可以改变变量值,在variables 视图选择变量点击右键--change value.一次来进行快速调试。
14.debug 过程中修改了某些code后--〉save&build-->resume-->重新暂挂于断点 15.resume 当debug调试跑出异常时,运行resume,重新从断点开始调试
16.如果一行有很多方法,
当第一次按F5键就跳入这一行第一个方法,F6一步一步调试,F7跳出这方法.
当第二次按F5键就跳入这一行第二个方法,F6一步一步调试,F7跳出这方法.
以此类推.想进入这一行第几个方法,就按几次F5和F7.


以上诸多内容多引用自网络,感谢网络,感谢原作者。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值