您的位置:首页 > 运维架构 > Linux

Linux下调试器GDB、makefile的使用

2017-01-01 19:28 531 查看
前面的几篇博客中我们讲解了Linux下的编辑器vim、编译器gcc和g++,今天我们来介绍一下其他常用的三种工具,它们分别是程序调试器:GDB、代码查看器:ctags、还有一个辅助工程的工具:Makefile

程序调试器:GDB

在windos下我们常用vs编辑器中自带的调试工具进行程序的调试,对于程序员来说,调试自己写的程序时必须的;在Linux中,我们可以使用GDB来调试已经编译好的可执行程序;注意,一定是已经编译好的程序,下面来看看GDB使用调试的注意事项以及相关按键:



如上图,首先用gdb调试的可执行程序文件必须含有相应的调试信息,在用gcc编译时我们需要在gcc指令的后面加上-g标志,在下面的信息中,下面的文件大小中含有调试信息的文件的大小是比不含调试信息的文件要大。

下面,我们使用 gdb + 含有调试信息的可执行程序进入调试阶段,如下图:



在开始单步执行时我们必须要先打上断点,因为我们在单步执行之间必须先运行程序,如果不打上断点,程序会直接跑完,这时非常尴尬的。

这需要我们记住gdb的两个指令:

r : 开始运行程序

b + n:表示在第n行打下断点(n为数字)



下面我们就可以来调试程序了,调试程序的过程中,我们需要记住几个最基本的指令:

n:单步执行程序

s:跳转到函数的入口地址

p:打印变量的值

我们来通过一次调试看看这些命令是如何使用的:



其他的一些重要命令

display + 变量名:将该变量的内容常显示,即在变量的作用域中每次单步执行都会看到该变量的内容,对我们观察变量的内容的改变情况十分有帮助.

undisplay + n:取消显示列表中的号码n所对应的变量内容的常显示。



set var x=n:将变量x的内容修改为n,这样做可以辅助我们调试程序,比方说我们先看到start=8;end=8;时程序的执行结果,我们就可以通过该命令直接修改变量的内容,这样可以使我们少单步执行几次程序就能得到我们想看到的结果。



关于断点除了前面的几条命令外还有下面几条比较重要的命令:

info b num:查看第num个编号的断点的当前信息

info b:查看所有断点的信息

delete breakpoints:删除所有断点

delete breakpoints num:删除序号为num的断点

disable num:禁用序号为num的断点

enable num :启用序号为num的断点

下面我们来看看这些命令的使用:



其他有助于调试的命令

continue :从当前位置继续向后执行而不是单步执行程序。

finish 执行完当前函数返回,然后原地“踏步”等待命令。

until n:直接跳转至第n行

Makefile

一个程序员会不会写Makefile,决定了这个程序员具不具备在Linux下完成大型工程的能力,因为,makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual

C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。

首先,我们来实现一个简单的Makefile,顺便讲解一下Makefile的语法。

场景如下

在一个文件夹下面,我们已经写好了头文件,函数文件,以及测试文件,如果我们将函数文件和测试文件都进行编译并且我们需要查看编译过程中各个阶段所生成的文件,那样我们需要敲好多条命令,如果我们改写了函数文件或者测试文件的程序,那么这些步骤需要再来一次,这样会很繁琐,而当我们编写好了Makefile文件后,这些指令统统只需要一个make就能够搞定,下面我们来看一个简单的Makefile的实现:



target : preproity

/Tab command

上面的命令是Makefile的基本语法,target可以是文本文件,也可以是可执行文件,还可以是一个标签,这种标签就相当于上图中的伪指令clean,它没有preproity这一项。

target文件的生成规则定义在解决方法command中,如果target比preproity文件的时间要新的话则会执行command,否则会继续向上查找preproity的依赖文件,直到找到符合规则,并且最新的为止。这是Makefile的主线和核心,大家如果想深入了解的可以去看看下面这篇博客:

http://blog.csdn.net/ruglcc/article/details/7814546/

关于C语言和C++语言的编译这个过程,大家可以看看下面这篇博客:

http://blog.csdn.net/bit_clearoff/article/details/53965514
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  makefile linux gdb 调试