目录
删除断点,d(el) 编号(可以同时删除多个断点d 1 3 4)
undisplay 删除显示变量,查看编号,info display
gdb调试命令
gdb调试,是linunx给我们提供的神器,当代码有bug的时候,用于调试。
经验之谈,gdb调试的目的是找到bug, 并且解决bug,这就需要程序员对自己的程序非常了解,而且,至少知道bug位于那个部分才行,一般调试bug的方式,要么是用gdb,要么是查看日志,无非就是这两种。
首先要明白的是,在编译的时候,加入了"-g"参数,这样才能使用gdb调试,
举例说明,执行一下程序并进行编译:
main.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "head.h"
typedef struct TTfunInfo
{
int fun_type;//函数的类型
int a;//函数的第一个参数
int b;//函数的第二个参数
char funname[10];//函数名称
}TfunInfo;
int main(int argc,char *argv[])
{
int a = 2;
int i = 0;
int a1 = 10,b1=5;
TfunInfo funinfo[2];
// char *Msg="I will die!";
// Msg[0] = '1';
if(argc == 3)
{
a1 = atoi(argv[1]);
b1 = atoi(argv[2]);
funinfo[0].a = a1;
funinfo[0].b = b1;
funinfo[1].a = a1;
funinfo[1].b = b1;
}
for(i = 0; i < 2; i ++)
{
printf("i===%d,LINE=%d\n",i,__LINE__);
if(i == 0)
{
funinfo[i].fun_type = 1;//call sum
printf("begin call sum\n");
strcpy(funinfo[i].funname,"sum");
sum(funinfo[i].a,funinfo[i].b);
}
if(i == 1)
{
funinfo[i].fun_type = 2;//call mul
printf("begin call mul\n");
strcpy(funinfo[i].funname,"mul");
mul(funinfo[i].a,funinfo[i].b);
}
}
printf("byebye\n");
return 0;
}
func.c
#include <stdio.h>
#include "head.h"
int sum(int a,int b)
{
printf("welcome call %s,a=%d,b=%d\n",__FUNCTION__,a,b);
return a+b;
}
int mul(int a,int b)
{
printf("welcome call %s,a=%d,b=%d\n",__FUNCTION__,a,b);
return a*b;
}
进行编译:"gcc func.c main.c -o app -I ./ -g",其中,加入了"-g"参数,调用了gdb调试,
其结果文件如下:
发现里面的至是乱码的,应该传递进去参数才可以:
这样看就正常了。
启动gdb:gdb app(对应可执行程序名)
那么下面来启动gdb调试:"gdb app"
如上标红部分,说明进入了gdb的管理部分,
进入后,可以执行一些命令,在gdb启动程序:
r(un) 启动
run指定参数启动:"run 12 7"
start 启动
(另一种启动方式)-停留在main函数,相当于开始分步调试
n(ext) 执行下一行代码
(在start启动的前提下,敲入n,相当于逐行执行下一条指令)
或者,在上一条指令执行的是"n"的前提下,敲入回车,相当于继续执行上一条指令。可以继续下一行代码。
s(tep) 执行下一行代码
(和"n"的功能一样,区别在于"step"可以进入到函数内部,但只能进入到当前代码中包括的函数,库函数或系统函数不能进)
q(uit) 退出gdb
像遇到上面那种出现问题的状况的时候,就只能先退出了
设置启动参数:"set args 10 6"
执行的时候,可以给程序指定参数
设置断点(run在断点处停止)
b 行号---主函数所在文件的行:"b 17"
- b 函数名 :"sum"
- b 文件名:行号(指定行号,设置断点):"b main.c:17"
- 查看当前代码一共设置了多少个断点:"info b"
- 原先设置的断点,一旦退出gdb调试再进入后,就都没了
当然,也可以根据函数来设置断点:"b 函数名" (这就需要设置者对代码比较熟了)
l(ist) 查看代码,默认显示10行(显示主函数)
按回车键,会继续显示下一个10行的代码,
list 文件名:行号(开始行号)
- l -- 显示主函数对应的文件
- l 文件名:行号
删除断点,d(el) 编号(可以同时删除多个断点d 1 3 4)
查看断点 i(nfo) b,得到编号
c(ontinue) 跳到下一断点
可以按断点去跳
p(rint) 打印变量的值,结构体也也可以打印
ptype 打印变量的类型
set 设置变量的值
可以在执行过程中,将参数进行修改
display 显示变量的值
用于追踪,查看变量具体什么时候变化:"display 需要跟踪的变量"
每次运行,都会把这个变量的值给显示出来
undisplay 删除显示变量,查看编号,info display
设置条件断点 b line if i == 1
设置到符合条件的时候,断点生效: