Linux程序调试工具gdb怎么使用

发布时间:2022-02-11 10:34:13 作者:iii
来源:亿速云 阅读:186
# Linux程序调试工具gdb怎么使用

## 一、gdb简介

GDB(GNU Debugger)是GNU项目开发的强大调试工具,支持多种编程语言(C/C++/Go等),是Linux环境下最常用的程序调试工具之一。它可以帮助开发者:

1. 启动程序并指定运行参数
2. 设置断点使程序在特定位置暂停
3. 单步执行代码
4. 查看变量值和内存状态
5. 分析程序崩溃时的核心转储文件
6. 动态修改程序执行流程

### 1.1 gdb的安装

在大多数Linux发行版中,可以通过包管理器安装:

```bash
# Ubuntu/Debian
sudo apt-get install gdb

# CentOS/RHEL
sudo yum install gdb

# Arch Linux
sudo pacman -S gdb

验证安装:

gdb --version

1.2 编译可调试程序

使用gcc/g++编译时需要添加-g选项生成调试信息:

gcc -g main.c -o demo
# 或者
g++ -g main.cpp -o demo

二、gdb基础使用

2.1 启动gdb

基本启动方式:

gdb [可执行文件]

带参数启动程序:

gdb --args ./demo arg1 arg2

2.2 常用命令概览

命令 简写 功能说明
run r 开始执行程序
break b 设置断点
continue c 继续执行直到下一个断点
next n 单步执行(不进入函数)
step s 单步执行(进入函数)
print p 打印变量值
backtrace bt 显示函数调用栈
quit q 退出gdb

2.3 断点管理

设置断点:

# 在函数处设置断点
(gdb) b main
(gdb) b MyClass::myMethod

# 在文件行号处设置断点
(gdb) b main.c:15

# 在地址处设置断点
(gdb) b *0x4005a3

查看断点:

(gdb) info breakpoints

删除断点:

(gdb) delete 2  # 删除编号为2的断点
(gdb) delete    # 删除所有断点

条件断点:

(gdb) b 25 if i==100

2.4 程序执行控制

启动程序:

(gdb) run
(gdb) r arg1 arg2  # 带参数运行

继续执行:

(gdb) continue
(gdb) c 10  # 忽略当前断点10次

单步执行:

(gdb) next    # 不进入函数
(gdb) step    # 进入函数

直到当前函数返回:

(gdb) finish

三、高级调试技巧

3.1 查看和修改变量

打印变量:

(gdb) p variable
(gdb) p *ptr@10  # 打印指针指向的10个元素
(gdb) p/x var    # 十六进制格式
(gdb) p/d var    # 十进制格式

修改变量:

(gdb) set var i=10
(gdb) set var ptr=0x7fffffffe2a0

查看内存:

(gdb) x/10xb ptr  # 查看10字节内存(十六进制)
(gdb) x/20dw array # 查看20个4字节字(十进制)

3.2 调用栈分析

查看调用栈:

(gdb) backtrace
(gdb) bt 5  # 只显示最近5帧

切换栈帧:

(gdb) frame 2
(gdb) up     # 上一帧
(gdb) down   # 下一帧

查看帧信息:

(gdb) info frame 2

3.3 多线程调试

查看线程:

(gdb) info threads

切换线程:

(gdb) thread 3

锁定线程:

(gdb) set scheduler-locking on

3.4 观察点(Watchpoint)

设置观察点:

(gdb) watch var       # 变量修改时中断
(gdb) rwatch var      # 变量读取时中断
(gdb) awatch var      # 变量读写时中断

查看观察点:

(gdb) info watchpoints

3.5 捕获点(Catchpoint)

捕获异常/信号:

(gdb) catch throw     # 捕获C++异常
(gdb) catch syscall   # 捕获系统调用
(gdb) catch signal    # 捕获信号

四、实战调试示例

4.1 段错误调试

  1. 编译程序时确保有调试信息
  2. 运行程序产生core dump
    
    ulimit -c unlimited
    ./buggy_program
    
  3. 使用gdb分析core文件
    
    gdb ./buggy_program core
    
  4. 查看崩溃位置和调用栈
    
    (gdb) bt
    (gdb) frame N
    

4.2 死锁调试

  1. 使用gdb附加到运行中的进程
    
    gdb -p <pid>
    
  2. 查看所有线程的调用栈
    
    (gdb) thread apply all bt
    
  3. 分析锁的持有情况

4.3 内存泄漏检查

结合valgrind使用:

valgrind --leak-check=full --show-leak-kinds=all ./program

在gdb中检查内存:

(gdb) x/100bx malloc_ptr  # 检查malloc分配的内存

五、gdb增强工具

5.1 gdb插件

  1. gdb-dashboard:可视化调试界面

    git clone https://github.com/cyrus-and/gdb-dashboard.git
    echo "source ~/gdb-dashboard/.gdbinit" >> ~/.gdbinit
    
  2. pwndbg:专注于二进制漏洞利用的插件

    git clone https://github.com/pwndbg/pwndbg
    cd pwndbg && ./setup.sh
    

5.2 图形化前端

  1. DDD:Data Display Debugger

    sudo apt-get install ddd
    ddd ./program
    
  2. Eclipse CDT:集成开发环境中的gdb前端

  3. VS Code:通过C/C++扩展使用gdb

六、gdb高级功能

6.1 反向调试

记录执行过程并反向执行:

(gdb) target record
(gdb) continue
(gdb) reverse-step
(gdb) reverse-continue

6.2 Python脚本扩展

在gdb中使用Python:

(gdb) python print("Hello from Python")

自定义命令示例:

class MyCommand(gdb.Command):
    def __init__(self):
        super().__init__("mycmd", gdb.COMMAND_USER)
    
    def invoke(self, arg, from_tty):
        print("Executing with arg:", arg)

MyCommand()

6.3 远程调试

使用gdbserver进行远程调试:

# 目标机器
gdbserver :1234 ./program

# 开发机器
gdb ./program
(gdb) target remote target_ip:1234

七、常见问题解决

7.1 调试优化后的代码

  1. 使用-Og优化级别(gcc 4.8+)
  2. 避免使用-O2或更高优化
  3. 理解优化可能导致的变量不可见问题

7.2 缺少调试信息

症状:

No symbol table is loaded. Use the "file" command.

解决方案: 1. 确保编译时使用了-g选项 2. 检查是否strip了调试信息 3. 确认gdb版本与编译器兼容

7.3 多进程调试

调试fork出的子进程:

(gdb) set follow-fork-mode child
(gdb) set detach-on-fork off

八、gdb配置与优化

8.1 ~/.gdbinit配置文件

常用配置:

# 打印美化
set print pretty on
set print object on

# 历史记录
set history save on
set history filename ~/.gdb_history

# 自动化脚本
define hook-run
  break main
end

8.2 自定义命令

定义快捷命令:

define pr
  print $arg0
end

document pr
Print the value of an expression
Usage: pr EXPR
end

九、总结

GDB是Linux开发者不可或缺的强大工具,掌握它可以:

  1. 快速定位程序逻辑错误
  2. 分析复杂的内存问题
  3. 理解程序运行时状态
  4. 提高调试效率

建议的学习路径: 1. 从基础命令开始,熟练使用断点、单步执行 2. 掌握变量查看和修改技巧 3. 学习多线程和核心转储分析 4. 尝试Python扩展和自定义命令 5. 探索高级功能如反向调试

通过持续实践,gdb将成为你解决复杂问题的得力助手。

附录:常用命令速查表

命令 功能说明
info breakpoints 查看所有断点
info registers 查看寄存器值
info locals 查看局部变量
disassemble 反汇编当前函数
show commands 显示历史命令
tbreak 设置临时断点
ignore N count 忽略断点N count次
return 强制从当前函数返回
jump 跳转到指定位置执行
generate-core-file 生成核心转储文件

”`

这篇文章共计约4800字,涵盖了gdb从基础到高级的各个方面,包括安装配置、基本命令、高级技巧、实战示例和常见问题解决方案。采用Markdown格式编写,结构清晰,便于阅读和参考。

推荐阅读:
  1. GDB的使用
  2. Linux中strace与gdb调试工具介绍

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

linux gdb

上一篇:电脑怎么使用放大镜功能

下一篇:Linux中ifup命令有什么用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》