【Linux学习笔记八】Linux编程-编译(gcc)与调试(gdb)

【注】文章中的所有截图均为centos下实验结果,亲测命令正确= ̄ω ̄=

【参考资料】《Linux从入门到精通(第2版)》刘忆智
等编著

1、编译一个C程序 :以用vim写成的summary.c为例

$ gcc summary.c       
    ##编译文件,生成名为 a.out 的可执行文件

     $ ./a.out            ##执行文件

     $ gcc -o sum summary.c   
        ##为编译生成的可执行文件命名为sum

     $ ./sum   
        ##为编译生成的可执行文件命名为sum

【转载请注明文章出处:http://blog.csdn.net/iamthezbl/article/details/51346603

2、同编译有关的选项

选项 功能
-c 只激活预处理、编译和汇编,生成扩展名为.o的目标代码文件(编写大型程序所必须)
-S 只激活预处理和编译,生成扩展名.s的汇编代码文件
-E 只激活预处理,并将结果输出至标准输出
-g 为调试程序(如gdb)生成相关信息

     $ gcc -E summary.c > pre_sum            ##将结果重定向输出到文件中

3、编译C++程序:g++

     $ g++ -o hello hello.cpp            ##与gcc用法基本一致

4、启动调试(gdb)

     $ gcc -g summary.c   
        ##在调试之前,必须先用gcc -g命令生成带有调试信息的可执行程序

     $ gdb a.out            ##对二进制文件a.out进行调试,提示符(gdb)等待接受用户的指令

5、获得帮助:gdb支持<Tab>的命令补全,和两个<Tab>的命令列表(前边提到过Shell的同样功能),也支持缩写,如help可以用h代替

     (gdb) help            ##显示gdb的帮助信息

     (gdb) help breakpoints            ##进一步获取和断点有关的帮助信息

【转载请注明文章出处:http://blog.csdn.net/iamthezbl/article/details/51346603

6、查看源代码

     (gdb) list            ##查看程序源代码,每次显示十行,回车继续显示,list可以简写成
l

     (gdb) l 15            ##显示第
15 行附近的 10 行代码

     (gdb) search int summary            ##查找对应内容,回车继续查找下一个(朝向文件尾)

     (gdb) reverse-search Summary            ##向相反方向搜索(朝向文件头)

     search和reverse-search支持使用正则表达式搜索。

7、设置断点

     (gdb) break 10       
    ##在第10行设置断点

     (gdb) break summary   
        ##在summary()函数入口处设置断点

     (gdb) info break     
      ##查看已经设置的断点信息

     (gdb) clear 10       
    ##删除该行断点

8、运行程序和单步执行

     如果CentOS不能正常运行如下命令,需要先进行如下配置:

     $ cd/etc/yum.repos.d  

     $ sudo vim  CentOS-Debuginfo.repo   
        ##文件为只读,需要用sudo打开修改

     将enabled=0修改为enabled=1,保存退出。

     $ sudo yum install yum-utils   
       

     $ sudo yum install nss-softokn-debuginfo --nogpgcheck

     $ sudo yum install glibc   
       

     需要在ipv4下下载安装。

     $ sudo debuginfo-install glibc-2.17-106.el7_2.4.x86_64     
      ##具体的版本号可以根据gdb下使用run命令失败时的系统提示确定,此处如果不能完全安装成功,可以使用以下两条语句更新后再次安装,便可以成功: 

     $ sudo yum makecache   
       

     $ sudo yum update    

     上述步骤安装完成后,便可以正常使用调试命令了。如,在summary.c中第十行设置断点后:

     (gdb)run   
        ##缩写为 r,运行程序至断点

     (gdb)next   
        ##缩写为 n,单步执行,不进入函数内部

     (gdb)n 2   
        ##提供一个数字,连续执行 2 行

     (gdb)continue   
        ##缩写为c,运行程序到下一个断点

     (gdb)step   
        ##缩写为s,单步执行,进入函数内部

【转载请注明文章出处:http://blog.csdn.net/iamthezbl/article/details/51346603

9、监视变量

     如果CentOS不能正常运行如下命令,需要先进行如下配置:

     (gdb) print sum   
        ##缩写为p,打印变量sum的值

     (gdb)            ##重复上一条命令

     (gdb) watch sum           ##每次使用print比较麻烦,可以用watch设置观察点,每次sum发生变化,程序就会停下

10、临时修改变量

     程序运行时修改变量的值:

     (gdb) set var i = 1   
        ##将变量 i 的值修改为1

11、查看堆栈情况:bt

12、退出gdb

     (gdb) quit  
        ##缩写为q,如果程序没有运行完毕,会要求用户确认

【转载请注明文章出处:http://blog.csdn.net/iamthezbl/article/details/51346603

13、常用gdb命令汇总

gdb命令 缩写 描述
help h 获取帮助信息
list l 显示源代码
search

向前(朝向文件尾)搜索源代码
reverse-search

向后(朝向文件头)搜索源代码
break b 设置断点
info break

查看断点信息
clear

清除当前所在行的断点
run r 从头运行程序至第一个断点
next n 单步执行(不进入函数体)
step s 单步执行(进入函数体)
continue c 从当前行继续运行程序至下一个断点
print p 打印变量的值
watch

设置观察点
set var variable=value

设置变量variable的值为value
bt

