GDB 详细介绍

5.1.1设置断点
使用break命令(缩写 b)设置断点。调试器便利变量’$ bpnum’记录您最近设置的断点数; 有关便利变量的讨论,请参阅便利变量。

break location
在给定位置设置断点,可以指定函数名称,行号或指令的地址。(有关指定位置的所有可能方法的列表,请参阅“ 指定位置”。)断点将在执行指定位置中的任何代码之前停止程序。

当使用允许重载符号的源语言(例如C ++)时,函数名称可能引用多个可能的中断位置。有关该情况的讨论,请参阅模糊表达式。

只有当特定线程(请参阅特定于线程的断点)或特定任务(请参阅Ada任务)命中该断点时,才可以插入一个断点来停止程序。

break
在没有任何参数的情况下调用时,break在要在所选堆栈帧中执行的下一条指令处设置断点(请参阅检查堆栈)。在任何选定的帧中,但在最里面,这使得程序在控制返回到该帧时立即停止。这类似于finish所选帧内帧中命令的效果 - 除了finish不会留下活动断点。如果你break在最里面的框架中没有参数使用 ,GDB会在下次到达当前位置时停止; 这在循环内部可能很有用。

GDB通常在恢复执行时忽略断点,直到至少执行了一条指令。如果它没有这样做,你将无法在没有首先禁用断点的情况下继续通过断点。无论在程序停止时断点是否已存在,此规则都适用。

break … if cond
设置条件为cond的断点; 每次到达断点时计算表达式 cond,并且仅当值为非零时停止 - 即,如果cond计算为true。“…'代表上面描述的一个可能的参数(或没有参数)指定中断的位置。有关断点条件的详细信息,请参阅中断条件。

tbreak args
设置仅为一站启用的断点。该ARGS是相同的break命令,并且断点以同样的方式设置,但断点在第一次程序中断后自动删除。请参阅禁用断点。

hbreak args
设置硬件辅助断点。该ARGS是相同的 break命令和断点以同样的方式设置,但断点需要硬件支持,某些硬件可能不支持此功能。其主要用途是EPROM / ROM代码调试,因此您可以在不更改指令的情况下在指令处设置断点。这可以与SPARClite DSU和大多数基于x86的目标提供的新陷阱生成一起使用。当程序访问分配给调试寄存器的某些数据或指令地址时,这些目标将生成陷阱。但是,硬件断点寄存器可以占用有限数量的断点。例如,在DSU上,一次只能设置两个数据断点和 GDB如果使用两个以上,将拒绝此命令。在设置新的断点之前删除或禁用未使用的硬件断点(请参阅禁用断点)。见破裂条件。对于远程目标,您可以限制GDB将使用的硬件断点数,请参阅set remote hardware-breakpoint-limit。

thbreak args
设置仅在一次停止时启用的硬件辅助断点。该ARGS 是相同的hbreak命令和断点以同样的方式设置。但是,与tbreak命令一样,断点会在程序第一次停止后自动删除。此外,与hbreak 命令一样,断点需要硬件支持,而某些目标硬件可能没有此支持。请参阅禁用断点。另见休息条件。

rbreak regex
在与正则表达式正则表达式匹配的所有函数上设置断点 。此命令在所有匹配项上设置无条件断点,打印其设置的所有断点的列表。设置这些断点后,它们将被视为与使用该break命令设置的断点一样。您可以删除它们,禁用它们,或者以与任何其他断点相同的方式使它们成为条件。

正则表达式的语法是与工具一样使用的标准语法 grep的。请注意,这与shell使用的语法不同,因此例如foo*匹配包含fo后跟零或更多os的所有函数。隐式 .*前导和尾随您提供的正则表达式,因此要仅匹配以…开头的函数foo,请使用^foo。

在调试C ++程序时,rbreak对于不是任何特殊类的成员的重载函数设置断点非常有用。

该rbreak命令可用于在程序的所有函数中设置断点 ,如下所示:

