大多数程序员所使用的IDE(集成开发环境)都是自带调试功能的,调试功能有什么用呢?大家编译程序时发现的问题是语法或链接问题,能编译通过只能说明我们的程序在语法和链接时未产生错误,但不能说明我们程序就是完全正确的,因为程序的业务逻辑问题是在执行时才会发现的,所以我们会发现有很多初学编程的朋友就总会说明明我程序编译通过啦,为什么执行不出来结果或在执行时发生了错误呢,这就是为什么要有调试这一环节,调试的目的就在于发现程序中的业务逻辑问题,一般使用IDE的可以直接使用自带的调试工具进行程序运行调试,那如果我们是在没有IDE的linux环境下又该如何对程序进行调试呢?最简单的方式就是调用打印函数(C语言中就是printf函数)进行程序语句运行的跟踪,找出问题所在,这种方式的缺点就是需要不停添加printf修改源码,重新编译运行,最后还得删除这些调试信息;而接下来给大家介绍的这个功能强大的调试工具gdb就可以很好的解决这些问题。
首先在linux下我们需要先安装gdb调试工具;大多数情况下Centos和Ubuntu下是默认安装了gdb的,大家可以直接使用命令gdb --version查看;
若没有安装可连网后执行下列指令进行安装;
Centos下:yum -y install gdb Ubuntu下:sudo apt-get -y install gdb
若要调试程序,编译时还需要加上-g选项让编译生成的可执行文件中包含足够的调试信息,包含代码、栈、局部变量等,若还需查看更多信息如宏定义则需添加-g3选项,这样就可以通过print命令打印宏定义信息;如:
gcc -g test.c -o test、 gcc -g3 test.c -o test
gdb常见使用命令说明:
命令 | 命令缩写 | 命令说明 |
help | help cmd查看gdb命令帮助手册,cmd表示需查看的命令 | |
file | file test装入需调试的可执行文件test | |
list | l | 列出产生执行文件的部分源码 |
run | r | 开始运行程序直到设置的断点 |
next | n | 单步执行,如遇到自定义的函数中没有断点,则不会进入函数内部执行 |
step | s | 单步执行,如遇到自定义的函数,则进入函数内部按顺序逐步执行 |
break | b | 设置断点,可设置多个断点,如: b 6表示在第6行设置断点 b funcname表示在函数funcname处设置断点 执行非当前源文件的某行或某函数时停止执行: b filename:linenum 如: b test.c:20 b filename:funcname 根据条件停止程序执行: b linenum if expr 如:b 16 if i != 0 b funcname if expr |
continue | c | 继续运行程序直到下一个断点的位置 |
info | i | 调试相关信息显示,info 命令后必须加如下选项操作 info break 显示当前断点清单,包括到达断点处的次数等详细信息,可简写成i b info files 显示被调试文件的详细信息 info func 显示所有的函数名称 info local 显示当前函数中的局部变量信息 info prog 显示被调试程序的执行状态 |
whatis | 显示变量或函数的类型 whatis var 如:whatis tmp (tmp是程序中的变量) whatis funcname | |
disable | disable n 关闭第n个断点,若不加n则表示对所有断点执行该操作,n为i b查看的断点信息中的num值 | |
enable | 开启第n个断点 | |
delete | d | 删除第n个断点 |
set args | 设置需传递的主函数参数值,需传递主函数参数时使用 set args arg1 arg2 ... | |
set var name=value | 设置变量name的值;如程序中有变量int i和char name[10]; set var i=10 把变量i的设置为10 set var name="rjc" 把变量name的值设为"rjc" 注意这并不会改变原程序中已赋值变量的值,如程序中i已赋值(i=6),调试时设置变量值则无效 | |
p | 显示变量的值,p variate就表示显示变量variate的值 | |
dprintf | dp | 在调试程序中指定位置动态添加打印信息 dprintf location, format string, arg1, arg2, ... localtion表示行号 format string表示格式化打印的字符串和C语言中的printf函数中的格式化字符串的使用一样 argn表示格式化输出时需替换的程序中的变量 |
quit | q | 退出gdb |
以上这些常见命令大家可以参考上述表格及help命令多多尝试使用测试。
最后给大家两个gdb实用小技巧,大家可以动手试试,学习一定是需要动脑思考、动手实践的,实践方能检测学习内容的真实性
1. 给当前用户添加编辑gdb的初始化配置文件.gbdinit
vim ~/.gdbinit
添加如下内容:
set print pretty on #打开结构体信息调试打印,方便查看结构体信息 set print array-indexes on #打开打印数组下标索引
2. vim ~/.bashrc在当前用户的环境变量配置文件.bashrc中的最后添加如下信息:
alias gdb="gdb -q"
保存退出后,执行source ~/.bashrc生效该环境变量配置
这用于启动gdb时去除版本信息等打印