【Linux】调试器:gdb 的基本使用

2023-11-04

gdb 全称 GNU symbolic debugger,是 Linux 下常用的程序调试器。

调试器的核心工作,主要是为了定位问题。废话不多说。


前序工作

gdb 的安装

yum install gdb	# root用户

另外: gcc、g++ 默认形成的版本是 release,不是 debug 版本!所以想要在 Linux 下调试程序,需要在 Makefile 文件 中,添加 -g 选项 指定以 dubug 方式编译程序,如下:

mytest:test.c
	gcc -o mytest test.c -g -std=c99
	
.PHONY:clean
clean:
	rm -f myprocess

其中

目标文件 可以用 $@ 代替
:右侧所有文件的依赖链表,可以用 $^ 代替

比如上面的 Makefile 文件内容就可以编辑成如下:

mytest:test.c
	gcc -o $@ $^ -g -std=c99
	
.PHONY:clean
clean:
	rm -f myprocess

readelf

读取可执行程序的信息:
可执行的二进制程序遵循的规则就是 elf 格式

readelf -S [可执行程序名称] 

可以查看 debug 版本里的调试信息

readelf -S [可执行程序的 debug 版本名称] | grep -i debug
readelf -S [可执行程序的 release 版本名称] | grep -i debug
 # 输入上述代码就不会出现调试信息,因为 release 是“用户版本”

基本操作

所有的查看语句,都不影响调试

l:显示代码(list)
  • 第一次输入 带行号,意味着从第几行开始打印
  • 后面就只需要输 l 不用带行号了
  • 再后面直接敲 回车
# 第一次
l [行号]
# 之后
l
r:运行程序 / 开始调试(run)
  • 运行程序
r
b:打断点(breakpoint)
  • 可以在 行号处 打断点
  • 可以在 函数名处 打断点
# 在 行号处 打断点
b [行号]
# 在 函数名处 打断点 
b [函数名]
info b:查看 断点(information)
  • 查看所有断点信息
  • 重要信息包括:编号 Num、断点的位置描述 What、断点是否可用 Enb…
info b
d:删除 断点(delete)
  • 删除相应编号的断点
  • 断点编号 可以输入 info b 查看
  • 不加断点编号,意味着 删除所有断点
# 删除相应编号的断点
d [断点编号]
# 删除所有断点
d 
disable:关闭 断点
  • 保留 断点 但不使用,对 暂时不需要 又 不便删除 的断点保留
  • 编号可以输入 info b 查看
disable breakpoint [断点编号]
enable:打开 断点
  • 打开 关闭的断点
  • 编号可以输入 info b 查看
enable breakpoint [断点编号]
n:逐过程(next)
  • 逐过程,不进入函数
n
s:逐语句(step)
  • 可以进入函数
s
bt:查看函数调用信息
  • 调用函数就要压栈,bt 可以查看程序带哦用函数的过程
bt
p:临时 查看 变量 / 表达式 此时的数值
  • 显示当前值,单次
p [变量 / 表达式]
display:常显示 变量 / 表达式 此时的数值
  • 设置后,每次走 n 的时候都可以将其数值打印出来供我们观测
  • 可以显示:内置类型,结构体自定义类型,stl…
display [变量 / 表达式]
undisplay:取消 常显示
  • 输入常显示的编号才能读取
undisplay [常显示编号]
until:执行区间代码
  • 在函数内,进行指定位置跳转,执行完区间代码
until [行号]
finish:执行 但 不进入 函数
  • 在函数所在行使用,将函数执行完就停下来
finish
finish:执行 但 不进入 函数
  • 在函数所在行使用,将函数执行完就停下来
finish
c:运行到下个断点处(continue)
  • 从一个断点处,直接运行到下一个断点处
c
set var:设置函数变量
  • 设置某一个函数变量为特定的值,便于观测在该值下的运行结果
