C语言回顾-GDB调试

1 篇文章 0 订阅

C语言回顾-GDB调试

代码

change.c

void change(int *a,int *b)
{
	int temp=*a;
	*a=*b;
	*b=temp;
}

change.h

void change(int *a,int *b);

main.c

int main()
{
	int a = 3;
	int b = 5;
	printf("a=%d,b=%d\n",a,b);
	change(&a,&b);
	printf("a=%d,b=%d\n",a,b);
	return 0;
}

编译

参数中加-g,可以进行gdb调试

gcc -g change.c main.c -o main

开始调试

终端运行main

gdb ./main

打印如下
说明:以###开头的是文本注释,不是打印的结果

### 开启运行调试
root@ubuntu:/home/bh/workspace/clearn/gdb# gdb ./main
GNU gdb (Ubuntu 9.2-0ubuntu1~20.04.1) 9.2
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
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:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./main...
### 使用l(list)打印代码
(gdb) l
1       //
2       // Created by root on 11/17/22.
3       //
4       #include <stdio.h>
5       int main()
6       {
7           int a=3;
8           int b=5;
9           printf("a=%d,b=%d\n",a,b);
10          change(&a,&b);
### 一次显示不完,可以继续回车,默认执行前一个命令(l)
(gdb) 
11          printf("a=%d,b=%d\n",a,b);
12          return 0;
13      }
### 输入start,开启单步调试
(gdb) start
Temporary breakpoint 1 at 0x119a: file main.c, line 6.
Starting program: /home/bh/workspace/clearn/gdb/main 
### 单步调试从main开始
Temporary breakpoint 1, main () at main.c:6
6       {
### 输入n,执行单步调试
(gdb) n
7           int a=3;
### 回车,默认执行n,一步一步调试
(gdb) 
8           int b=5;
(gdb) 
9           printf("a=%d,b=%d\n",a,b);
(gdb) 
a=3,b=5
### 执行到外部函数change,先打印
10          change(&a,&b);
### 输入s进入change函数
(gdb) s
change (a=0x55555555527d <__libc_csu_init+77>, b=0x7ffff7fd15e0 <dl_main>) at change.c:6
6       {
### 输入bt打印change
(gdb) bt
#0  change (a=0x55555555527d <__libc_csu_init+77>, b=0x7ffff7fd15e0 <dl_main>) at change.c:6
#1  0x00005555555551f4 in main () at main.c:10
### 输入n单步调试change函数里面的代码
(gdb) n
7           int temp = *a;
(gdb) 
8           *a=*b;
### 输入l列出change里面的代码
(gdb) l
3       //
4       
5       void change(int *a,int *b)
6       {
7           int temp = *a;
8           *a=*b;
9           *b=temp;
10      }
11      
### 打印temp
(gdb) p temp
$1 = 3
### 打印a,发现a是一个地址
(gdb) p a
$2 = (int *) 0x7fffffffe350
### 打印*a,发现*a是对地址(0x7fffffffe350)进行取值
(gdb) p *a
$3 = 3
(gdb) p b
$4 = (int *) 0x7fffffffe354
(gdb) p *b
$5 = 5
(gdb) n
9           *b=temp;
(gdb) 
10      }
(gdb) p b
$6 = (int *) 0x7fffffffe354
(gdb) p *b
$7 = 3
### 此时change的代码执行完毕,按n可回到main,但是我们想主动返回main,可以按f 1返回
### 继续执行n,change执行完毕,返回调用函数main
(gdb) n
main () at main.c:11
11          printf("a=%d,b=%d\n",a,b);
(gdb) 
a=5,b=3
12          return 0;
(gdb) 
13      }
### 退出调试
(gdb) quit
A debugging session is active.

        Inferior 1 [process 11140] will be killed.
### 确认退出
Quit anyway? (y or n) Y
root@ubuntu:/home/bh/workspace/clearn/gdb# 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值