gdb调试工具

时间:2022-06-05 22:14:03

使用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 【显示观察点】