Linux培训-C编程_第1页
Linux培训-C编程_第2页
Linux培训-C编程_第3页
Linux培训-C编程_第4页
Linux培训-C编程_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Linux 培训 - Linux下使用C语言,许智君 Z,内容提纲,gcc gdb Make Windows到Linux程序移植,C语言简介,在80年代末期美国国家标准协会(American National Standards Institute)发布了一个被称为ANSI C的C语言标准。这更加保证了将来在不同平台上的C的一致性。 Linux上可用的C编译器是GNU C编译器, 它建立在自由软件基金会的编程许可证的基础上,因此可以自由发布。你能在Linux的发行光盘上找到它,GNU C 编译器,一、基本用法 gcc options filenames 说明: 在gcc后面可以有多个编译选项,

2、同时进行多个编译操作。很多的gcc选项包括一个以上的字符。因此你必须为每个选项指定各自的连字符。例如,下面的两个命令是不同的: gcc -p -g test1.c gcc -pg test1.c 当不用任何选项编译一个程序时,GCC将会建立(假定编译成功)一个名为a.out的可执行文件。,基本编译选项,-o选项 你能用 -o 编译选项来为将产生的可执行文件指定一个文件名来代替 a.out。 例:gcc o count count.c -c选项:告诉GCC仅把源代码编译为目标代码而跳过汇编和连接的步骤。这个选项使用的非常频繁,因为它使得编译多个C程序时速度更快并且更易于管理。缺省时GCC建立的目

3、标代码文件有一个.o的扩展名。 例:gcc c test2.c,警告选项,在gcc中用开关-Wall控制警告信息,使用示例命令如下: gcc Wall -o test3_1 test3_1.c,查找选项,gcc一般使用默认路径查找头文件和库文件。如果文件所用的头文件或库文件不在缺省目录下,则编译时要指定它们的查找路径。 -I选项:指定头文件的搜索目录 例: gcc I/export/home/st o test1 test1.c -L选项:指定库文件的搜索目录 例: gcc L/usr/X11/R6/lib o test1 test1.c,多个源文件生成一个可执行文件,问题:有多个源文件时,如

4、何生成一个可执行文件? 方法1:gcc Wall o mytest test1.c test2.c test3.c 方法2: gcc-Wall -c test1.c gcc-Wall c test2.c gcc-Wall c test3.c gcc o mytest test1.o test2.o test3.o,优化选项,优化选项可以使GCC在耗费更多编译时间和牺牲易调试性的基础上产生更小更快的可执行文件。这些选项中最典型的是-O和-O2选项。 -O选项:告诉GCC对源代码进行基本优化。这些优化在大多数情况下都会使程序执行的更快。 -O2选项:告诉GCC 产生尽可能小和尽可能快的代码。-O2

5、选项将使编译的速度比使用-O时慢。但通常产生的代码执行速度会更快。,版本选项,-v选项 用户将会得到自己目前正在使用的gcc的版本及与版本相关的一些信息。 gcc -v 将得到如下结果: Reading specs from /usr/lib/gcc-lib/i486-box-linux/2.7.2/specs gcc version 2.7.2 -V 选项 如果安装了多个版本的gcc,并且想强制执行其中的某个版本,可以用命令通知系统用户要使用的版本。 gcc -V2.6.3 -v,调试和剖析选项,使用调试选项后,gcc在进行编译的时候,在目标文件(.o)和创建的可执行文件中插入额外信息,这些

6、额外信息使gdb能够判断编译过的代码和源代码之间的关系。 -g选项:告诉GCC产生能被 GNU 调试器使用的调试信息以便调试你的程序。 例:gcc g o test3 test3.c -pg选项:告诉GCC在你的程序里加入额外的代码,执行时,产生gprof用的剖析信息以显示你的程序的耗时情况。 使用gdb调试工具,命令行如下: 例:gcc ggdb3 o test3 test3.c,用gdb调试GCC程序,gdb是一个用来调试C和C+程序的常用调试工具之一。 gdb所提供的一些功能: 监视程序中变量的值。 设置断点以使程序在指定的代码行上停止执行。 逐行执行代码。 分析崩溃程序的产生的core

