GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。他是学习指针、调试程序非常有用的工具和方法
gdb的常见命令:
简写 | 全称 | 备注 |
---|---|---|
l | list | 显示指定行号或者指定函数附件的源代码 |
b | break | 在指定行号或者指定函数开头处设置断点。如 b main |
r | run | 运行程序,直到程序结束或者遇到断点而停下 |
c | continue | 在程序中断后继续执行程序,直到程序结束或者遇到断点而停下。注意在程序开始执行前只能用r,不能用c |
n | next | 执行下一条语句。如果有函数调用,则把它作为一个整体 |
s | step | 执行下一条语句。如果有函数调用,则需要进入调用函数 |
u | until | 执行到指定行号或者是指定函数的开头 |
p | 显示变量或表达式的值 | |
disp | display | 把一个表达式设置为display,当程序每次停下来时都会显示其值 |
d | delete | 取消断点,和b的格式相同。如果该位置有多个断点,将同时取消 |
i | info | 显示各种信息。如 i b 显示所有断点,i disp显示display,而i lo显示所有局部变量 |
watch | watch | 可以使用watch为表达式(变量)expr设置一个观察点。当表达式值有变化时,马上停住程序 |
实例:
1#include<stdio.h>
2
3 void swap(int *a, int *b)
4 {
5 int t = *a;
6 *a = *b;
7 *b = t;
8 }
9
10 int main()
11 {
12 int a = 3;
13 int b = 4;
14 swap(&a, &b);
15
16 printf("%d %d\n", a, b);
17 return 0;
18 }
/* 第一步:编译程序 */
gcc -g swap.c -std=c99
/* 第二步:运行gdb */
gdb a.out
/* 第三步:查看源代码 */
(gdb)l
1#include<stdio.h>
2
3 void swap(int *a, int *b)
4 {
5 int t = *a;
6 *a = *b;
7 *b = t;
8 }
9
10 int main()
11 {
12 int a = 3;
13 int b = 4;
14 swap(&a, &b);
15
16 printf("%d %d\n", a, b);
17 return 0;
18 }
/* 第四步:加断点并且运行。*/
(gdb)b 8
Breakpoint 1 at 0x4004ee: file swap2.c, line 8.
(gdb)r
Starting program: /home/zhoupiaolong/cstudy/a.out
Breakpoint 1, swap (a=0x7fffffffe4ec, b=0x7fffffffe4e8) at swap2.c:8
8 }
* /第五步:查看调用栈 */
(gdb)bt
#0 swap (a=0x7fffffffe4ec, b=0x7fffffffe4e8) at swap2.c:8
#1 0x0000000000400519 in main () at swap2.c:14
(gdb) p a
$1 = (int *) 0x7fffffffe4ec
(gdb) p b
$2 = (int *) 0x7fffffffe4e8
(gdb) p *a
$3 = 4
(gdb) p *b
$4 = 3
(gdb) up
#1 0x0000000000400519 in main () at swap2.c:14
14 swap(&a, &b);
(gdb) p a
$5 = 4
(gdb) p b
$6 = 3
(gdb) p &a
$7 = (int *) 0x7fffffffe4ec
(gdb) p &b
$8 = (int *) 0x7fffffffe4e8
之前对于gdb还停留在命令行,没想到gdb居然有可视化调试界面,真的是太猛了,只有你想不到的!!!没有做不到的。
但是如果我们在编译连接时上加了-g命令生成的可执行文件,用gdb -tui -q p2psrv(要debug的命令),就可以进入一个类似的可视化的调试界面。
具体使用方法可以看这篇链接里面有详细的命令介绍