gdb调试器
一般来说,GDB主要帮助你完成下面四个方面的功能:
1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
3、当程序被停住时,可以检查此时你的程序中所发生的事。
4、你可以改变你的程序,将一个BUG产生的影响修正从而测试其他BUG。
(gdb) list line1,line2
查看源代码
list lineNum 在lineNum的前后源代码显示出来
list + 列出当前行的后面代码行
list - 列出当前行的前面代码行
list function
set listsize count
设置显示代码的行数
show listsize
显示打印代码的行数
list first,last
显示从first到last的源代码行
执行程序
(gdb) file a.out //加载被调试的可执行程序文件。
(gdb)set args –b –x
(gdb) show args
(gdb)r //执行程序
backtrace命令为堆栈提供向后跟踪功能。
Backtrace 命令产生一张列表,包含着从最近的过程开始的所有有效过程和调用这些过程的参数。
显示数据
利用print 命令可以检查各个变量的值。
(gdb) print p (p为变量名)
print 是gdb的一个功能很强的命令,利用它可以显示被调试的语言中任何有效的表达式。表达式除了包含你程序中的变量外,还可以包含以下内容:
对程序中函数的调用
(gdb) print find_entry(1,0)
数据结构和其他复杂对象
(gdb) print *table_start
={e=reference=’\000’,location=0x0,next=0x0}
值的历史成分
(gdb)print (为历史记录变量,在以后可以直接引用的值)
断点
break命令(可以简写为b)可以用来在调试的程序中设置断点,该命令有如下四种形式:
break line-number 使程序恰好在执行给定行之前停止。
break function-name 使程序恰好在进入指定的函数之前停止。
break line-or-function if condition 如果condition(条件)是真,程序到达指定行或函数时停止。
break routine-name 在指定例程的入口处设置断点
.显示当前gdb的断点信息:
(gdb) info break
他会以如下的形式显示所有的断点信息:
Num Type Disp Enb Address What
1 breakpoint keep y 0x000028bc in init_random at qsort2.c:155
2 breakpoint keep y 0x0000291c in init_organ at qsort2.c:168
删除指定的某个断点:
(gdb) delete breakpoint 1
该命令将会删除编号为1的断点,如果不带编号参数,将删除所有的断点
(gdb) delete breakpoint
禁止使用某个断点
(gdb) disable breakpoint 1
该命令将禁止断点1,同时断点信息的 (Enb)域将变为 n
允许使用某个断点
(gdb) enable breakpoint 1
该命令将允许断点1,同时断点信息的 (Enb)域将变为 y
清除源文件中某一代码行上的所有断点
(gdb)clear number
注:number 为源文件的某个代码行的行号
make工程管理器
GNU Make是一个用来控制可执行文件和其他一些从源文件来的非源代码文件版本的软件 [2] 。
Make可以从一个名为makefile的文件中获得如何构建你所写程序的依赖关系,Makefile中列出了每个目标文件以及如何由其他文件来生成它。 当你编写一个程序时,你可以为它编写一个makefile文件,这样你就可以使用Make来编译和安装这个程序。
功能
Make 使最终用户可以在不知道构建细节的情况下构建和安装你的软件,因为这些细节都记录在了你提供的Makefile中 。
基于源文件的改动,Make可以自动知道那些文件需要更新;它也会自动决定文件更新的适当顺序,以避免要更新的文件依赖于另一个同样需要更新的文件。因此,在你修改了程序的源代码并且执行Make后,你不必重新完全编译你的所有文件,只需要重新编译那些直接或间接受到影响的文件就好了。
Make不限于任何一种特定的语言。对于程序中任何一种非源文件, makefile文件中可以指定shell指令去生成它。shell 指令可以执行编译器生成目标文件,执行链接器生成可执行文件,执行ar更新库文件,执行TeX(一个文本排版软件)或Makeinfo去格式化文档。
Make不限于用来生成软件包。你可以用make来控制安装和卸载软件包,或者用来生成标签表,以及其他的任何你想要做的,当然前提是你写好怎么做
这是一个非常简单的 make 文件:
foo: foo.c
cc -o foo foo.c
包含两行,一行是依赖关系,一行是执行动作。
依赖关系的那一行包含了程序的名字 (叫做 target),紧跟着一个冒号,然后是空格,最后是源文件的 名字。当 make读入这一行的时候,会检查 foo 是否存在;如果存在,就比较 foo 和 foo.c 最后的修改时间有什 么不同。如果 foo 不存在,或者比 foo.c 要旧,就检查执行动作那一行看看该怎么做。换句话 说,就是 foo.c 需要重新编译的时候该怎么办。
执行动作那一行以一个 tab (按下 tab) 开始,然后是你在命令行下产生 foo 所执行的命令。如果 foo 过期了,或者不存在,make 就会 执行这个命令来产生foo。换句话说,这就是重新编译 foo.c 的规则。
因此,当你输入 make 时,它会确定 foo 和 foo.c 在修改时间上是否同步。这个原则可以在 Makefile 里扩展到成百上千的目标文件上──实际上,在 FreeBSD 里,你只要在合适的目录下输入 make world 就可以编译整个操作系统!
makefile另一个有用的特点就是目标文件不一定就是程序。例如,我们可以 有这样的 make 文件。
foo: foo.c
cc -o foo foo.c
install:
cp foo /home/me
我们可以输入如下的命令告诉 make 该执行哪个目标:
% make target
make 会只执行这个目标而忽略其他的目标。例如,如果我们输入 make foo,就只有 foo 被执行,必要的情况下重新编译 foo 而不会继续执行 install 这个目标。
如果我们只是输入 make 这个命令,make 总会寻找第一个目标,并且在执行完以后就不管其他的目标了。例如,如果我们输入 make foo,make 就会转到 foo 这个目标,在必要的情况下重新编译 foo,而不会执行 install 目标, 然后就停止了。
一定要注意,install 这个目标不依赖任何其他的东西!这意味着我们一旦输入 make install,这个目标下的所有命令都将被执行。这种情况下,foo 将被安装到用户的家目录下。应用程序的makefile正是这样写的,以便程序在正确编译后可以被安装到正确的目录。