7、文件,gdb基本用法,需要调试的程序,在编译时要使用调试选项。在默认的情况下,调试符号不会编译到程序中。调试之后,不需要重新编译程序。 gdb filename 出现 (gdb) 在这里,可以输入调试命令,基本gdb命令,file 装入想要调试的可执行文件。 kill 终止正在调试的程序。 list 执行一行源代码但不进入函数内部。 next 执行一行源代码但不进入函数内部。 step 执行一行源代码而且进入函数内部。 run 执行当前被调试的程序 quit 终止 gdb watch 能监视一个变量的值而不管它何时被改变。 break 在代码里设置断点, 这将使程序执行到这里时被挂起。 mak

8、e 能不退出 gdb 就可以重新产生可执行文件。 shell 能不离开 gdb 就执行 UNIX shell 命令。,GDB的静态调试启动方法,当需要在命令行通过gdb来启动可执行程序的时候: gdb 此时gdb会加载可执行程序的符号表和堆栈,并为启动程序作好准备; 设置可执行程序的命令行参数: set args 设置断点: b或break 通过命令r或run来启动程序,或者通过c或continue命令来继续已经被暂停的程序; 当程序core的时候,需要查看core文件的内容,使用以下方式: gdb 此时候,gdb会结合可执行程序的符号和堆栈来查看core文件内容,以分析程序在core掉时的内

9、存影象;,GDB的动态调试启动方法,动态调试就是在不终止正在运行的进程的情况下来对这个正在运行的进程进行调试 gdb 直接在gdb中把一个正在运行的进程连接到gdb中,以便于进行动态调试 使用attach命令: attach detach: 调试结束之后,可以使用该命令断开进程与gdb的连接 使用attach命令的例子: gdb file #指定进程所关联的程序源代码和符号表 attach . 使用gdb的命令进行调试; . detach #调试结束,解除进程与gdb的连接,使进程继续运行,GDB调试过程中使用到的概念和命令,gdb的工作路径: pwd: 查看gdb当前的工作路径; cd :

10、改变gdb当前的工作路径; info terminal:显示gdb当前所使用的终端的类型信息,gdb的环境,show paths: 显示当前路径变量的设置情况; show environment/env VARNAME:显示程序的环境变量VARNAME的值; set environment/env VARNAME = VALUE:设置程序的某个环境变量VARNAME的值;只对所调试的程序有效,对gdb本身不起作用 unset environment/env VARNAME:删除程序的某个环境变量VARNAME;,断点,断点的作用是当程序运行到断点时,无论它在做什么,都会被停止下来.对于每个断点

11、,你还可以设置一些更高级的信息以决定断点在什么时候起作用. 设置断点的位置:代码行、函数上、地址上.在那些含有异常处理的语言(如C+)中,还可以在异常发生的地方设置断点 断点分为普通断点和条件断点,设置普通的断点,使用break/b命令来设置普通断点;有很多种方法可以设置断点: A、break FUNCTION 在某个函数上设置断点 B、break +OFFSET 或 break OFFSET 程序运行到当前行时的前几行或后几行; OFFSET表示行号; C、break LINENUM 在行号为LINENUM的行上设置断点. D、break FILENAME:LINENUM 在FILENAME

12、文件中的第LINENUM行上设置断点; E、break FILENAME:FUNCTION 在FILENAME文件中的名为FUNCTION的函数上设置断点 F、break *ADDRESS 在地址ADDRESS上设置断点.这个命令允许你在没有调试信息的程序中设置断点; G、break 不含任何参数的break命令,会在当前执行到的程序运行栈中的下一条指令上设置一个断点.,条件断点,条件断点就是设置的断点只在某个条件成立的时候才有效,才会使程序在运行到断点之前停止; break . if CONDITION 这个命令设置一个条件断点,条件由CONDITION来决定.在gdb每次执行到此时,如果C

