了解GDB

GDB

The GNU Project Debugger

GDB支持哪些语言

gdb —version

基本命令与快速开始

gcc 编译

gcc test.c

运行

./a.out

添加调试选项

gcc -g test.c

运行

gdb ./a.out

此时已经进入到gdb当中

运行

r 或者 run

退出gdb模式

quit

了解常用的十几种指令

man gdb

打断点

  • 在某个函数前打断点

    • b main (在main函数前打断点)b:break

  • 在某一行打断点

    • b 9 (在第九行打断点)

  • 删除断点

    • 可以使用 clear 或者 delete 命令进行删除
1
2
3
4
5
(gdb) clear location

// 参数 location 通常为某一行代码的行号或者某个具体的函数名。当 location 参数为某个函数的函数名时,表示删除位于该函数入口处的所有断点。
ex:
clear hello_world.cc:8
  • 使用delete
1
2
delete [breakpoints] [num]
// breakpoints 参数可有可无,num 参数为指定断点的编号,可以使用`info b`获取index,其可以是 delete 删除某一个断点,而非全部。

查看源代码

list

获取断点相关信息

info b

在有断点的情况下运行

r

发现断点生效

单步调试

n (next)

打印变量信息 print

此时,想查看数组里面的值,变量的地址

print p

p arr[0]

走进某个函数 step

发现程序跳到第4行,进入到这个函数中,再继续运行

GDB的一些技巧

通过shell 调用终端的命令

日志功能

set logging on

日志输出到gdb.txt

watch point 观察点

观察变量是否发生变化

比如循环变量i ,将i的地址设置成 watch point

变量发生了变化

catch point 捕捉点

捕捉异常点

check point 快照

调试程序

往往调试的是core文件,而不是二进制文件

  • 调试一个正在运行的进程

调试core文件

segmentation fault 发生了段错误

访问了非法内存

查看core相关的内容

  • core文件不会自动生成,shell做了一些限制

man ulimit

ulimit -a

修改core文件大小限制 core file size

1
ulimit -c unlimited

发现core file size 已被修改

  • 然后再运行./a.out
  • 发现有个core dumped,同时生成了core文件core.19761

根据core文件查看,为何程序挂掉

1
gdb ./a.out core.19761

里面说,再第七行*temp=10报错 段错误

找到了发生段错误的地方

查询man手册

如何调试一个正在运行的进程

  • 通过进程号访问
  • 查询程序进程号
1
./a.out &
  • gdb通过进程号访问程序
1
gdb -p [process-id]

让这个程序后台执行。返回一个进程号。

  • 通过进程号访问正在运行的进程

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2020-2023 cyg
  • 访问人数: | 浏览次数: