使用gdb工具,必须在编译时加上 -g选项
gcc -g main.c -o main
$ gdb a.out
基础指令
列出源码
(gdb) l 1
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <time.h>
4
5 void fun()
6 {
7 printf("---------");
8 }
9
10 int main()
# 打断点
(gdb) b 12
Breakpoint 1 at 0x4005d6: file gdbtest.c, line 12.
# run
(gdb) r
Starting program: /home/fight/demo/code/gdb/aa
Breakpoint 1, main () at gdbtest.c:12
12 srand(time(NULL));
Missing separate debuginfos, use: debuginfo-install glibc-2.17-292.el7.x86_64
# 下一步,执行下一行,系统函数只能用n
(gdb) s
# 下一步,进入函数内部
(gdb) n
# until 19
(gdb) until 17
# 打印变量
(gdb) p age
# 继续
(gdb) continue
直接run,可以找出段错误的位置。
- list 1 打印代码 【或者 l 1】
- r run 【参数列表】
- s step
- n next
- until
- p var 【查看变量】
- ptype var 【查看变量类型】
- continue
- b N 【在第N行打断点】
#
b 12
# 条件断点
b 12 if i=5
- delete N
- finish 【 结束当前函数调用,返回调用点】
- set args 【入口函数参数】
- info
# 查看断点信息
info b
- backtrace | bt【查看函数的调用栈帧,和层级关系】
(gdb) bt
#0 fun () at gdbtest.c:7
#1 0x0000000000400610 in main () at gdbtest.c:15
- frame | f【切换函数的栈帧】
# 从#0栈帧切换到#1栈帧
(gdb) frame 1
#1 0x0000000000400610 in main () at gdbtest.c:15
15 fun();
# 查看栈帧#1 的变量
(gdb) p age
$1 = 100
站帧:随着函数调用而在stack上开辟的一片内存空间。用于存放函数调用时产生的局部变量和临时值。
- display var 【跟踪变量】
(gdb) display age
1: age = 100
(gdb) n
age is : 100
15 fun();
1: age = 100
- undisplay var 【取消跟踪】
(gdb) undisplay 1 # 跟踪的变量编号
- enable breakpoints
- disable breakpoints
- watch 【被设置观察点的变量发生变化是,显示打印】
- i watch 【显示观察点】