gdb的使用

gdb的使用

debug版本:调试版本—>程序员

release版本:发行版本—>用户

gcc默认生成的是release版本的可执行文件,如果要生成debug版本,需要添加一个选项-g

如果是分布生成可执行文件,则需要在编译阶段加入-g,生成debug版本的中间文件。

首先写几个代码

process.c

1
2
3
4
5
6
7
8
9
10
11
12
13
#include<stdio.h>
#include<stdlib.h>
#include"my_math.h"
int main()
{
int a=1,b=2;
printf("a+b=%d\n",my_add(a,b));
printf("a-b=%d\n",my_sub(a,b));
printf("a*b=%d\n",my_mux(a,b));
printf("a/b=%f\n",my_div(a,b));

exit(0);
}

math.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<stdio.h>
#include<stdlib.h>
int my_add(int a,int b)
{
return a+b;
}
int my_mux(int a,int b)
{
return a*b;
}
int my_sub(int a,int b)
{
return a-b;
}
double my_div(int a,int b)
{
if(b==0)
{
printf("error\n");
exit(0);
}
return a*1.0/b;
}

my_math.h

1
2
3
4
5
6
7
#ifndef __MY_MATH_H
#define __MY_MATH_H
int my_add(int,int);
int my_sub(int,int);
int my_mux(int,int);
double my_div(int,int);
#endif

然后编译生成debug 版本

1
gcc -o main process.c math.c -g

生成main文件

然后开始debug

1
gdb main

想看源码的话就输一个’l’,然后连续按回车就可以查看完代码

看其他.c文件的代码就用

1
list math.c:(行号)

断点管理

1
2
3
4
5
6
b 行号	给指定的行号添加一个断点
b 函数名 给指定的函数的有效的第一行添加一个断点
info b 显示所有断点信息
disable num 将断点设为无效
enable num 将断点设为有效
d num 删除断点

上面已经显示了两个代码,断点只会加在最近的代码上

调试过程

1
2
3
4
5
6
r	开始执行,直接执行到运行过程中的第一个断点
n 单步执行
s 逐语句执行
finish 跳出函数
c 继续执行,直接执行到下一个断点处
q 退出调试
1
2
3
4
5
6
7
8
9
10
11
p valname 显示变量的值
p &valname 显示变量的地址
p 表达式 显示表达式的结果
p 函数(实参) 显示函数执行结果
display 自动显示,参数和p相同
info display 显示display信息
undisplay display的编号 删除指定的自动显示
ptype valname 显示valname类型
数组名:p arr 打印数组所有元素的值
指向数组的指针:p *arr@len 打印数组所有元素的值
bt 显示函数调用栈,显示函数调用的经过