GDB 调试小结

来源:互联网 发布:linux ddos攻击脚本 编辑:程序博客网 时间:2024/06/06 14:16

关于gdb调试和make(makefile)自动编译

一、Linux中gdb那不可缺少的工具
作为一个程序员,最怕出现的就是bug,特别是刚踏入这一行的新手来说更是致命的伤,话又说回来,同一个程序猿对不同bug的恐惧程度也是不同的,我个人觉得出现bug不可怕,可怕是的程序能运行,但是运行结果出乎你的预料,这时候你就 需要一个得心应手的“武器”来帮你解决这个问题,没错 就是 gdb
因为 刚学习使用,接触的指令难免会不全,所以大牛们就当看了个笑话吧!
1、 要使用gdb首先需要源码可以编译成功,在gcc时应该加参数-g用以生成可调式的执行文件
2、开始调试(假设生成的可调试文件是a.out) gdb a.out
start—开始指令
step—单步运行(遇到函数时候进入函数)
next—也是单步运行(遇到函数调用时不会进入函数)
stop—暂停调试(注意,只是暂停调试,没有结束)
list—查看当前文件的源码,便于设置断点
break—设置断点
break file.c:linenum—在某一个要调试的文件中的某一行添加断点
break add—在某一个功能功能函数前设置断点
info break—查看已经设置的断点
delete break—删除添加的断点 (eg:delete break 1 删除添加的1号断点)
注意:程序中可以设置任意多个断点,在运行到每一个断点的时候都会停止运行
continue—继续运行程序直到结束,当有错误时会有报告返回
print—输出变量的值(eg:print VarName)
watch—可用于观察一个变量的值得变化 ,当所观察的变量的值发生改变的时候,程序就会停止运行,并打印新旧值(eg:watch VarName当VarName的值发生改变时,程序就会停止运行,并打印新旧值)
display—用于设置自动显示(display VarName 自动显VarName的变化,即走一步打印一下设置的变量的值)
delete display—用于删除自动显示(delete display VarName)
ptype—查看结构体的定义(类型)(eg:ptype VarName 注意:这个VarName是结构体变量)
finish—单步调试的时候,可以使用finish执行到函数结束
until—单步调试的时候,可以使用until执行到循环结束

二、make(makefile)可以自动帮助你自动编译的好工具
make工具提供了帮助程序猿自动进行编译的功能
make依赖于一个配置文件:makefile
makefile文件描述了整个工程的编译、链接规则其中包括 :
1)工程中那些源文件需要编译及如何编译
2)需要创建那些库文件以及如何创建这些库文件
3)如何产生期望得到的最终可执行文件。
make根据makefile文件指定的规则编译工程,其优点在于:
1)自动化编译,节约时间,降低出错率;
2)自动识别哪些文件需要重新编译,缩短编译时间
makefile的是由一系列的Rule(描述规则)组成,Rule的基本语法如下:
target:prerequisites …
recipe
prerequisites
recipe
…….
clean:
rm *.o
其中,target是目标,也就是我们最终想要的文件;prerequisites是生成target需要的前提(也就是依赖文件),但是prerequisites在第二句(黑体加粗的部分)也是作为目标文件,因为它是为了实现最终目标而必须的中间过程文件名。
任意的shell命令或者是可在shell下执行的程序都可以作为recipe,可以有多个recipe,每个占一行,也可以在同一行(使用;隔开);
强调一点,在每一个recipe(规则,也就是本来要在屏幕上输入的命令)必须以tab开头
还有一种是伪目标 ,它没有依赖文件,只是一个make执行动作的名称,比如clean(清理.o文件的一个指令)。
eg:

targetname:main.o func1.o func2.o    gcc main.o func1.o func2.o -o targetnamemain.o:main.c    gcc -c main.cfunc1.o:func1.c    gcc -c func1.cfunc2.o:func2.c    gcc -c func2.cclean:    rm *.o

以上代码是最原始最笨的,现在还有一些简化的方法,那就是设置变量

Makefile中可以定义变量
变量定义格式:varName = varValue1
引用该变量$(varName)
举例:objectc = main.o func1.o func2.o
objecto = main.c func1.c func2.c
那么代码可以简写成这样:
target:$(objecto)
gcc $(objecto) -o target
$(objecto):$(objectc)
gcc -c $(objectc)
clean:
rm .m

当大家写好makefile后只需在命令行中make回车就可以了,make缺省读取当前目录下的Makefile进行处理
使用make –f 可以指定专门的Makefile文件
Make处理规则的基本思路
先检查文件是否存在
如果存在再检查文件是否最新
Make会将规则的依赖有当成一个目标
递归检查/更新
所以,如果在本目录下面就恰好有一个和clean同名的就不会执行下面的rm语句了,这里我们为了解决这个问题使用: .PHONY 指定target是一个纯粹的伪目标,避免了同名无法执行的问题

在makefile中
@符号作用 :
不显示命令本身,仅显示命令的执行结果
-符号的作用是: 忽略命令执行产生的错误

这只是简单的基础写法,在make中还有很多重要的隐含规则会另makefile的写法更简单,以后理解了会继续完善,谢谢大家的阅读。

0 0