gdb调试
命令 | 功能 |
---|---|
l | 显示源文件中的程序,第二次l时会显示接下来的10行 |
r | 开始执行程序 |
b | 设置断点 break 15为在15行设置断点 |
n | 单步执行 如果遇到函数调用则执行完整个函数 |
s | 单步执行 如果遇到函数调用则进入函数执行函数中的第一行 |
p | 打印变量值 p a 为打印a |
c | 执行接下来的所有程序 |
q | 退出gdb调试 |
调试过程示例
下面的程序有逻辑bug
#include<stdio.h>
void swap(int *p1, int *p2);
int main(){
int a = 10, b = 20;
printf("The old values : a = %d, b = %d\n", a, b);
swap(&a, &b);
printf("The new values : a = %d, b = %d\n", a, b);
return 0;
}
//实现两数值交换
void swap(int *p1, int *p2){
int *p = p1;
p1 = p2;
p2 = p;
}
-
首先
gcc -g 0.c
生成可用用于调试的可执行文件./a.outgdb ./a.out
进入调试模式 -
l
两下显示一下源代码 -
我们猜测可能是swap函数的问题,所以在第8行设置一个断点
b 8
-
现在让程序跑起来
r
程序会在断点处停止 -
下面我们通过单步执行
s
进入到函数中 -
进入到函数中我们打印一下*p1和*p2的值
p *p1
-
按三次
n
到函数末尾之后打印一下*p1, *p2, p1和p2p p1
-
上述结果看到*p1和*p2的值确实交换了,单是因为p1和p2的地址进行了交换,但是出函数之后p1和p2就被释放了,没有将a和b的地址交换,所以a和b的值不变,我们要修改的是将a和b位置上的数值进行交换
void swap(int *p1, int *p2){ int p = *p1; *p1 = *p2; *p2 = p; }
-
c
让程序执行下面的程序 到达一个断点或者程序结束 -
q
命令退出gdb调试模式