【Linux学习】课时12_Linux软件开发工具(2)

曾巧文 发布于:2012-5-17 23:14 分类:Linux学习 标签: Ubuntu linux 课时

Linux软件开发工具(2)

1、GDB 的使用
GDB简介 : GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。
使用GDB可以实现:单步执行、跟踪函数调用、设置断点、实时设置变量值等功能
使用GDB的基本步骤:
gcc   -g  main.c  -o  main 
gdb main : 启动gdb对可执行文件main进行调试
说明:
gdb调试的对象是可执行文件,而不是源代码。
gcc的-g选项是使生成的可执行文件能用gdb进行源码级调试,但并不是将源代码嵌入到可执行文件中。

 

2、GDB的使用
基本操作
启动gdb之后进入一个类似Shell的操作环境,在这个环境下,输入gdb的相关命令进行调试。
gdb下输入help将列出命令的分类,输入 help 分类名可获得该类命令的详细清单。 例如:help files。
退出gdb交互环境使用命令q。
在gdb交互环境下查看源代码使用命令list。每次会显示10行代码,也可以指定从第n行开始显示:list  n
在gdb交互环境下直接按回车键表示重复上一个命令。
在gdb交互环境下很多命令具有简写格式,如list命令的简写格式为: l。后面的命令格式如:list [l]。

 

3、GDB的使用
测试示例代码:main.c

#include 
int add_range(int low, int high) {
    int i, sum;
    for (i = low; i <= high; i++)        sum = sum + i;
    return sum;
}
int main(void) {
    int result[100];     result[0] = add_range(1, 10);
    result[1] = add_range(1, 100);
    printf("result[0]=%d\nresult[1]=%d\n", result[0],  result[1]);    return 0;
}


GDB的使用
单步执行、跟踪函数调用
start : 开始执行程序,gdb停在了main函数中变量定义之后的第一条语句处等待下一个命令
next [n]: 执行下一条语句
step [s]:  执行下一条语句,如果调用了某个函数,会进入函数内部,在函数代码第一条语句处等待命令
backtrace [bt]: 查看函数调用的栈帧
info[i] locals : 查看当前栈帧的局部变量值
frame[f] 1 : 切换到编号为1的栈帧。
print[p] var : 打印变量var的值
finish : 执行完当前栈帧,并返回到上一层。
set var sum=0 : 设置变量sum的值为0


4、GDB的使用
测试示例代码:findbug.c

#include 
int main(void)  {
    int sum = 0, i = 0;
    char input[5];
    while(1) {
        scanf("%s", input);
        for (i = 0; input[i] != '\0'; i++)
            sum = sum*10 + input[i] - '0';
        printf("input=%d\n", sum);
    }
}


GDB的使用
设置断点、观察点
display sum : 跟踪显示sum变量的值
undisplay 1 : 取消编号为1的跟踪显示
break 10 : 在代码第10行设置断点 (breakpoint)
continue [c] : 连续运行而非单步运行
info break : 显示断点信息
delete break 1 : 取消编号为1的断点
break 10 if *** : 设置断点在满足某个条件才激活
run [r] : 从头开始连续运行程序
watch sum : 设置观察点,观察sum值的变化
观察点:当程序访问某个存储单元时中断
x/7b input : 查看内存中从input变量位置开始的7个字节的内容


5、make及Makefile
make及Makefile简介:
在大型的开发项目中,人们通常利用 make 工具来自动完成编译工作。这些工作包括:
如果仅修改了某几个源文件,则只重新编译这几个源文件;
如果某个头文件被修改了,则重新编译所有包含该头文件的源文件。
利用这种自动编译可大大简化开发工作,避免不必要的重新编译。
make工具通过一个称为 Makefile 的文件来完成并自动维护编译工作。Makefile文件的内容是描述项目或软件(包)中的模块之间的相互依赖关系以及目标文件、可执行程序产生时要执行的命令等。
make及Makefile
测试示例代码:
make及Makefile
测试示例编译过程及各部分依赖关系:
gcc  f1.c  -c  -o  f1.o
gcc  f2.c  -c  -o  f2.o
gcc  f3.c  -c  -o  f3.o
gcc  f1.o  f2.o  f3.o  -o  f

