💵使用指北-011-gdb

type
status
date
slug
summary
tags
category
icon
password
本文介绍一下 gdb 常见用法。
notion image

1. gdb 介绍

1.1. gdb 介绍

gdb 是 GNU Debugger的简称,是操作系统用户态下,一款非常优秀的调试软件,借助 gdb 可以快速排查,精准定位问题。
自身使用了 C 和 C++ 编写,除了 C/C++ 之外,还支持多种编程语言的调试,比如常见的 D,Go,Object-C,Rust,Fortan等,此外可以通过扩展来调试 Python 语言。
使用 gdb,我们能方便的进行如下任务:
  • 程序运行时,gdb 可以检测当前程序正在做什么事;
  • 程序运行时,修改变量的值;
  • 程序在条件下中断;
  • 监视内存地址变动;
  • 分析程序崩溃后的 core dump 文件

1.2. gdb 优势

gdb 在分析第三方中间件,无源码程序,解决偶发崩溃等问题的利器。使用 gdb 可以在多种环境中对问题进行发现、收集、分析,有着日志无法比拟的优势。此外,gdb 还非常适合对多种语言混合开发的程序进行调试。

1.3. gdb 劣势

  • gdb 可以辅助内存泄漏问题调试,但不能用于检测内存泄漏;
  • gdb 可以辅助性能问题调试,但不能用于程序性能问题分析;
  • gdb 不是编译器,不能运行有编译问题的程序,也不能用来调试编译问题;

2. 安装 gdb

2.1. 发型版安装

不同的发行版,使用的包管理器不同,但 gdb 的包名在发行版中,都叫做 gdb。
对 Debian/Ubuntu 来说:
对 CentOS/AnolisOS来说:

2.2. 源码编译安装

首先获取 gdb 源码,下载地址为 https://ftp.gnu.org/gnu/gdb

3. 准备使用 gdb

3.1. 在 docker 容器内使用 gdb

gdb 需要使用 ptrace 方法发送 PTRACE_ATTACH 请求给被调试进程,用来监视和控制另一个进程。Linux 系统使用 /proc/sys/kernel/yama/ptrace_scope 设置来对 ptrace 施加安全措施,默认 ptrace_scope 的设置的值为 1。默认设置下,进程只能通过 PTRACE_ATTACH 请求,附加到子进程。当设置为 0 时,进程可以通过 PTRACE_ATTACH 请求附加到任何其他进程。
在 docker 容器内,即使是 root 用户,仍可能没有权限修改这个文件,此时需要使用特权模式运行 docker 容器,以便获得 /proc/sys/kernel/yama/ptrace_scope 文件权限。

3.2. 开启 core 文件

core_pattern 说明:
  • /tmp/core:是文件目录与前缀
  • %t:系统时间
  • %e:进程名称
  • %p:进程 PID

3.3. 生成调试符号表

建议使用 -ggdb 代替 -g 进行编译,如果条件允许,使用 -O0 来禁用优化,防止符号表错位。

4. 启动 gdb 的几种方式

4.1. 使用 gdb 加载程序

4.2. 使用 gdb 附加到运行中的进程

4.3. 使用 gdb 调试 core 文件

4.4. 使用 gdb 非阻塞调试

5. 使用 gdb 调试

5.1. 打断点

gdb 调试后,br 加上函数名或行号。

5.2. 分析变量被篡改

gdb 调试后,p 变量名 即可。

5.3. 分析多线程阻塞

多线程阻塞之后,找到主线程的 PID,然后打印线程堆栈。

6. 其他命令

gdb 其他命令参考 --help 执行。

7. 参考

  • 京东科技 孙晓军,《程序员调试利器--GDB 使用指南》
中年码农的困境log-001-我与计算机
飞行日志
常用链接
韭菜搞钱
三省吾身
无问东西
知行合一