set var [n = xxx]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Linux】调试器:gdb 的基本使用 的相关文章

  • vmsplice() 和 TCP

    在原来的vmsplice 执行 有人建议 http lwn net Articles 181169 如果您的用户态缓冲区是管道中可容纳的最大页面数的 2 倍 则缓冲区后半部分成功的 vmsplice 将保证内核使用缓冲区的前半部分完成 但事
  • 如何使用 JSch 将多行命令输出存储到变量中

    所以 我有一段很好的代码 我很难理解 它允许我向我的服务器发送命令 并获得一行响应 该代码有效 但我想从服务器返回多行 主要类是 JSch jSch new JSch MyUserInfo ui new MyUserInfo String
  • FileOutputStream.close() 中的设备 ioctl 不合适

    我有一些代码可以使用以下命令将一些首选项保存到文件中FileOutputStream 这是我已经写了一千遍的标准代码 FileOutputStream out new FileOutputStream file try BufferedOu
  • 为什么 Linux 没有 DirectX API?

    在考虑现代显卡的 Windows 系统上 DirectX API 的驱动程序端实现时 我想知道为什么此实现在非 Windows 系统 尤其是 Linux 上不可用 由于明显缺乏此功能 我只能假设有一个我无视的充分理由 但在我的原始理解中 我
  • 适用于 Linux 的轻量级 IDE [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • docker 非 root 绑定安装权限,WITH --userns-remap

    all 尝试让绑定安装权限正常工作 我的目标是在容器中绑定安装卷 以便 a 容器不以 root 用户身份运行入口点 二 docker daemon 配置了 userns remap 这样容器 主机上没有 root c 我可以绑定挂载和读 写
  • 如何为 Linux 桌面条目文件指定带有相对路径的图标?

    对于我的一个 Linux 应用程序 我有应用程序二进制文件 一个 launcher sh 脚本 针对 LD LIBRARY PATH 和一个 desktop 文件 所有这些都位于同一文件夹中 我想使用图标的相对路径而不是绝对路径 我试过了
  • 使用 \r 并打印一些文本后如何清除控制台中的一行?

    对于我当前的项目 有一些代码很慢并且我无法使其更快 为了获得一些关于已完成 必须完成多少的反馈 我创建了一个进度片段 您可以在下面看到 当你看到最后一行时 sys stdout write r100 80 n I use 80覆盖最终剩余的
  • 如何使用 Cloud Init 挂载未格式化的 EBS 卷

    Context 我正在使用https wiki jenkins io display JENKINS Amazon EC2 Plugin https wiki jenkins io display JENKINS Amazon EC2 Pl
  • Linux 上的静态 Qt5 构建:部署时如何处理字体?

    我使用这些配置选项创建了 Qt 5 2 0 库的静态版本 Ubuntu 12 04 开源 确认许可 force pkg config 发布 静止的 前缀 home juzzlin qt5 无icu opengl桌面 无油嘴滑舌 辅助功能 n
  • linux-x64 二进制文件无法在 linuxmusl-x64 平台上使用错误

    我正在安装Sharp用于使用 package json 的 Nodejs 项目的 docker 映像上的映像压缩包 当我创建容器时 我收到有关 Sharp 包的以下错误 app node modules sharp lib libvips
  • 执行“minikube start”命令时出现问题

    malik malik minikube start minikube v1 12 0 on Ubuntu 18 04 Using the docker driver based on existing profile Starting c
  • 尽管 if 语句,Visual Studio 仍尝试包含 Linux 标头

    我正在尝试创建一个强大的头文件 无需更改即可在 Windows 和 Linux 上进行编译 为此 我的包含内容中有一个 if 语句 如下所示 if defined WINDOWS include
  • 在 Mono 上运行 .Net MVC5 应用程序

    我正在 Windows 上的 Visual Studio 2013 中开发 Net 4 5 1 MVC5 应用程序 现在我想知道 是否可以在Linux Ubuntu 12 04 上运行这个应用程序 可以使用OWIN吗 Owin 可以自托管运
  • 使用包管理器时如何管理 Perl 模块?

    A 最近的问题 https stackoverflow com questions 397817 unable to find perl modules in intrepid ibex ubuntu这让我开始思考 在我尝试过的大多数 Li
  • 使用 python 脚本更改 shell 中的工作目录

    我想实现一个用户态命令 它将采用其参数之一 路径 并将目录更改为该目录 程序完成后 我希望 shell 位于该目录中 所以我想实施cd命令 但需要外部程序 可以在 python 脚本中完成还是我必须编写 bash 包装器 Example t
  • linux下如何从文本文件中获取值

    我有一些文本格式的文件 xxx conf 我在这个文件中有一些文本 disablelog 1 当我使用 grep r disablelog oscam conf 输出是 disablelog 1 但我只需要值1 请问你有什么想法吗 一种方法
  • 如何让 Node.js 作为后台进程运行并且永不死掉?

    我通过 putty SSH 连接到 linux 服务器 我尝试将其作为后台进程运行 如下所示 node server js 然而 2 5 小时后 终端变得不活动 进程终止 即使终端断开连接 我是否也可以使进程保持活动状态 Edit 1 事实
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的

随机推荐

  • IOU(Intersection Over Union) 概念清晰图解 + python代码示例

    IOU Intersection Over Union 交并比 Intersection over Union IoU 目标检测中使用的一个概念 是产生的候选框 candidate bound 与原标记框 ground truth boun
  • C++ gstreamer函数使用总结

    目录 1 GSteamer的基本API的使用 这个播放mp4报错 这个创建play bin 返回0 不能运行 这个值得看 2 创建元件并且链接起来 3 添加衬垫 添加回调 手动链接衬垫 4 打印gstreamer的版本信息 5 gstrea
  • vim-指定区域查找替换

    vim中的区域查找替换 vim这么强大的工具当然是支持只替换一部分文本啦 那么怎么实现呢 最直接的方式 1 用v选中文本 2 然后 这样的话 命令默认形式是 lt gt s source source abc g 繁琐的方法 a bg fr
  • C/S与P2P的主要区别以及相同点

    C S方式所描述的是进程之间服务和被服务的关系 客户是服务的请求方 服务器是服务的提供方 服务的请求方和提供方都要使用网络核心部分所提供的服务 客户程序被用户调用后运行 在通信时主动向远地服务器发起通信 服务请求 因此 客户程序必须知道服务
  • Python爬虫系列(二)——Python爬虫批量下载百度图片

    1 前言 先贴代码 coding utf8 import requests import json from urllib import parse import os import time class BaiduImageSpider
  • 关于LayUI 表格高度解决方案

    需求是这样式的 我有一个产品列表 但是我想在产品列表中显示产品主图信息 本文只涉及LayUI技巧 不涉及JAVA JS 渲染部分 table render cellHeight 300 elem currentTableId url Pro
  • AIX 上压缩与解压缩

    gz gzip d 或 gunzip gzip Z uncompress compress tar tar xvf tar cvf cpio cpio idumv zip unzip 或 jar xvf tar gz gzip dc tar
  • 心跳包实现的另一种机制

    因为工作关系 经常用到心跳包 之前是在服务端中的连接的实体中保持一个timer 每秒加一 每次服务端接到客户端的心跳 就会把计数置为0 当累加到20秒的时候 服务端会接到客户端抛出的掉线函数回调 就会视为客户端掉线 然后从缓存中删掉掉线用户
  • 一次性搞懂什么是AIGC!

    你知道什么是AIGC吗 不知道 没关系 我来告诉你 AIGC就是人工智能生成内容 Artificial Intelligence Generative Content 也就是让AI自己动手创作各种各样的内容 比如图片 视频 音乐 文字等等
  • DNSPod 查看域名解析的 domain_id 和 record_id

    本文介绍调用 API 获取 DNSPod 域名解析需要的 domain id 和 record id 参数的方法 所有的 DNSPod API 请求都必须提供 login token作为公共参数以验证用户身份是否合法 获取 login to
  • 软件版本命名规范

    1 版本命名规范 1 2 3 20190114 rc 由四部分组成 第一位 1 主版本号 当功能模块有较大的变动 比如增加多个模块或者整体架构发生变化 此版本号由项目决定是否修改 第二位 2 子版本号 当功能有一定的增加或变化 比如增加了对
  • [小程序实现保存图片到相册]

    保存图片到相册 实现逻辑 首先查看用户申请过的权限中是否有 保存图片到相册 如果没有这个权限 则需要先申请权限 弹窗授权 如果用户同意授权则保存图片 如果用户不同意 则跳转到设置页 重新授权 然后再保存图片 查看用户申请的全县有哪些 通过微
  • Httpservlet cannot be resolved to a type的原因与解决方法

    刚开始学习Servlet 在Eclipse中新建了一个Servlet 不过页面上报错 Httpservlet cannot be resolved to a type 显然是Eclipse找不到相应的包 即javax servlet 原因
  • 重建控制文件 recreate control file

    简单总结如下 1 启动到mount2 执行Alter database backup controlfile to trace 3 找到第2步生成的trace文件 并作相应修改 只保留创建语句4 shutdown并启动到nomount 执行
  • 2023备战金三银四,Python自动化软件测试面试宝典合集(二)

    马上就又到了程序员们躁动不安 蠢蠢欲动的季节 这不 金三银四已然到了家门口 元宵节一过后台就有不少人问我 现在外边大厂面试都问啥 想去大厂又怕面试挂 面试应该怎么准备 测试开发前景如何 面试 一个程序员成长之路永恒绕不过的话题 每每到这个时
  • DETR,YOLO模型计算量(FLOPs)参数量(Params)

    前言 关于计算量 FLOPs 参数量 Params 的一个直观理解 便是计算量对应时间复杂度 参数量对应空间复杂度 即计算量要看网络执行时间的长短 参数量要看占用显存的量 计算量 FLOPs FLOP时指浮点运算次数 s是指秒 即每秒浮点运
  • scrapy框架之item pipeline的使用

    转载 https blog csdn net kuangshp128 article details 80321099 一 关于scrapy中pipleline的基本认识 Item Pipeline又称之为管道 顾名思义就是对数据的过滤处理
  • 集线器端口上的电涌:一个USB设备超过其集线器端口的电源限制

    集线器端口上的电涌 一个USB设备超过其集线器端口的电源限制 花了三个小时查阅了大量资料 终于把这个问题大致弄清楚了 差点全盘格式化 主要是因为不认盘的缘故 以为分区表全部损坏 我一开始就怀疑是供电不足 当然以前也碰到过类似的情况 通常重启
  • MySQL数据库查询字符串数据格式之不足自动填充“0”字符以达到指定位数

    MySQL数据库查询字符串数据格式之不足自动填充 0 字符以达到指定位数 在MySQL数据库中 很多时候我们的数据会跟我们想要的输出结果有出入 例如在数据库中 如果我们保存的是1 但是我们需要他输出显示的是001 那就需要我们在数据1的前面
  • 【Linux】调试器:gdb 的基本使用

    文章目录 前序工作 readelf 基本操作 l 显示代码 list r 运行程序 开始调试 run b 打断点 breakpoint info b 查看 断点 information d 删除 断点 delete disable 关闭 断