(gdb)rbreak。
rbreak file:regex
如果rbreak使用文件名限定调用,则会将搜索与给定正则表达式匹配的函数限制为指定文件。例如,这可以用于在给定文件中的每个函数上设置断点:

(gdb)rbreak file.c:。
将文件名限定符与正则表达式分隔开的冒号可以可选地用空格包围。

info breakpoints [list…]
info break [list…]
打印设置和未删除的所有断点,观察点和捕获点的表。可选参数n表示仅打印有关指定断点(或观察点或捕获点)的信息。对于每个断点,将打印以下列:

断点数
类型
断点,观察点或接近点。

性格
是否将断点标记为禁用或在命中时删除。

已启用或已禁用
启用的断点标记为’ÿ”。“ñ’标记未启用的断点。

地址
断点位于程序中的位置,作为内存地址。对于尚未知道其地址的挂起断点,此字段将包含’”。在加载具有断点引用的符号或行的共享库之前,不会触发此类断点。请参阅下文了解详情。有几个地点的断点将有’'在这个领域 - 详见下文。

什么
断点位于程序源中的位置,作为文件和行号。对于挂起的断点,将列出传递给断点命令的原始字符串,因为在将来加载相应的共享库之前,该字符串无法解析。

如果断点是有条件的,则有两种评估模式:“host”和“target”。如果mode是“host”,则断点条件评估由 GDB在主机端完成。如果是“目标”,则由目标评估条件。该info break命令显示受影响的断点后面的行上的条件,以及括号内的条件评估模式。

之后会列出断点命令(如果有)。允许挂起的断点具有为其指定的条件。在加载共享库以允许挂起的断点解析为有效位置之前,不会解析条件的有效性。

info break断点号为n的参数仅列出该断点。方便变量$_和x命令的默认检查地址设置为列出的最后一个断点的地址(请参阅检查内存)。

info break显示断点被击中的次数。这与ignore命令结合使用时尤其有用 。您可以忽略大量的断点命中,查看断点信息以查看断点被击中的次数,然后再次运行,忽略少于该数量的断点。这将使您快速到达该断点的最后一击。

对于启用计数(xref)大于1的断点, info break也会显示该计数。

GDB允许您在程序的同一位置设置任意数量的断点。这没有什么愚蠢或毫无意义的。当断点是有条件的时,这甚至是有用的(参见中断条件)。

断点可能对应于程序中的多个位置。这种情况的例子是:

程序中的多个函数可能具有相同的名称。
对于C ++构造函数,GCC编译器生成函数体的多个实例,在不同情况下使用。
对于C ++模板函数,函数中的给定行可以对应于任意数量的实例化。
对于内联函数,给定的源代码行可以对应于内联函数的几个位置。
在所有这些情况下,GDB将在所有相关位置插入断点。

断点表中使用多个行(一个标题行)显示具有多个位置的断点,每个断点位置后跟一行。标题行有’'在地址栏中。各个位置的行包含位置的实际地址,并显示这些位置所属的功能。位置的数字列的形式为 断点号。位置号码。

例如:

Num Type Disp Enb地址什么
1个断点保持y
只有当i == 1时才停止
断点已经打了一次
1.1 y 0x080486a2 in void foo ()at t.cc:8
1.2 y 0x080486ca in void foo ()at t.cc:8
您无法从断点删除各个位置。但是,可以通过传递断点号来单独启用或禁用每个位置 。location-number作为enable和disable命令的参数 。它也可以以 enable与disable一个范围的位置的数目 使用位置断点数和两个位置的数目 S,按递增顺序,用连字符分开,如 ,在这种情况下GDB(含)作用于范围中的所有位置。禁用或启用父断点(请参阅禁用)会影响属于该断点的所有位置。 breakpoint-number.location-number1-location-number2

在共享库中有一个断点是很常见的。可以在执行程序时显式地并且可能重复地加载和卸载共享库。为了支持此用例,GDB会在加载或卸载任何共享库时更新断点位置。通常,您可以在调试会话开始时,未加载库时以及库中的符号不​​可用时在共享库中设置断点。当您尝试设置断点时,GDB将询问您是否要设置所谓的挂起断点 -断点,其地址尚未解析。

