Linuxc - gdb调试程序
指针实现变量交换值
#include <stdio.h>
void change(int *a,int *b) {
int tmp = *a;
*a = *b;// 将指针a所在地址的值,更换为b地址的值
*b = tmp;
}
int main()
{
int a=5;
int b=3;
change(&a,&b); // 指针a获取a的地址,指针b获取b的地址
printf("num a=%d\nnum b=%d \n",a,b);
return 0;
}
让我们用gdb工具来看看其中的奥妙。
root@jiqing:~/cspace/pointer# gcc -g main.c -o main.out
生成gdb调试版本的main.out文件。
root@jiqing:~/cspace/pointer# gdb main.out
进入调试模式
(gdb) l
1 #include <stdio.h>
2 void change(int *a,int *b) {
3 int tmp = *a;
4 *a = *b;// 将指针a所在地址的值,更换为b地址的值
5 *b = tmp;
6 }
7
8 int main()
9 {
10 int a=5;
l 进行查看
(gdb) start
Temporary breakpoint 1 at 0x4005cb: file main.c, line 9.
Starting program: /root/cspace/pointer/main.out
Temporary breakpoint 1, main () at main.c:9
9 {
start 开始执行
(gdb) n
10 int a=5;
n 下一步
(gdb) n
13 change(&a,&b); // 指针a获取a的地址,指针b获取b的地址
(gdb) s
change (a=0x7fffffffe4d0, b=0x7fffffffe4d4) at main.c:3
3 int tmp = *a;
s 进入子函数
(gdb) p a
$1 = (int *) 0x7fffffffe4d0
(gdb) p b
$2 = (int *) 0x7fffffffe4d4
(gdb) p *a
$5 = 3
(gdb) p *b
$6 = 5
p 打印值。经过交换之后,a变成了3 ,b变成了5。
(gdb) q
A debugging session is active.
Inferior 1 [process 11754] will be killed.
Quit anyway? (y or n) y
q退出。
通过gdb可以一步一步的查看程序的执行情况,看到内存的值。
窥探程序执行的奥秘。