gcc编译及调试Word文档下载推荐.docx
- 文档编号:20923639
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:17
- 大小:25.72KB
gcc编译及调试Word文档下载推荐.docx
《gcc编译及调试Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《gcc编译及调试Word文档下载推荐.docx(17页珍藏版)》请在冰豆网上搜索。
开始时
是用
汇编语言和一种叫
B
的语言编写的.
从那时候起,
就成为世界上使用最广泛计
算机语言.
能在编程领域里得到如此广泛支持的原因有以下一些:
它是一种非常通用的语言.
几乎你所能想到的任何一种计算机上都有至少一种能用
的
编译器.
并且它的语法和函数库在不同的平台上都是统一的,
这个特性对开
发者来说很有吸引力.
写的程序执行速度很快.
是所有版本的UNIX上的系统语言.
在过去的二十年中有了很大的发展.
在80年代末期美国国家标准协会
(American
National
Standards
Institute)发布了一个被称为
ANSI
语言
标准.这更加保证了将来在不同平台上的
的一致性.
在80年代还出现了一种
的面向对象的扩展称为
C++.
C++
将在另一篇文章
"
编程"
中描述.
上可用的
编译器是
编译器,
它建立在自由软件基金会的编程
许可证的基础上,
因此可以自由发布.
你能在
的发行光盘上找到它.
随
Slackware
发行的
编译器(GCC)是一个全功能的
兼
容编译器使用
本节将介绍如何GCC
和一些
GCC
编译器最常用的选项..
如果你熟悉其他操作系统或硬件平台上的一种
你将能很快
地掌握
GCC.
使用
通常后跟一些选项和文件名来使用
gcc
命令的基本用法如下:
[options]
[filenames]
命令行选项指定的操作将在命令行上每个给出的文件上执行.
下一小节将叙述
一些你会最常用到的选项.
选项
有超过100个的编译选项可用.
这些选项中的许多你可能永远都不会用到,
但一些主要的选项将会频繁用到.
很多的
选项包括一个以上的字符.
因此你
必须为每个选项指定各自的连字符,
并且就象大多数
命令一样你不能在一
个单独的连字符后跟一组选项.
例如,
下面的两个命令是不同的:
-p
-g
test.c
-pg
第一条命令告诉
编译
时为
prof
命令建立剖析(profile)信息并
且把调试信息加入到可执行的文件里.
第二条命令只告诉
为
gprof
命令建立
剖析信息.
当你不用任何选项编译一个程序时,
将会建立(假定编译成功)一个名为
a.out
的可执行文件.
下面的命令将在当前目录下产生一个叫
的文
件:
你能用
-o
编译选项来为将产生的可执行文件指定一个文件名来代替
a.out.
将一个叫
count.c
程序编译为名叫
count
的可执行文件,
你将输入
下面的命令:
当你使用
选项时,
后面必须跟一个文件名.
同样有指定编译器处理多少的编译选项.
-c
选项告诉
仅把源代码编
译为目标代码而跳过汇编和连接的步骤.
这个选项使用的非常频繁因为它使得编译
多个
程序时速度更快并且更易于管理.
缺省时候GCC
建立的目标代码文件有一个
.o
的扩展名.
-S
编译选项告诉
在为
代码产生了汇编语言文件后停止编译.
产
生的汇编语言文件的缺省扩展名是
.s
-E
选项指示编译器仅对输入文件进行预处理.
当这个选项被使用时,
预处理器的输出被送到标准输出而不是储存在文件里
优
化
选
项
当你用
代码时,
它会试着用最少的时间完成编译并且使编译后的
代码易于调试.
易于调试意味着编译后的代码与源代码有同样的执行次序,
编译后
的代码没有经过优化.
有很多选项可用于告诉
在耗费更多编译时间和牺牲易
调试性的基础上产生更小更快的可执行文件.
这些选项中最典型的是-O
-O2
项.
-O
对源代码进行基本优化.
这些优化在大多数情况下都会使程
序执行的更快.
产生尽可能小和尽可能快的代码.
选项将
使编译的速度比使用
时慢.
但通常产生的代码执行速度会更快.
除了
优化选项外,
还有一些低级选项用于产生更快的代码.
这些
选项非常的特殊,
而且最好只有当你完全理解这些选项将会对编译后的代码产生什
么样的效果时再去使用.
这些选项的详细描述,
请参考
的指南页,
在命令行
上键入
man
调试和剖析选项
支持数种调试和剖析选项.
在这些选项里你会最常用到的是
选项.
产生能被
调试器使用的调试信息以便调试你的程序.
提供了一个很多其他
编译器里没有的特性,
在
里你能使
(
产生优化代码)联用.
这一点非常有用因为你能在与最终产品尽可能相近的情况下
调试你的代码.
在你同时使用这两个选项时你必须清楚你所写的某些代码已经在优
化时被
作了改动.关于调试
程序的更多信息请看下一节"
调试
程序"
在你的程序里加入额外的代码,
执行时,
产生
用的
剖析信息以显示你的程序的耗时情况.
关于
的更多信息请参考
gprof"
一
节.
程序
包含了一个叫
调试程序.
是一个用来调试
程序的强力调试器.
它使你能在程序运行时观察程序的内部结构和内存的使用
情况.
以下是
所提供的一些功能:
它使你能监视你程序中变量的值.
它使你能设置断点以使程序在指定的代码行上停止执行.
它使你能一行行的执行你的代码.
在命令行上键入
并按回车键就可以运行
了,
如果一切正常的话,
将被启动并且你将在屏幕上看到类似的内容:
GDB
is
free
software
and
you
are
welcome
to
distribute
copies
of
it
under
certain
conditions;
type
show
copying"
see
the
conditions.
There
absolutely
no
warranty
for
GDB;
warranty"
details.
GDB
4.14
(i486-slakware-linux),
Copyright
1995
Free
Software
Foundation,
Inc.
(gdb)
当你启动
后,
你能在命令行上指定很多的选项.
你也可以以下面的方式
来运行
:
<
fname>
当你用这种方式运行
你能直接指定想要调试的程序.
这将告诉gdb
装
入名为
fname
你也可以用
去检查一个因程序异常终止而产生
core
文件,
或者与一个正在运行的程序相连.
你可以参考
指南页或在命
令行上键入
-h
得到一个有关这些选项的说明的简单列表.
为调试编译代码(Compiling
Code
Debugging)
为了使
正常工作,
你必须使你的程序在编译时包含调试信息.
调试信息
包含你程序里的每个变量的类型和在可执行文件里的地址映射以及源代码的行号.
利用这些信息使源代码和机器码相关联.
在编译时用
选项打开调试选项.
基本命令
支持很多的命令使你能实现不同的功能.
这些命令从简单的文件装入到
允许你检查所调用的堆栈内容的复杂命令,
表27.1列出了你在用
调试时会用
到的一些命令.
想了解
的详细使用请参考
的指南页.
表
27.1.
基本
命令.
命
令
描
述
file
装入想要调试的可执行文件.
kill
终止正在调试的程序.
list
列出产生执行文件的源代码的一部分.
next
执行一行源代码但不进入函数内部.
step
执行一行源代码而且进入函数内部.
run
执行当前被调试的程序
quit
终止
watch
使你能监视一个变量的值而不管它何时被改变.
break
在代码里设置断点,
这将使程序执行到这里时被挂起.
make
使你能不退出
就可以重新产生可执行文件.
shell
使你能不离开
就执行
支持很多与
程序一样的命令编辑特征.
你能象在
bash
或
tcsh里那样按
Tab
键让
帮你补齐一个唯一的命令,
如果不唯一的话
会
列出所有匹配的命令.
你也能用光标键上下翻动历史命令.
应用举例
本节用一个实例教你一步步的用
被调试的程序相当的简单,
但它展示了
的典型应用.
下面列出了将被调试的程序.
这个程序被称为
greeting
它显示一个简单的
问候,
再用反序将它列出.
#include
stdio.h>
main
()
{
char
my_string[]
=
hello
there"
;
my_print
(my_string);
my_print2
}
void
(char
*string)
printf
("
The
string
%s\n"
string);
*string2;
int
size,
i;
size
strlen
(string);
string2
*)
malloc
(size
+
1);
(i
0;
i
size;
i++)
string2[size
-
i]
string[i];
string2[size+1]
`\0'
printed
backward
string2);
用下面的命令编译它:
test
这个程序执行时显示如下结果:
there
输出的第一行是正确的,
但第二行打印出的东西并不是我们所期望的.
我们所
设想的输出应该是:
ereht
olleh
由于某些原因,
函数没有正常工作.
让我们用
看看问题究竟
出在哪儿,
先键入如下命令:
记得在编译
程序时把调试选项打开.
如果你在输入命令时忘了把要调试的程序作为参数传给
你可以在
提示符下用
命令来载入它:
这个命令将载入
可执行文件就象你在
命令行里装入它一样.
这时你能用
命令来运行
了.
当它在
里被运行后
结果大约会象这样:
Starting
program:
/root/greeting
Program
exited
with
code
041
这个输出和在
外面运行的结果一样.
问题是,
为什么反序打印没有工作?
为了找出症结所在,
我们可以在
函数的
语句后设一个断点,
具
体的做法是在
提示符下键入
命令三次,
列出源代码:
技巧:
提示符下按回车健将重复上一个命令.
第一次键入
命令的输出如下:
1
2
3
4
5
6
7
8
9
10
如果按下回车,
将再执行一次
命令,
给出下列输出:
11
12
13
14
15
16
17
18
19
20
再按一次回车将列出
程序的剩余部分:
21
22
23
24
25
26
27
根据列出的源程序,
你能看到要设断点的地方在第24行,
命令行提示
符下键入如下命令设置断点:
将作出如下的响应:
Breakpoint
at
0x139:
greeting.c,
line
现在再键入
将产生如下的输出:
1,
(string
0xbfffdc4
)
greeting.c
string2[size-i]=string[i]
你能通过设置一个观察
变量的值的观察点来看出错误是
怎样产生的,
做法是键入:
将作出如下回应:
Watchpoint
2:
现在可以用
命令来一步步的执行
循环了:
经过第一次循环后,
告诉我们
的值是
`h`.
如下的显示来告诉你这个信息:
2,
Old
value
0
`\000'
New
104
`h'
my_print2(string
greeting.c:
(i=0;
i<
这个值正是期望的.
后来的数次循环的结果都是正确的.
当
i=10
时,
表达式
的值等于
`e`,
最后一个字符已经
拷到新串里了.
如果你再把循环执行下去,
你会看到已经没有值分配给
string2[0]
而
它是新串的第一个字符,
因为
函数在分配内存时把它们初始化为空
(null)字符.
所以
的第一个字符是空字符.
这解释了为什么在打印
时没有任何输出了.
现在找出了问题出在哪里,
修正这个错误是很容易的.
你得把代码里写入
的第一个字符的的偏移量改为
而不是
size.
这是因为
的大小为
12,
但起始偏移量是
0,
串内的字符从偏移量
到
偏移量
10,
为空字符保留.
为了使代码正常工作有很多种修改办法.
一种是另设一个比串的实际大小小
的变量.
这是这种解决办法的代码:
m
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- gcc 编译 调试