linux程序设计:调试
来源:互联网 发布:windows开线程 编辑:程序博客网 时间:2024/05/13 01:27
一. 一些基本知识
1.gcc和g++和cc
gcc是C编译器;g++是C++编译器;linux下cc一般是一个符号连接,指向gcc;gcc和g++都是GUN(组织)的编译器。而CC则一般是makefile里面的一个名字,即宏定义,嘿,因为Linux/Unix都是大小写敏感的系统,这点一定要注意。
cc是Unix系统的C Compiler,而gcc则是GNU Compiler Collection,GNU编译器套装。gcc原名为Gun C语言编译器,因为它原本只能处理C语言,但gcc很快地扩展,包含很多编译器(C、C++、Objective-C、Ada、Fortran、Java)。因此,它们是不一样的,一个是古老的C编译器,一个是GNU编译器集合,gcc里面的C编译器比cc强大多了,因此没必要用cc。
下载不到cc的原因在于:cc来自于昂贵的Unix系统,cc是商业软件。
Linux下的cc是gcc符号连接,可以通过$ls –l /usr/bin/cc来简单察看,该变量是make程序的内建变量,默认指向gcc。cc符号链接和变量存在的意义在于源码的移植性,可以方便的用gcc来编译老的用cc编译的Unix软件,甚至连makefile都不用改在,而且也便于Linux程序在Unix下编译。
摘自于:http://blog.csdn.net/abc78400123/article/details/6827751
2. gcc选项
-g为了调试用的
加个-g 是为了gdb 用,不然gdb用不到
-o output_filename,确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。如果不给出这个选项,gcc就给出预设的可执行文件a.out。
一般语法:
gcc filename.c -o filename
上面的意思是如果你不打 -o filename 那么默认就是输出filemame.out.这个-o就是用来控制输出文件的。
-c 只编译不链接
常用选项
-E:只进行预处理,不编译
-S:只编译,不汇编
-c:只编译、汇编,不链接
-g:包含调试信息
-I:指定include包含文件的搜索目录
-o:输出成指定文件名
高级选项
-v:详细输出编译过程中所采用的每一个选项
-C:预处理时保留注释信息
-ggdb:在可执行文件中包含可供GDB使用的调试信息
-fverbose-asm:在编译成汇编语言时,把C变量的名称作为汇编语言中的注释
-save-temps:自动输出预处理文件、汇编文件、对象文件,编译正常进行
-fsyntax-only:只测试源文件语法是否正确,不会进行任何编译操作
-ffreestanding:编译成独立程序,而非宿主程序
语言标准
-ansi:ANSI标准
-std=c99:C99标准
-std=gnu89:ISO/IEC 9899:1990 以及GNU扩充
-std=gnu99:ISO/IEC 9899:1999 以及GNU扩充
-trigraphs:支持ISO C三字符组
出错提示
-w:忽略所有警告
-Werror:不区分警告和错误,遇到任何警告都停止编译
-Wall:开启大部分警告提示
-Wshadow:某语句块作用域变量与更大作用域的另一变量同名时发出警告(此警告未包含在-Wall选项中,需单独开启)
-Wextra:对所有合法但值得怀疑的表达式发出警告
摘自于:http://blog.csdn.net/rheostat/article/details/19811407
http://blog.chinaunix.net/uid-21411227-id-1826747.html
3.使用GDB
gdb是linux系统中的默认调试器。
1)进入GDB #gdb test
test是要调试的程序,由gcc test.c -g -o test生成。进入后提示符变为(gdb) 。
2)查看源码 (gdb) l
源码会进行行号提示。
如果需要查看在其他文件中定义的函数,在l后加上函数名即可定位到这个函数的定义及查看附近的其他源码。或者:使用断点或单步运行,到某个函数处使用s进入这个函数。
3)设置断点 (gdb) b 6
这样会在运行到源码第6行时停止,可以查看变量的值、堆栈情况等;这个行号是gdb的行号。
4)查看断点处情况 (gdb) info b
可以键入"info b"来查看断点处情况,可以设置多个断点;
5)运行代码 (gdb) r
6)显示变量值 (gdb) p n
在程序暂停时,键入"p 变量名"(print)即可;
GDB在显示变量值时都会在对应值之前加上"$N"标记,它是当前变量值的引用标记,以后若想再次引用此变量,就可以直接写作"$N",而无需写冗长的变量名;
7)观察变量 (gdb) watch n
在某一循环处,往往希望能够观察一个变量的变化情况,这时就可以键入命令"watch"来观察变量的变化情况,GDB在"n"设置了观察点;
8)单步运行 (gdb) n
9)程序继续运行 (gdb) c
使程序继续往下运行,直到再次遇到断点或程序结束;
10)退出GDB (gdb) q
摘自于:http://www.jb51.net/article/36393.htm
http://blog.csdn.net/haoel/article/details/2879 讲得很详细
4.core文件调试
我们经常听到大家说到程序core掉了,需要定位解决,这里说的大部分是指对应程序由于各种异常或者bug导致在运行过程中异常退出或者中止,并且在满足一定条件下(这里为什么说需要满足一定的条件呢?下面会分析)会产生一个叫做core的文件。
通常情况下,core文件会包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息还有各种函数调用堆栈信息等,我们可以理解为是程序工作当前状态存储生成第一个文件,许多的程序出错的时候都会产生一个core文件,通过工具分析这个文件,我们可以定位到程序异常退出的时候对应的堆栈调用等信息,找出问题所在并进行及时解决。
摘自于:http://blog.csdn.net/u010889616/article/details/48815321
http://blog.chinaunix.net/uid-22145625-id-3135056.html
- Linux程序设计:调试
- linux程序设计:调试
- 《Linux程序设计》——调试
- linux程序设计笔记10:gdb调试
- linux 应用程序设计基础--GDB调试
- 《Linux程序设计》学习笔记10——调试
- Linux程序设计笔记(第10章 调试)
- linux程序设计——调试(第十章)
- linux程序设计,MySQL与gdb调试学习,第二次调试时速度明显上升
- 程序设计:分析,构思,调试
- linux程序设计
- Linux程序设计
- linux程序设计
- Linux程序设计(-)
- linux 下的编译器和调试器---那些年我们一起学习linux程序设计
- 【原创】《Linux高级程序设计》杨宗德著 - Linux Socket网络编程基础 - 网络调试工具
- LINUX程序设计-socket程序设计
- [linux]Linux程序设计cc2--shell程序设计
- HDU 5889 Barricade 最短路+网络流
- CentOS 7.x下的LEMP环境搭建
- 毕业三个月感悟
- Android:视图绘制(四) ------Path进阶
- 能用HTML/CSS解决的问题就不要使用JS
- linux程序设计:调试
- linux 下 jdk的安装图文详解
- Ubuntu 下apache 设置伪静态
- Fragment+FragmentTabHost组件(实现新浪微博底部栏)
- 2106某某面试编程题:必须用Java语言实现,给出一个由元素数范围从0到N-1个唯一正整数组成的列表。设计一种方法,将该列表所有元素的元素值和其相应的索引值互换
- Android 隐藏底部虚拟按键不获取焦点
- 图并行计算实践(一)(spark streaming+graphx+kafka)
- 基于虚拟机的软件保护技术
- Android开启硬件加速