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#