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可以一步一步的查看程序的执行情况,看到内存的值。
窥探程序执行的奥秘。

posted @ 2018-01-23 17:42  TBHacker  阅读(677)  评论(0编辑  收藏  举报