linux gdb网络调试工具,Linux--gdb调试工具

gdb是强大的调试工具,下面通过一个交换函数来初步认识他

main.c

#include

#include

void swap(int a, int b){

int t;

t = a;

a = b;

b = t;

}

int main()

{

int a = 3;

int b = 4;

swap(a, b);

printf("a = %d\n b = %d \n", a, b);

}

第一步:编译命令

gcc -g -Wall main.c -o main

解释:

gcc 是编译命令

-g 在输出的目标文件中包含调试信息

-Wall 产生警告信息

-o 指定编译输出文件名默认为a.out(为什么输出文件没有文件扩展名呢?参考另一篇笔记https://www.jianshu.com/p/f40188931d8b)

第二步:使用gdb

命令:

gdb main

输出:

GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.5) 7.11.1

Copyright (C) 2016 Free Software Foundation, Inc.

License GPLv3+: GNU GPL version 3 or later

This is free software: you are free to change and redistribute it.

There is NO WARRANTY, to the extent permitted by law. Type "show copying"

and "show warranty" for details.

This GDB was configured as "x86_64-linux-gnu".

Type "show configuration" for configuration details.

For bug reporting instructions, please see:

.

Find the GDB manual and other documentation resources online at:

.

For help, type "help".

Type "apropos word" to search for commands related to "word"...

Reading symbols from main...done.

(gdb)

这样我们就进入了gdb模式,可以使用gdb命令对程序进行调试

第三步:列出程序行

命令:

(gdb) l

输出:

1 #include

2 #include

3

4 void swap(int a, int b){

5 int t;

6 t = a;

7 a = b;

8 b = t;

9 }

10

11 int main()

12 {

13 int a = 3;

14 int b = 4;

15 swap(a, b);

16 printf("a = %d\n b = %d \n", a, b);

17 }

第四步:加断点 (b + 行号)

命令:

(gdb) b 9

输出:

Breakpoint 1 at 0x400542: file main.c, line 9.

表示在内存0x400542处添加了第一个断点

第五步:运行程序并在断点处停止

命令:

(gdb) r

输出:

Starting program: /home/yourname/WorkSpace/codeblocks/hellolinux/main

Breakpoint 1, swap (a=4, b=3) at main.c:9

9 }

第六步:查看调用栈

命令:

(gdb)bt

输出:

#0 swap (a=4, b=3) at main.c:9

#1 0x000000000040056a in main () at main.c:15

该调用栈中存在两个栈帧(后文解释)

第七步:打印栈帧信息

命令:

p a

输出:

$1 = 4

调用栈描述的是函数之间的调用关系,它由多个栈帧组成每个栈帧对应着没有运行完的函数,栈帧中保存着该函数的信息比如:返回地址,局部变量等。程序执行到断点处时swap函数还没有调用完毕,依然存在调用栈中我们可以使用p命令来查看当前栈帧的的信息。通过上面的例子可以发现通过三变量法swap函数的形参a , b的值发生了交换

第八步:更换当前栈帧

命令:

(gdb)up

输出:

#1 0x000000000040056a in main () at main.c:15

15 swap(a, b);

同上打印出main函数中的a , b

(gdb) p a

$3 = 3

(gdb) p b

$4 = 4

通过上面的的调试结果我们发现实际上a , b的值并没有发生交换

第九步:退出调试

命令:

(gdb) q

输出:

A debugging session is active.

Inferior 1 [process 11524] will be killed.

Quit anyway? (y or n) y

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值