【Linux学习】课时12_Linux软件开发工具(2)
make及Makefile
一个Makefile文件主要含有一系列的规则,每条规则包含以下内容。


一个目标(target),make最终需要创建的文件或是要执行的动作,如“clean”。
一个或多个依赖文件(dependency)列表,通常是编译目标文件所需要的其他文件。
一系列命今(command),是make执行的动作,通常是把指定的相关文件编译成目标文件的编译命令,每个命令占一行,且每个命令行的起始字符必须为TAB字符。

 

6、make及Makefile
测试示例的Makefile文件内容:
make及Makefile
Makefile规则中目标与依赖的关系:
欲更新目标,则必须先更新它所有的依赖。
一个目标的所有依赖中,只要有一个依赖被更新了,这个目标也必须被更新。
make会自动选择那些受影响的源文件重新编译,而不受影响的源文件则不重新编译。
例如示例中修改源文件f1.c,重新make的过程是:
执行: gcc  f1.c  -c  -o  f1.o
执行: gcc  f1.o  f2.o  f3.o  -o  f
注意:此时并不会重新编译f2.c和f3.c,即f2.o和f3.o并不需要重新生成。

7、make及Makefile
测试示例的简写版Makefile文件内容:
make及Makefile
make内建隐含规则
make的一般步骤是将“.c”的C语言源文件和相关文件通过编译产生“.o”目标文件 。
make可以使工作更加自动化,也就是说,make知道一些默认的动作,它有一些称作隐含规则的内置的规则,这些规则告诉make当用户没有完整地给出某些命令的时候,应该怎样执行。
例如,把生成f1.o的命令从规则中删除,make将会查找隐含规则,然后会找到并执行一个适当的命令。由于这些命令会使用一些变量,因此可以通过改变这些变量来定制make。
当某个目标*.o只依赖于同名的*.c时,可以省略这条规则。例如:f1.o : f1.c 可以省略。
make及Makefile
make内建隐含规则
make  -p  :  打印隐含规则数据库
f1.o : f1.c  
隐含规则生成的命令是:cc  -c  -o  f1.o  f1.c

 


说明:CC变量的值为cc,CFLAGS等变量值为空
$@ 表示目标f1.o,$<表示规则中的第一个依赖f1.c
$^ 表示所有依赖

8、编码风格工具indent
indent
使用indent工具可以把代码格式化成某种风格。
命令格式 :
indent  [option]  file  [-o outfile]
style选项:
-gnu : 使用GNU的代码风格,默认选项
-kr : 使用Kernighan & Ritchie的代码风格
-linux : 使用Linux内核和驱动的代码风格
-orig: 使用原始的伯克利的代码风格
可以编辑.indent.pro文件设置自定义的代码风格,这个文件可以放在环境变量INDENT _PROFILE 指定的路径下、当前目录下、或者用户主目录下

版权所有:《曾巧文博客-关注互联网IT技术,记录生活点滴》 => 《【Linux学习】课时12_Linux软件开发工具(2)
本文地址://qiaowen.net/post-1230.html
除非注明,文章均为 《曾巧文博客-关注互联网IT技术,记录生活点滴》 原创,欢迎转载!转载请注明本文地址,谢谢。

有 5017 人浏览,获得评论 4 条

评论:

套圈特
2013-11-19 11:19
写的不错麻麻
羚羊商道网
2012-05-19 23:01
你这个站的蛮有特色的,如果互联网上都类似像您这样的站的话,那就会更有价值了!
曾巧文
2012-05-20 13:02
@羚羊商道网:{鸡冻}只是记录下自己学习的过程而已,不算什么。有空常来咯
影楼培训
2012-05-18 12:53
谢谢博主分享啦

发表评论:

Powered by emlog 粤ICP备12040901号

>>本作品采用-知识共享署名-非商业-禁止演绎-协议-进行许可 |站点地图 | | | | 开放分类目录 |