温馨提示×

温馨提示×

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

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

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

发布时间:2022-02-11 10:34:13 来源:亿速云 阅读:211 作者:iii 栏目:开发技术
# 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格式编写,结构清晰,便于阅读和参考。

向AI问一下细节

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

AI