GDB动态调试学习-2-【断点 观察点】

文章目录

在程序地址上打断点

当调试汇编程序,或者没有调试信息的程序时,经常需要在程序地址上打断点,方法为b *address。例如:

停在了断点的位置

在程序入口处打断点

获取程序入口地址

bash 复制代码
readelf -h  可执行文件名
bash 复制代码
info files

运行后再执行info file

注意程序入口点地址是_start函数的起始地址

start 指令启动程序,完全等价于先在 main() 主函数起始位置设置一个断点,然后再使用 run 指令启动程序。
另外,程序执行过程中使用 run 或者 start 指令,表示的是重新启动程序。

在命名空间设置断点

命名空间

命名空间(英语:Namespace),也称命名空间、名称空间等,它表示着一个标识符(identifier)的可见范围。一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。这样,在一个新的命名空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,因为已有的定义都处于其他命名空间中。
例如,设Bill是X公司的员工,工号为123,而John是Y公司的员工,工号也是123。由于两人在不同的公司工作,可以使用相同的工号来标识而不会造成混乱,这里每个公司就表示一个独立的命名空间。如果两人在同一家公司工作,其工号就不能相同了,否则在支付工资时便会发生混乱。

给命名空间的函数下断电

c 复制代码
namespace Foo
{
  void foo()
  {
  }
}

namespace
{
  void bar()
  {
  }
}
int main()
{


  return 0;
}
bash 复制代码
info functions     查看函数

在文件行号上打断点

此时编译带调试信息-g

且linenum对应到的是源码文件的main函数的第几行

bash 复制代码
b linenum或者b file:linenum

保存已经设置的断点

在GDB中,你可以使用save命令来保存你的断点。以下是如何使用这个命令的步骤:

  • 首先,你需要设置你想要的断点。你可以使用break命令来设置断点。例如,如果你想在函数foo上设置一个断点,你可以输入break foo。

  • 一旦你设置了断点,你可以使用info breakpoints命令来查看你已经设置的所有断点。

  • 最后,你可以使用save命令来保存你的断点。你可以选择保存到一个特定的文件中,例如,save breakpoints my_breakpoints将会把断点保存到my_breakpoints文件中。

注意:save命令将会保存所有的断点,不仅仅是你刚刚设置的那个。

在GDB中,source指令用于执行一个文件作为GDB命令序列。

source指令非常有用,尤其是在你需要重复执行一系列复杂的命令时。你可以将这些命令写入一个脚本文件,然后使用source指令来执行这个文件中的命令,这样可以大大提高调试效率。例如,如果你有一个包含多个断点和观察点的复杂调试会话,你可以将所有的设置保存到一个脚本中,下次调试时只需加载这个脚本即可。

设置临时断点

在使用gdb时,如果想让断点只生效一次,可以使用"tbreak"命令(缩写为:tb)。

设置条件断点

在GDB中,你可以使用break命令来设置条件断点。条件断点允许你指定一个表达式,只有当该表达式的值为真时,程序才会在该处停止执行。

以下是如何设置条件断点的步骤:

首先,你需要设置你想要的断点。你可以使用break命令来设置断点。例如,如果你想在函数foo上设置一个断点,你可以输入break foo。

然后,你可以使用condition命令来为该断点添加条件。例如,如果你想要只在变量x大于10时在该断点处停止执行,你可以输入condition 1 x>10。

最后,你可以使用info breakpoints命令来查看你已经设置的所有断点及其条件。

注意:如果条件表达式的结果为假,则程序将不会在该处停止执行。此外,你也可以使用commands命令来指定在满足条件时要执行的命令序列。

忽略断点

在设置断点以后,可以忽略断点,命令是"ignore bnum count":意思是接下来count次编号为bnum的断点触发都不会让程序中断,只有第count + 1次断点触发才会让程序中断。以上面程序为例:

相关推荐
无聊的小坏坏1 分钟前
Select 服务器实战教学:从 Socket 封装到多客户端并发
服务器·select·io多路复用
一勺菠萝丶10 分钟前
芋道后端部署后总自己挂?从 Nginx 报错到 OOM Kill 的完整排查与修复(2核2G 服务器实战)
服务器·chrome·nginx
梁正雄22 分钟前
linux服务-Bonding网卡绑定工具
linux·运维·linux bonding·网卡绑定
云边有个稻草人26 分钟前
Windows 里用 Linux 不卡顿?WSL + cpolar让跨系统开发变简单
linux·运维·服务器·cpolar
打不了嗝 ᥬ᭄27 分钟前
【Linux】网络层协议
linux·网络·c++·网络协议·http
LXY_BUAA1 小时前
将linux操作系统装入U盘20251107
linux·运维·服务器
IDC02_FEIYA1 小时前
Discuz论坛管理员怎么重置修改用户密码?
运维·服务器
lingggggaaaa1 小时前
小迪安全v2023学习笔记(一百四十五讲)—— Webshell篇&魔改冰蝎&打乱特征指纹&新增加密协议&过后门查杀&过流量识别
笔记·学习·安全·魔改冰蝎·免杀对抗·免杀技术
九河云2 小时前
华为云ECS与Flexus云服务器X实例:差异解析与选型指南
大数据·运维·服务器·网络·人工智能·华为云
kaoa0002 小时前
Linux入门攻坚——53、drbd - Distribute Replicated Block Device,分布式复制块设备-2
linux·运维·服务器