调试命令建议显示程序代码的行数,可以设置vim。
方法:
Centos操作系统:
sudo vim /etcvimrc
Ubuntu操作系统:
sudo vim /etc/vim/vimrc
然后加入set number就行。
一、介绍
GDB 全称“GNU symbolic debugger”,从名称上不难看出,它诞生于 GNU 计划,是 Linux 下常用的程序调试器。
二、安装
yum -y install gdb
安装需要服务器接入互联网。
三、调试准备
用gcc编译源程序的时候,编译后的可执行文件不会包含源程序代码,如果您打算编译后的程序可以被调试,编译的时候要加-g的参数,例如要编译test.c文件:
gcc -g -o test test.c
在命令提示符下输入gdb test就可以调试test程序了。
gdb test
四、设置主程序的参数
1.set args
设置主程序的参数,例如:
运行程序
./test arg1 arg2
那么设置参数的方法是:
gdb test
set args arg1 arg2
另外注意,在设置参数时,如果输入不正常参数,可能引发错误。
例如:
set args aaa bbb.c
你的想法是向程序的参数输入一个“aaa bbb.c”的字符串值。结果由于该字符串中间有个空格,导致程序会有两个参数,一个是aaa,另一个是bbb.c。
这种情况需要在该字符串加双引号,如下:
set args "aaa bbb.c"
2.break 命令缩写b
设置断点,程序运行到断点会停下。
例如:
b 20
将会在第20行设置断点,可以设置多个断点。
另外加上b 20 if value=10,假如有个循环,value初始值为0,每一次循环加1,则将在value=10的地方设置一个断点,这称为条件断点。
3.info b
查看所有断点的信息
4.run 命令缩写r
开始运行程序,程序运行到断点的位置会停下来,如果没有遇到断点,程序会一直运行下去。
r
5.start命令
单步执行,也就是执行一条语句的意思。
6.next 命令缩写n
执行当前语句,如果该语句为函数调用,不会进入函数内部执行。
7.step 命令缩写s
执行当前行语句,如果该语句为函数调用,则进入函数执行其中的第一条语句。
注意了,如果函数是库函数或第三方提供的函数,用s也是进不去的,因为没有源代码,如果是您自定义的函数,只要有源码就可以进去。
8.finish命令
退出当前函数调用。
9.print 命令缩写p
显示变量值,例如:
p value0
上面的命令会查看当前value0的值是多少。另外要注意的是,p后面也可以加表达式,例如:
p value+1000
p strcpy(name,"Simon")
strcpy函数是一个拷贝字符串的函数,函数返回一个指向最终的目标字符串的指针。
因此会显示Simon。
10.ptype 变量
查看变量类型
11.continue 命令缩写c
继续运行程序,直到运行到下一个断点。
12.set var name = value
设置变量的值,假设程序有两个变量: int value0; char name[100];
set val value0=10
set var name=cdz
第一行将value0的值设置为10
第二行set var name="西施”把name的值设置为"cdz",注意,没有动用strcpy函数。
11.backtrace命令缩写bt
查看所有栈帧。栈帧:随着函数调用而在stack栈上开辟的一片内存空间。用于存放函数调用时产生的局部变量和临时值。
与栈帧信息一同显示的还有标识栈帧的数字,利用该数字使用frame命令切换栈帧。
13.frame 数字
切换栈帧。因为每个函数都有一个栈帧,当执行一个函数时,另外一个函数的变量可能会改变,但我们正处在当前函数的栈帧,则不能查看另外一个函数的栈帧。
为了查看栈帧,我们切换到要查看函数的栈帧。然后再用p查看变量。
14.display命令
跟踪变量,display+变量,然后每按一个n,执行一步,并且显示跟踪变量的信息。
于此同时会给跟踪的变量添加标识的数字,用于undisplay,取消跟踪。
15.undisplay
undisplay+数字,取消数字标识的变量跟踪。
16.quit 命令缩写q
退出gdb环境。
五、常见错误
没有加-g选项