运行程序后,无论何时加载新的共享库, GDB都会重新评估所有断点。当新加载的共享库包含某个挂起断点引用的符号或行时,该断点将被解析并成为普通断点。卸载库时,引用其符号或源行的所有断点都将再次挂起。

此逻辑也适用于具有多个位置的断点。例如,如果C ++模板函数中有断点,并且新加载的共享库具有该模板的实例化,则会将新位置添加到断点的位置列表中。

除了具有未解析的地址之外,挂起的断点与常规断点没有区别。您可以设置条件或命令,启用和禁用它们以及执行其他断点操作。

GDB提供了一些额外的命令来控制’'时发生的事情打破’命令无法将断点地址规范解析为地址:

set breakpoint pending auto
这是默认行为。当GDB找不到断点位置时,它会查询是否应创建挂起断点。

set breakpoint pending on
这表示无法识别的断点位置应自动导致创建挂起的断点。

set breakpoint pending off
这表示不创建挂起的断点。任何无法识别的断点位置都会导致错误。此设置不会影响先前创建的任何挂起断点。

show breakpoint pending
显示用于创建挂起断点的当前行为设置。

上述设置仅影响break命令及其变体。一旦设置了断点,它将在加载和卸载共享库时自动更新。

对于某些目标,GDB可以自动决定是否应使用硬件或软件断点,具体取决于断点地址是只读还是读写。这适用于使用该break命令设置的断点以及由next和等命令设置的内部断点finish。对于设置的断点hbreak,GDB将始终使用硬件断点。

您可以使用以下命令控制此自动行为:

set breakpoint auto-hw on
这是默认行为。当GDB设置断点时,它将尝试使用目标内存映射来决定是否必须使用软件或硬件断点。

set breakpoint auto-hw off
这表明GDB不应自动选择断点类型。如果目标提供内存映射,GDB将在尝试将软件断点设置为只读地址时发出警告。

GDB通常通过使用特殊指令替换断点地址处的程序代码来实现断点,该指令在执行时将控制权交给调试器。默认情况下,只有在程序恢复时才会修改程序代码。程序一停止,GDB就会恢复原始指令。如果gdb abrubptly断开连接,此行为可防止在目标中插入断点。但是,对于慢速远程目标,插入和删除断点会降低性能。可以使用以下命令控制此行为::

set breakpoint always-inserted off
所有断点(包括用户新添加的断点)仅在目标恢复时才会插入目标。停止时,所有断点都将从目标中删除。这是默认模式。

set breakpoint always-inserted on
导致所有断点始终插入目标。如果用户添加新断点或更改现有断点,则会立即更新目标中的断点。仅当断点本身被删除时,才会从目标中删除断点。

GDB通过在断点中断时评估这些条件来处理条件断点。如果条件为真,则正在调试的进程停止,否则恢复进程。

如果目标支持在其结束时评估条件,GDB可以将断点及其条件下载到它。

可以通过以下命令控制此功能:

set breakpoint condition-evaluation host
此选项命令GDB评估主机端的断点条件。无条件断点被发送到目标,目标接收触发器并将它们报告回GDB以进行条件评估。这是标准评估模式。

set breakpoint condition-evaluation target
此选项命令GDB在插入时将断点条件下载到目标。目标负责评估条件表达式,并在条件为真时将断点停止事件报告回GDB。由于目标方评估的限制,在那里无法评估某些条件,例如,依赖于仅为主机所知的本地数据的条件。示例包括涉及便利变量的条件表达式,代理表达式解析器无法处理的复杂类型以及太长而无法发送到目标的表达式,特别是当目标是远程系统时。在这些情况下,条件将由GDB评估。

set breakpoint condition-evaluation auto
这是默认模式。如果目标支持在其末端评估断点条件,GDB将向目标下载断点条件(前面提到的限制适用)。如果目标不支持断点条件评估,那么GDB将回退到评估主机端的所有这些条件。

猜你喜欢

转载自blog.csdn.net/alan711/article/details/86475094
GDB