当前位置: 首页 > news >正文

【GDB】 断点的相关设置

GDB 断点的相关设置

本文使用GPT总结了GDB中断点的相关操作,同时从其中提取了本人比较常用的一些操作命令

第一节 为本人亲自总结/摘抄,第二节为GPT生成(高亮部分是本人补充的)

一、省流总结

1.1 设置断点

1.1.1 普通设置

假设是只有一个源cpp文件编译生成的可执行程序,那么最简单的方法就是按照源代码行号打断点。

(gdb) break 12;//等价于b 12;

这样就是在该源文件第12行设置一个断点

1.1.2 按函数设置

(gdb) break main

这会在程序的 main 函数处设置一个断点。

1.1.3 按源文件名:行号设置

如果需要指定断点的具体位置,可以使用文件名和行号。==(可以用来调试多文件项目)==例如:

(gdb) break main.c:10

1.2 断点的暂停/继续 使用

  • 使用 disable 命令禁用断点。例如:

    (gdb) disable 1
    

    这将禁用编号为 1 的断点。

  • 使用 enable 命令启用断点。例如:

    (gdb) enable 1
    

    这将启用编号为 1 的断点。

1.3 断点的删除

  • 使用 delete 命令删除断点。例如:

    (gdb) delete 1
    

    这将删除编号为 1 的断点。

  • 如果需要删除所有断点,可以使用:

    (gdb) delete breakpoints
    
  • 如果删除一个集合(几到几)的断点可以使用:(参考https://blog.csdn.net/yangzhongxuan/article/details/6901477)

    (gdb) delete 2-8
    

1.4 查看断点

1.3删除断点是根据对应的断点编号来进行删除的,而断点的编号信息的查看也是不可或缺的。

使用 info breakpoints 命令查看所有断点的信息

(gdb) info breakpoints
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x0000000000000911 in main() at array.cpp:12
(gdb) 

二、参考的GPT解释

高亮的文字均为本人给GPT补充上去的

GDB(GNU 调试器)中的断点管理是一项非常重要的功能,它可以帮助开发者调试程序。断点的作用是在程序执行到特定位置时暂停,以便检查程序的状态和变量。以下是有关 GDB 断点管理的相关内容:

1. 断点类型

  • 断点(breakpoints) :这是最常见的断点类型,用于在程序执行到某个位置时暂停。可以在函数调用前、循环的特定迭代等关键点设置中断,以便检查程序的行为。
  • 观察点(watchpoints) :观察点用于监视特定变量或内存位置的值何时被读取或修改。当变量值发生变化时,程序会暂停。
  • 捕获点(catchpoints) :捕获点用于捕获异常,例如 C++ 程序中的异常被抛出时,程序会暂停。通过设置捕获点,可以分析异常的根源。
  • 中断点(tracepoints) :中断点允许程序继续执行,但会在触发中断点时收集特定的信息。与单纯的断点不同,中断点不会导致程序暂停,而是记录程序此时的状态信息。

2. 操作断点

  • 设置断点

    • 使用 break 命令设置普通断点。例如:

      (gdb) break main
      

      这会在程序的 main 函数处设置一个断点。
      如果需要指定断点的具体位置,可以使用文件名和行号。==(可以用来调试多文件项目)==例如:

      (gdb) break main.c:10
      

      也可以通过一个函数名设置断点:

      (gdb) break my_function
      
    • 使用正则表达式设置多个函数的断点。例如:

      (gdb) rbreak ^my_.*
      

      这将在所有以 my_ 开头的函数处设置断点。

  • 临时断点

    • 使用 tbreak 命令设置临时断点。例如:

      (gdb) tbreak main
      

      这会在 main 函数处设置一个临时断点。临时断点在第一次触发时会被自动删除。

  • 禁用和启用断点

    • 使用 disable 命令禁用断点。例如:

      (gdb) disable 1
      

      这将禁用编号为 1 的断点。

    • 使用 enable 命令启用断点。例如:

      (gdb) enable 1
      

      这将启用编号为 1 的断点。

  • 删除断点

    • 使用 delete 命令删除断点。例如:

      (gdb) delete 1
      

      这将删除编号为 1 的断点。

    • 如果需要删除所有断点,可以使用:

      (gdb) delete breakpoints
      
    • 如果删除一个集合(几到几)的断点可以使用:(参考https://blog.csdn.net/yangzhongxuan/article/details/6901477)

      (gdb) delete 2-8
      

3. 查看断点

  • 使用 info breakpoints 命令查看所有断点的信息。它会列出示例程序中所有断点的编号、类型、地址、条件、状态等详细信息。如:
(gdb) info breakpoints
Num     Type           Disp Enb Address    What
1       breakpoint     keep y   0x000055555555519d in main at main.c:10
.breakpoints 1: x/i 0x000055555555519d
0x000055555555519d: mov    %edi,-0x4(%rbp)

4. 管理中断点

中断点(Tracepoints)是一种特殊的断点类型,允许您在程序的特定位置收集数据,而无需暂停程序执行。中断点通常用于复杂程序的性能分析或调试。

  • 创建中断点

    • 使用 trace 命令创建中断点。例如:

      (gdb) trace main
      

      这会在 main 函数处创建一个中断点。

    • 也可以结合其他参数创建中断点。例如,收集特定局部变量的值:

      (gdb) trace main
      (gdb) actions
      > collect x, y
      > end
      

      这将收集局部变量 xy 的值。

5. 断点条件

  • 设置条件断点

    • 可以为断点添加条件,使其仅在满足特定条件时暂停。例如:

      (gdb) break main if x == 10
      

      这个断点仅在变量 x 的值为 10 时暂停。

    • 可以使用 C 表达式作为条件。

  • 修改断点条件

    • 使用 condition 命令修改断点条件。例如:

      (gdb) condition 1 x < 0
      

      这会将编号为 1 的断点条件修改为 x < 0

6. 忽略断点

  • 使用 ignore 命令告诉 GDB 忽略断点的第一次触发。例如:

    (gdb) ignore 1 10
    

    这将导致编号为 1 的断点在前 10 次触发时被忽略。

7. 断点调试流程

  • 当程序在断点处暂停后,您可以使用以下命令调试程序:

    • 查看变量值 :使用 print 命令查看变量的值。例如:

      (gdb) print x
      
    • 单步执行 :使用 nextstep 命令单步执行程序。next 命令会按行执行,不进入函数内部,而 step 命令会进入函数内部。

    • 查看调用栈 :使用 backtracebt 命令查看程序的调用栈信息。

8. 调试实践

  • 在调试时,合理设置断点有助于快速定位问题。例如,如果您怀疑某个函数出现问题,可以在函数入口处设置断点,并使用 stepnext 逐步执行函数代码,观察变量的变化和程序的逻辑。
  • 如果问题与循环或条件判断有关,可以设置条件断点,仅在满足特定条件时暂停程序,这样可以避免暂停大量无关的执行步骤。

相关文章:

  • python turtle模块有哪几种命令
  • Web自动化之Selenium控制已经打开的浏览器(Chrome,Edge)
  • DPVS-4: dpvs.conf配置文件解读
  • 开源机器学习框架
  • 搭建Docker Harbor仓库
  • 【MySQL篇】持久化和非持久化统计信息的深度剖析(含analyze命令和mysqlcheck工具两种收集方式)
  • Leetcode350:两个数组的交集 II
  • 高通Camera点亮3——Camera Module
  • 记录此刻:历时两月,初步实现基于FPGA的NVMe SSD固态硬盘存储控制器设计!
  • SpringBoot+Mybatis-Plus实现动态数据源
  • Deepseek-强化学习算法(通俗易懂版)
  • 【带你 langchain 双排系列教程】9.LangChain基于RAG 实现文档问答:从入门到实战
  • inet_pton()函数的概念和使用案例
  • JavaScript作用域和闭包,原理与用途?
  • 面向对象程序设计-实验十一
  • CSS—盒模型(3分钟结合示例精通盒模型)
  • (十七)WebGL中 图像处理的初识
  • docker部署RustDesk自建服务器
  • 数据库(MySQL):使用命令从零开始在Navicat创建一个数据库及其数据表(一).创建基础表
  • Windows 系统常用快捷键指南
  • 河南网站建设找哪家/国际实时新闻
  • 网站建设 电子政务/站长工具百科
  • 网站备案名称更改/营销技巧有哪些
  • dw外部网站链接怎么做/看到招聘游戏推广员千万别去
  • 合肥大型网站建设公司/西安百度快照优化
  • 深圳专业做网站电话/搜索引擎优化的办法有哪些