linux环境下gcc与gdb的基本用法

通常所说的GCC是GUN Compiler Collection的简称,除了编译程序之外,它还含其他相关工具,所以它能把易于人类使用的高级语言编写的源代码构建成计算机能够直接执行的二进制代码。GCC是Linux平台下最常用的编译程序,它是Linux平台编译器的事实标准。同时,在Linux平台下的嵌入式开发领域,GCC也是用得最普遍的一种编译器。GCC之所以被广泛采用,是因为它能支持各种不同的目标体系结构。例如,它既支持基于宿主的开发(简单讲就是要为某平台编译程序,就在该平台上编译),也支持交叉编译(即在A平台上编译的程序是供平台B使用的)。目前,GCC支持的体系结构有四十余种,常见的有X86系列、Arm、PowerPC等。同时,GCC还能运行在不同的操作系统上,如Linux、Solaris、Windows等。

1. gcc的编译过程

预处理(pre-processing)E:插入头文件,替换宏
编译(Compiling)S:编译成汇编
汇编(Assembling) c:编译成目标文件
链接 (Linking):链接到库中,变成可执行文件
gcc -E hello.c -o hello.i

gcc -S hello.i –o hello.s

gcc –c hello.s –o hello.o

gcc hello.s –o hello 链接,生成可执行文件
./hello: 运行

也可以一次性完成:
gcc hello.c –o hello或
gcc -c -o hello hello.c

2. gcc或g++常用选项

选项名称作用
-c只激活预处理、编译和汇编,生成扩展名为.o的目标文件
-S只激活预处理和编译,生成扩展名为.s的汇编代码文件
-E只激活预处理,并将结果输出至标准输出
-g为调试程序(如gdb)生成相关信息
-Onumnum=1,2,3 gcc或g++提供3个级别的优化选项:-O1、-O2、-O3,优化程度越高意味着更大的风险,通常用-O2优化选项

3. 调试:gdb

gdb是GUN发布的一个强大的程序调试工具,也是程序员不可或缺的一大利器,相比较图形的IDE调试器,gdb在某些细节上展现出令人羡慕的灵活性,它具有比图形化调速器所具备的强大特性,下面我将以实例开头,最后给出gdb常用的命令表,如果要了解跟详细的命令选项可参考gdb手册。

3.1 启动gdb

使用gdb调试C/C++程序之前,需要使用命令生成带有调试信息的可执行程序。否则调试时你将看到一大堆汇编代码

gcc -g rearrang.c -o rearrang.out

使用该命令后就可以利用gdb命令对生成的二进制文件rearrang.out进行调试。

gdb rearrang.out     			##启动gdb调试 rearrang.out 
GNU gdb (GDB) Red Hat Enterprise Linux (7.2-56.el6)
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/pointers on c/Chapter 1/rearrang/rearrang.out...done.
(gdb) 

gdb首先会在屏幕上打印一些关于它自己的一些版本信息,随后显示提示符“(gdb)”等待接受用户的指令

3.2 获取帮助

接下来用户可以输入命令选项调试程序了,可能对于不是很熟悉或者忘记的命令需要提供帮助信息,此时可以使用help命令查看帮助信息。

(gdb) help
List of classes of commands:

aliases -- Aliases of other commands
breakpoints -- Making program stop at certain points
data -- Examining data
files -- Specifying and examining files
internals -- Maintenance commands
obscure -- Obscure features
running -- Running the program
stack -- Examining the stack
status -- Status inquiries
support -- Support facilities
tracepoints -- Tracing of program execution without stopping the program
user-defined -- User-defined commands

Type "help" followed by a class name for a list of commands in that class.
Type "help all" for the list of all commands.
---Type <return> to continue, or q <return> to quit---

同时可以使用命令help breakpoints得到和断点有关的帮助信息,使用hlep break 得到break命令的详细帮助。
gdb支持命令补全,输入命令的前几个字母,然后按Tab键,gdb会帮助补全该命令;如果用户提供的首字母不足以唯一确定一个命令,那么连续两次Tab键可以获得所符合要求的命令列表;gdb还支持命令的缩写形式,例如使用h就可以替代help。

3.3 查看源代码

list命令(缩写为l)用于查看程序代码