13、ONDITION条件的值被计算为非0,那么程序就在该断点处停止; tbreak ARGS: 该命令设置断点为只有效一次.ARGS的使用同break中的参数的使用,删除断点,当一个断点使用完之后,需要删除这些断点;clear命令和delete命令可以完成这项任务; A、clear: 不带任何参数的clear命令会在当前所选择的栈上清除下一个所要执行到的断点(指令级).当你当前的栈帧是栈中最内层的时候,使用这个命令可以很方便地删除刚才程序停止处的断点; B、clear FUNCTION 和 clear FILENAME:FUNCTION 删除名为FUNCTION的函数上的断点; C、clear L

14、INENUM 和 clear FILENAME:LINENUM 删除第LINENUM行上的断点; D、delete breakpoints BNUMS. 删除参数所指定的断点,如果没有指定参数,则删除程序中所有的断点.命令可以缩写成d,使断点暂时不起作用,使用enable命令来激活断点或观察点 使用disable命令来使断点或观察点暂时不起作用 使用info break或info watch命令来观察哪些断点是活跃的;,设置观察点,可以使用一个观察点来停止一个程序的执行,当某个表达式的值改变时,观察点将会停止程序,而不需要事先在某个地方设置一个断点 A、watch EXPR watch命令使用

15、EXPR作为表达式设置一个观察点.gdb将把表达式加入到程序中,并监视程序的运行,当表达式的值被改变的时候,gdb将会停止程序 B、rwatch EXPR: 使用EXPR作为表达式设置一个断点,当EXPR被程序读取时,程序被gdb暂停 C、awatch EXPR: 使用EXPR作为表达式设置一个观察点,当EXPR被读出然后被写入时,gdb会暂停程序;这个命令常和rwatch合用 D、info watchpoints: 显示所有设置的观察点的列表;它与info breakpoints命令类似,其它gdb调试命令,continue/c: 继续运行被中断的程序; backtrace/bt: 显示当前

16、堆栈的内容; print/p : 打印表达式或变量的值; frame/f : 选择一个栈帧,并进入这个栈帧,同时打印被选择的栈帧的内容摘要信息;该命令的参数是一个栈帧的号码或者是一个栈帧地址; info stack/frame: 显示栈/帧的摘要信息; run/r: 在gdb中启动并运行程序; help info: 显示命令info的用法; help : 显示命令Command的详细用法,对多线程程序的调试,thread THREAD_NO: 该命令用于在线程之间进行切换,把线程号为THREAD_NO(gdb设置的线程号)的线程设置为当前线程 info threads: 查询当前进程所拥有的所

17、有线程的状态摘要信息;gdb按照顺序显示: a、线程号: gdb为被调试进程中的线程设置的顺序号; b、目标系统的线程标识; c、此线程的当前栈信息; 一些前面带*号的线程,表示该线程是当前线程; thread apply THREAD_NO ALL ARGS: 该命令用于向线程提供命令,实例,程序test3_1a.c(简单程序样例) 程序test3_2.c test3_2a.c (程序优化样例 ,用命令time ./test3_2查看效果) 程序test3_3.c(错误程序的例子,用gdb查错),程序自动维护工具make,问题:当开发的程序非常庞大,且关系复杂,手工编译链接非常困难 解决:

18、利用一个自动系统控制和协调整个程序的创建过程。在这个自动系统中,程序员可以定义创建规则并通过这个规则进行项目的开发。 makefile就是定义这种规则的文件。GNU make 解释执行Makefile/makefile。,make是一种自动生成和维护目标程序的工具。 可以调用编译器、连接器等 根据程序各部分的修改情况,重新编译链接目标代码 输入make命令后,系统自动检测系统文件和以定义的规则,完成整个创建过程,程序自动维护工具make,简单makefile文件的写法 由若干规则组成,每个规则说明一个目标 规则的格式: 目标属性 分隔符依赖文件;命令菜单 命令菜单 说明:表示可选,表示可以多次出现 涉及的文件名允许用通配符 例子:c程序test5_1.txt和它的m

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论