当前位置:首页 > 技术 > 正文内容

GDB调试器常用命令速查

访客 技术 2026年6月3日 2

1. GDB调试基础

在使用GDB进行程序调试前,需要在编译时添加调试符号信息。

1.1 编译带调试信息的程序

使用GCC编译时添加-g选项可生成GDB所需的调试信息:

gcc [其他编译选项] -g 源文件.c -o 可执行文件

1.2 查看源代码

# 启动GDB调试程序
$ gdb 可执行文件名

# 显示源代码(默认向后显示)
(gdb) list

# 向前显示源码
(gdb) list -

# 设置每次显示的源代码行数
(gdb) set listsize 数量

# 查看当前显示行数设置
(gdb) show listsize

2. 常用调试命令

2.1 断点管理

# 添加源码搜索路径
(gdb) dir 代码目录路径

# 在指定位置设置条件断点
(gdb) b 源文件.c:行号 if 变量名>=值

# 禁用指定编号的断点
(gdb) dis 断点编号

# 启用指定编号的断点
(gdb) en 断点编号

# 删除指定编号的断点
(gdb) del 断点编号

# 查看所有断点信息
(gdb) info b

2.2 程序执行控制

# 单步执行(不进入函数)
(gdb) n

# 单步执行(进入函数内部)
(gdb) s

# 监视变量值变化
(gdb) watch 变量名

# 打印变量值
(gdb) print 变量名

# 查看结构体成员
(gdb) print 结构体变量.成员名

# 格式化输出
(gdb) printf "输出格式\n", 变量1, 变量2

# 设置变量值
(gdb) set var 变量名=新值

2.3 窗口操作

# 切换到源码窗口
(gdb) focus src

# 切换到命令窗口
(gdb) focus cmd

# 调整窗口高度
(gdb) winheight CMD +20

2.4 自定义命令

可以通过define关键字定义GDB宏命令:

(gdb) define 自定义命令名
> print 变量1
> print 变量2
> end

2.5 内存操作

# 打印数组片段(从索引10开始打印100个元素)
(gdb) p 数组名[10]@100

# 导出内存数据到文件
(gdb) dump mem 保存文件名 起始地址 结束地址

# 附加到正在运行的进程
(gdb) attach 进程ID

3. 配置文件~/.gdbinit

GDB启动时会自动加载用户主目录下的.gdbinit文件,可在其中设置常用配置和自定义命令:

# 美化结构体输出格式
set print pretty on

# 设置打印元素数量上限
set print elements 200

# 允许设置延迟解析的断点
set breakpoint pending on

# 自定义打印坐标的命令(支持参数)
define pxy
    printf "坐标: index=%d x=%.2f y=%.2f\n", index, x, y
    p $arg0 * x
    p $arg1 * y
end

# 启动时自动设置的断点
b test.cc:125

4. 堆栈调试

4.1 查看调用栈

# 显示堆栈信息(-3表示底部往上3层)
(gdb) bt -3

# 切换到指定栈帧
(gdb) f 帧编号

# 向栈顶方向移动n层
(gdb) up n

# 向栈底方向移动n层
(gdb) down n

4.2 查看栈帧信息

# 查看当前栈帧详细信息
(gdb) info f

# 查看当前函数的参数值
(gdb) info args

# 查看当前函数的局部变量
(gdb) info locals

5. 打印C++标准容器

.gdbinit中添加Python脚本来支持STL容器打印:

python
import sys
sys.path.insert(0, '/usr/share/gcc-版本号/python')
from libstdcxx.v6.printers import register_libstdcxx_printers
register_libstdcxx_printers(None)
end

启用后可直接使用print命令查看vector、map、string等容器的内容。

6. 设置程序运行参数

通过set args命令可以指定程序启动时的命令行参数:

(gdb) set args -e "print('hello world')"
(gdb) r

# 输出结果:
> Starting program: /path/to/program -e "print('hello world')"
> hello world
标签: Debugging

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。