linux下c语言编程文档格式.docx
- 文档编号:18759873
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:71
- 大小:73.26KB
linux下c语言编程文档格式.docx
《linux下c语言编程文档格式.docx》由会员分享,可在线阅读,更多相关《linux下c语言编程文档格式.docx(71页珍藏版)》请在冰豆网上搜索。
将会建立(假定编译成功)一个名为
a.out
的可
执行文件.
下面的命令将在当前目录下产生一个叫
的文件:
你能用
-o
编译选项来为将产生的可执行文件指定一个文件名来代替
a.out.
将一
个叫
count.c
的
程序编译为名叫
count
的可执行文件,
你将输入下面的命令:
count.c
------------------------------------------------------------------------------
注意:
当你使用
选项时,
后面必须跟一个文件名.
同样有指定编译器处理多少的编译选项.
-c
选项告诉
仅把源代码编译为目标代
码而跳过汇编和连接的步骤.
这个选项使用的非常频繁因为它使得编译多个
程序时速
度更快并且更易于管理.
缺省时
建立的目标代码文件有一个
.o
的扩展名.
-S
编译选项告诉
在为
代码产生了汇编语言文件后停止编译.
产生的汇编语
言文件的缺省扩展名是
.s
.
-E
选项指示编译器仅对输入文件进行预处理.
当这个选项被使用时,
预处理器的输出被送到标准输出而不是储存在文件里.
优
化
选
项
当你用
代码时,
它会试着用最少的时间完成编译并且使编译后的代码易于调试.
易于调试意味着编译后的代码与源代码有同样的执行次序,
编译后的代码没有经过优化.
有很多选项可用于告诉
在耗费更多编译时间和牺牲易调试性的基础上产生更小更快的可执行文件.
这些选项中最典型的是-O
-O2
选项.
-O
对源代码进行基本优化.
这些优化在大多数情况下都会使程序执行的更快.
产生尽可能小和尽可能快的代码.
选项将使编译的速度比使用
时慢.
但通常产生的代码执行速度会更快.
除了
优化选项外,
还有一些低级选项用于产生更快的代码.
这些选项非常的特殊,
而且最好只有当你完全理解这些选项将会对编译后的代码产生什么样的效果时再去使用.
这些选项的详细描述,
请参考
的指南页,
在命令行键入
man
.
调试和剖析选项
支持数种调试和剖析选项.
在这些选项里你会最常用到的是
产生能被
调试器使用的调试信息以便调试你的程序.
提供了一个很多其他
编译器里没有的特性,
在
里你能使
(产生优化代码)联用
..
这一点非常有用因为你能在与最终产品尽可能相近的情况下调试你的代码.
在你同时使用这两个选项时你必须清楚你所写的某些代码已经在优化时被
作了改动.
关于调试
程序的更多信息请看下一节"
用
gdb
调试
程序"
在你的程序里加入额外的代码,
执行时,
产生
用的剖析信息以显示你的程序的耗时情况.
关于
的更多信息请参考
"
gprof"
一节.
程序
包含了一个叫
调试程序.
是一个用来调试
C++
程序的强力调试器.
它使你能在程序运行时观察程序的内部结构和内存的使用情况.
以下是
所提供的一些功能:
它使你能监视你程序中变量的值.
它使你能设置断点以使程序在指定的代码行上停止执行.
它使你能一行行的执行你的代码.
在命令行上键入
并按回车键就可以运行
了,
如果一切正常的话,
将被启动并且你将在屏幕上看到类似的内容:
5.0
Copyright
2000
Free
Software
Foundation,
Inc.
GDB
is
free
software,
covered
by
the
General
Public
License,
and
you
are
welcome
to
change
it
and/or
distribute
copies
of
under
certain
conditions.
Type
show
copying"
see
There
absolutely
no
warranty
for
GDB.
warranty"
details.
This
was
configured
as
i386-redhat-linux"
(gdb)
当你启动
后,
你能在命令行上指定很多的选项.
你也可以以下面的方式来运行
:
<
fname>
当你用这种方式运行
你能直接指定想要调试的程序.
这将告诉gdb
装入名为
fname
的可执行文件.
你也可以用
去检查一个因程序异常终止而产生的
core
文件,
或者与一个正在运行的程序相连.
你可以参考
指南页或在命令行上键入
-h
得
到一个有关这些选项的说明的简单列表.为调试编译代码(Compiling
Code
Debugging)为了使
正常工作,
你必须使你的程序在编译时包含调试信息.
调试信息包含你程序里的每个变量的类型和在可执行文件里的地址映射以及源代码的行号.
利用这些信息使源代码和机器码相关联.
在编译时用
选项打开调试选项.
基本命令
支持很多的命令使你能实现不同的功能.
这些命令从简单的文件装入到允许你检查所调用的堆栈内容的复杂命令,
表27.1列出了你在用
调试时会用到的一些命令.
想了解
的详细使用请参考
的指南页.
基本
命令.
命
令
描
述
file
装入想要调试的可执行文件.
kill
终止正在调试的程序.
list
列出产生执行文件的源代码的一部分.
next
执行一行源代码但不进入函数内部.
step
执行一行源代码而且进入函数内部.
run
执行当前被调试的程序
quit
终止
gdb
watch
使你能监视一个变量的值而不管它何时被改变.
显示表达式的值
break
在代码里设置断点,
这将使程序执行到这里时被挂起.
make
使你能不退出
就可以重新产生可执行文件.
shell
使你能不离开
就执行
UNIX
支持很多与
程序一样的命令编辑特征.
你能象在
bash
或
tcsh里那样
按
Tab
键让
帮你补齐一个唯一的命令,
如果不唯一的话
会列出所有匹配的命
令.
你也能用光标键上下翻动历史命令.
应用举例
本节用一个实例教你一步步的用
被调试的程序相当的简单,
但它展示了
的典型应用.
下面列出了将被调试的程序.
这个程序被称为
hello
它显示一个简单的问候,
再用反
序将它列出.
#include
stdio.h>
static
void
my_print
(char
*);
my_print2
main
()
{
char
my_string[]
=
world!
;
(my_string);
}
*string)
printf
("
The
string
%s
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]
'
printed
backward
string2);
用下面的命令编译它:
hello.c
这个程序执行时显示如下结果:
../hello
is
输出的第一行是正确的,
但第二行打印出的东西并不是我们所期望的.
我们所设想的输出
应该是:
!
dlrow
olleh
由于某些原因,
函数没有正常工作.
让我们用
看看问题究竟出在哪儿,
先键入如下命令:
hello
--
记得在编译
程序时把调试选项打开.
如果你在输入命令时忘了把要调试的程序作为参数传给
你可以在
提示符下用
命令来载入它:
(gdb)
这个命令将载入
可执行文件就象你在
命令行里装入它一样.
这时你能用
命令来运行
了.
当它在
里被运行后结果大约会象这
样:
run
Starting
program:
/root/hello
Program
exited
with
code
040
这个输出和在
外面运行的结果一样.
问题是,
为什么反序打印没有工作?
为了找出
症结所在,
我们可以在
函数的
语句后设一个断点,
具体的做法是在
提示符下键入
命令三次,
列出源代码:
list
技巧:
提示符下按回车健将重复上一个命令.
第一次键入
命令的输出如下:
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
28
29
30
根据列出的源程序,
你能看到要设断点的地方在第26行,
命令行提示符下键入如
下命令设置断点:
26
将作出如下的响应:
Breakpoint
at
0x804857c:
hello.c,
line
26.
现在再键入
将产生如下的输出:
1,
(string=0xbffffab0
)
hello.c:
你能通过设置一个观察
变量的值的观察点来看出错误是怎样产生的,
做法是键入:
i]
将作出如下回应:
Hardware
watchpoint
2:
现在可以用
命令来一步步的执行
循环了:
next
经过第一次循环后,
告诉我们
的值是
`h`.
用如下的显示
来告诉你这个信息:
Old
value
0
00'
New
104
h'
25
这个值正是期望的.
后来的数次循环的结果都是正确的.
当
i=11
时,
表达式
的值等于
`!
`,
最后一个字符已经拷到新串
里了.
如果你再把循环执行下去,
你会看到已经没有值分配给
string2[0]
而它是新串的第一个字符,
因为
函数在分配内存时把它们初始化为空(null)字符.
所以
的第一个字符是空字符.
这解释了为什么在打印
时没有任何输出了.现在找出了问题出在哪里,
修正这个错误是很容易的.
你得把代码里写入
的第
一个字符的的偏移量改为
而不是
size.
这是因为
的大小为
12,
但起始偏移量是
0,
串内的字符从偏移量
到
偏移量
10,
为空字符保留.
改正方法非常简单.
这是这种解决办法的代码:
-1
string2[size]
如果程序产生了core文件,可以用gdb
core命令来查看程序在何处出错。
如在函数
my_print2()中,如果忘记了给string2分配内存
,很可能就会core
dump.
另外的
编程工具
xxgdb
xxgdb
是
的一个基于
X
Window
系统的图形界面.
包括了命令行版的
上的所有特性.
使你能通过按按钮来执行常用的命令.
设置了断点的地方也用图
形来显示.
你能在一个
Xterm
窗口里键入下面的命令来运行它:
里任何有效的命令行选项来初始化
此外
也有一些特有的命
令行选项,
表
27.2
列出了这些选项.
27.2.
命令行选项.
项
db_name
指定所用调试器的名字,
缺省是
gdb.
db_prompt
指定调试器提示符,
缺省为
gdbinit
指定初始化
的命令文件的文件名,
.gdbinit.
nx
告诉
不执行
.gdbinit
文件.
bigicon
使用大图标.
calls
sunsite.unc.edu
FTP
站点用下面的路径:
/pub/Linux/devel/lang/c/calls.tar.Z
来取得
calls
一些旧版本的
CD-ROM
发行版里也附带有.
因为它是一个有用的
工具,
我们在这里也介绍一下.
如果你觉得有用的话,
从
BBS,
FTP,
或另一张CD-ROM
上
弄一个拷贝.
调用
的预处理器来处理给出的源程序文件,
然后输出这些文件
的里的函数调用树图.
在你的系统上安装
以超级用户身份登录后执行下面的步骤:
1.
解压和
untar
文件.
2.
cd
进入
后建立的子目录.
3.
把名叫
的文件移动
/usr/bin
目录.
4.
calls.1
的文件移动到目录
/usr/man/man1
5.
删除
/tmp/calls
这些步骤将把
程序和它的指南页安装载你的系统上.
打印出调用跟踪结果时,
它在函数后面用中括号给出了函数所在文件的文件名:
[hello.c]
如果函数并不是向
给出的文件里的,
不知道所调用的函数来自哪里,
则只
显示函数的名字:
printf
不对递归和静态函数输出.
递归函数显示成下面的样子:
fact
recursive
in
factorial.c
>
静态函数象这样显示:
total
[static
calculate.c]
作为一个例子,
假设用
处理下面的程序:
count_sum()
i,sum=0;
for(i=0;
i<
1000000;
sum
+=
count_sum();
i,sum
=0;
i++)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- linux 语言 编程