查看运行时栈
quit q 退出gdb
时间: 2024-10-06 00:30:51

【Linux学习笔记八】Linux编程-编译(gcc)与调试(gdb)的相关文章

Linux学习笔记:Linux发行版

Linux发行版 什么是Linux distribution – Linux的本质来说,它只是操作系统的核心(内核),负责控制硬件.管理文件系统.程序迚程等,并丌给用户提供各种工具和应用软件. – 人们以Linux核心为中心,再集成搭配各种各样的系统管理软件戒应用工具软件组成一套完整的操作系统,如此的组合便称为Linux发行版. Linux主要发行版 RedHat Linux:红帽企业级Linux是系统管理员的第一选择,它有众多的程序包,还有非常到位的支持,由于该发行版是商业化产品,所以丌是免费

Linux学习笔记(17) Shell编程之基础

1. 正则表达式 (1) 正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配.grep.awk.sed等命令可以支持正则表达式:通配符用来匹配符合条件的文件名,通配符是完全匹配.ls.find.cp这些命令不支持正则表达式,所以只能使用shell自己的通配符来进行匹配了. (2) 基础正则表达式 元字符 作用 * 前一个字符匹配0次或任意多次 . 匹配除了换行符外任意一个字符 ^ 匹配行首,如:^hello会匹配以hello开头的行 $ 匹配行尾,如:hello$会匹配以hello结尾的

马哥linux学习笔记:源码编译安装

由于rpm包在作者制作封装的时候已经把程序的一些特性固定了,如果我们根据自己的需求,需要运用程序的一些没有普适性相关特性,就需要下载程序的源码手动编译安装了,这里只是简单的介绍一下C代码的程序包编译安装方法. 为了能更直观的看到源码编译安装的过程,我演示一下在centos7.2环境中编译安装httpd2.2: 首先,编译的前提是得有称手的工具及环境了,编译c源代码就需要用到开发工具,make,gcc了,环境就需要开发库跟头文件了,如果系统中没有这些,就需要yum安装了. 这里我运行yum gro

Linux学习笔记之shell编程基础

编程语言: 机器语言.汇编语言 .高级语言 静态语言:编译性语言 ,特点: 强类型(变量在使用前,必须先声明,甚至还需要初始化):事先转换成可执行文件.包含语言如: C .C++.JAVA.C# 动态语言:解释性语言 ,特点: 弱类型(变量用时声明,甚至不区分类型):边解释边执行.包含语言如: ASP.ASP.NET .PHP .SHELL .Python .PERL 编程能力: 面向过程 :Shell.C 面向对象:Python .Perl .JAVA .C++ Bash :变量 类型 环境变

linux学习笔记:shell脚本编程相关(上)

前言 unix/linux操作系统下的shell,是一种壳,其目的是提供一个用户与计算机相互交互的命令接口,通过输入各种命令,达到操作的目的. 与此同时,shell支持控制流程,进而可以组合出各种各样的应用实例. shell脚本的格式 首行shebang机制: bash脚本,首行添加#!/bin/bash [options] csh脚本,首行添加#!/bin/csh [options] ksh脚本,首行添加#!/bin/ksh [options] -- 描述脚本的注释部分: 包括Author,

Linux学习笔记(18) Shell编程之流程控制

1. if语句 (1) 单分支if条件语句 格式为: # 注意条件判断式两端的空格if [ 条件判断式 ];then 程序员 fi 或者 if[ 条件判断式 ] then 程序 fi 例:判断分区使用率 #!/bin/bash #获取根分区的使用率 rate=$(df -h | grep "/dev/sda5" | awk '{print $5}' | cut -d "%" -f 1) if [ $rate -ge 10 ] then echo "/dev

Linux学习笔记--bash脚本编程之二、条件判断

 bash脚本编程之二.条件判断 条件判断: 如果用户不存在 添加用户,给密码并显示添加成功: 否则 显示用户已存在,没有添加 bash中如何实现条件判断? 整数测试 字符测试 文件测试 条件测试的表达式:     [expression]     [[expression]]     test expression 整数比较: -eq:测试两个整数是否相等:比如 $A -eq $B     -ne:测试两个整数是否不等:不等,为真:相等,为假:     -qt:测试一个数是否大于另一个数:大于

Linux学习笔记--bash脚本编程之一变量、变量类型

bash脚本编程之一变量.变量类型 shell编程: 编译器,解释器 编程语言:机器语言.汇编语言.高级语言 静态语言:编译型语言 强类型(变量)语言 事先转换成可执行格式 C.C++.JAVA.C# 动态语言:解释型语言       on the fiy                                   弱类型 边解释边执行 ASP.ASP.net.PHP.shell.Python.perl 面向过程:shell.C   面向对象:JAVA.Python .Perl.C++

【linux学习笔记八】常用命令

查询与自动挂载 #查询系统中已经挂载的设备 mount #依据配置文件/etc/fstab的内容,自动挂载 mount -a 挂载命令格式 mount [-t 文件系统] [-o 特殊选项] 设备文件名 挂载点 #-t 文件系统:加入文件系统类型来指定挂载的类型,可以ext3 ext4 iso9660等 #-o 特殊选项:可以指定挂载的额外选项 w 用户名 命令输出: USER 登录的用户名 TTY 登录终端 FROM 从哪个IP地址登录 [email protected] 登录时间 IDLE