(gdb) list   				##列出源代码
(gdb) list 18			##列出第18行附近的源代码
13	#define MAX_CILS 20 
14	#define MAX_INPUT 1000  
16	int read_column_numbers(int columns[],int max);
17	void rearrange(char *ouput,char const *input,int n_colums,int const columns[]);
18	
19	int main()
20	{
21		int n_columns;
22		int columns[MAX_CILS];

gdb还提供search命令搜索特定的内容

(gdb) search void rearrange
55	void rearrange(char * output, char const * input, int n_colums, int const columns [ ])

再次执行该命令时

(gdb) search void rearrange
Expression not found

显然,在55行以后就没有void rearrange这个字符串了。
需要注意search只能向前(朝向文件尾)搜索,可以使用reverse-search向后(朝向文件头)搜索。

3.4 设置断点

break命令(缩写为b)用于设置断点,这个命令接收行号或者函数名作为参数。

(gdb) break 10					##在第10行设置断点
Breakpoint 1 at 0x8048540: file rearrang.c, line 10.
(gdb) break rearrange				##在rearrange()函数入口设置断点
Breakpoint 2 at 0x8048660: file rearrang.c, line 62.

上述的命令设置了两个断点后程序运行到第10行及rearrange()函数入口处就会停下来,等待用户发指令。使用info break可以查看已经设置的断点信息。

(gdb) info break
Num     Type           Disp Enb Address    What
1       breakpoint     keep y   0x08048540 in main at rearrang.c:10
2       breakpoint     keep y   0x08048660 in rearrange at rearrang.c:62

3.5 运行程序和单步执行

设置断点后开始执行程序,使用run命令(缩写为r)运行程序至断点

(gdb) run
Starting program: /home/pointers on c/Chapter 1/rearrang/rearrang.out 

Breakpoint 1, main () at rearrang.c:25
25		n_columns = read_column_numbers(columns,MAX_CILS);
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.80.el6.i686

此后使用next命令(缩写为n)单步执行程序

(gdb) next
26		while(gets(input) !=NULL){

可以指定一个数字。下面指令让gdb连续执行两行,然后停下

(gdb) n 2
Original input: 
28			rearrange(output,input,n_columns,columns);

使用continue命令继续运行到下一个断点

(gdb) continue 
Continuing.

Breakpoint 2, rearrange (output=0xbfffed5c "", input=0xbffff144 "", n_colums=0, 
    columns=0xbffff52c) at rearrang.c:62
62		output_col = 0;

另外一个单步执行命令step(缩写为s)。step与next的最大区别:step会在遇到函数调用的时候进入函数内部;而next只是“规矩”地执行这条函数调用语句。

3.6 监控变量

使用print命令(缩写为p)要求gdb提供指定变量的值

(gdb) print output_col   			##打印变量output_col的值
$1 = 1865696
(gdb) n						##单步执行
63	
(gdb) n						##再次单步执行
66			int nchars = columns[col + 1]-columns[col] +1;
(gdb) print output_col			##打印变量output_col的值
$2 = 0
(gdb) 

使用watch 命令,用于设置观察点,watch接受变量名(或者表达式)作为参数,一旦参数的值发生变化,就停下来程序。

(gdb) watch sum   						##将变量sum设置为观察点
Hardware watchpoint 2:sum
(gdb) c 								##继续执行程序
Continuing.							##gdb捕捉到sum值的变化
Hardware watchpoint 2:sum

Old value = 15   						##显示当前sum的值
New value = 21						##当前sum的值
summary (n=450) at summary.c:25 		##产生变化的位置
25		for(i =1;i<=n;i++) {

3.7 临时修改变量

gdb允许用户在程序运行时改变变量的值,通过set var命令实现这一点。

(gdb) print output_col							##显示变量i的值
$2 = 0
(gdb) set var output_col=1						##修改output_col的值为1
(gdb) print output_col							##显示变量output_col的值
$3 = 1

3.8 查看堆栈情况

每次程序调用一个函数,函数的地址、参数、函数内的局部变量都会被压入“栈”(Stack)中,运行时堆栈对的信息对于程序员非常重要。

(gdb) bt
#0  rearrange (output=0xbfffed5c "", input=0xbffff144 "", n_colums=0, 
    columns=0xbffff52c) at rearrang.c:66
#1  0x080485a5 in main () at rearrang.c:28

3.9 退出gdb

调试完毕,使用quit命令(缩写为q)退出gdb程序。

3.10 基本命令汇总

gdb命令缩写描述
helph获取帮助信息
listl显示源代码
search向前(朝向文件尾)搜索源代码
reverse-search向后(朝向文件头)搜索源代码
breakb设置断点
info break查看断点信息
clear清除当前所在行的断点
runr从头运行程序至第一个断点
nextn单步执行(不进入函数体)
steps单步执行(进入函数体)
continuec从当前行继续运行程序至下一个断点
printp打印变量的值
watch设置观察点
set var variable=value设置变量variable的值为value
bt查看运行时栈
quitq退出gdb

待续!!!!!!

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值