Hexagon GDB Debugger介绍(10)

简介 同时被 2 个专栏收录
132 篇文章 0 订阅
145 篇文章 1 订阅

Hexagon GDB Debugger介绍(10)

2.9.1.1 设置断点

使用 break 命令(缩写为 b )设置断点。 调试器便利变量 $bpnum 记录了你最近设置的断点数; 有关您可以使用便利变量做什么的讨论,请参见第 2.12.9 节。

可以通过多种方式指定断点。

break function
在函数入口处设置断点。 当使用允许符号重载的源语言(例如 C++)时,函数可能会引用多个可能的中断位置。 有关多个断点位置的讨论,请参见第 2.9.1.9 节。

break +offset
break -offset
在当前选定的堆栈帧中从执行停止的位置向前或向后若干行设置断点。 有关堆栈帧的说明,请参阅第 2.10.1 节。

break linenum
在当前源文件的 linenum 行设置断点。 当前源文件是其源文本被打印的最后一个文件。 断点将在您的程序执行该行上的任何代码之前停止它。

break filename:linenum
在源文件 filename 的 linenum 行设置断点。

break filename:function
在文件 filename 中找到的函数函数入口处设置断点。 指定文件名和函数名是多余的,除非多个文件包含类似命名的函数。

break *address
在地址地址处设置断点。 您可以使用它在程序中没有调试信息或源文件的部分设置断点。

注意:
代码优化可以在源代码行断点不再有用的程度上重新排列代码。 在这种情况下,您可以使用目标文件转换器二进制实用程序将整个应用程序转换为机器代码:

hexagon-ob jdump -dClx app_reloc_file_name > file .dump

…然后使用 break 在特定指令地址上设置断点。

break
当不带任何参数调用时,break 在所选堆栈帧中要执行的下一条指令处设置断点(第 2.10 节)。 在除最里面之外的任何选定帧中,这会使您的程序在控制权返回到该帧时立即停止。 这类似于选定帧内的帧中的完成命令的效果,只是完成不会留下活动断点。 如果在最里面的帧中使用不带参数的 break,调试器会在下次到达当前位置时停止; 这在单步执行循环时很有用。

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

break … if cond
使用条件 cond 设置断点; 每次到达断点时对表达式 cond 求值,并仅在值非零时停止; 如果 cond 评估为真,… 代表上述可能的参数之一(或无参数)并指定中断的位置。 有关断点条件的更多信息,请参见第 2.9.1.6 节。

tbreak args
设置一个断点只启用一次。 args 与 break 命令相同,断点设置方式相同; 但是,断点会在您的程序第一次停止后自动删除。 见第 2.9.1.5 节。

hbreak args
设置硬件辅助断点。 args 与 break 命令相同,断点设置方式相同; 但是,断点需要硬件支持,某些目标硬件可能不支持。 这样做的主要目的是调试 EPROM/ROM 代码,因此您可以在不更改指令的情况下在指令处设置断点。 在设置新断点之前删除或禁用未使用的硬件断点(第 2.9.1.5 节)。 有关中断条件的信息,请参阅第 2.9.1.6 节。

thbreak args
设置一个硬件辅助断点,只为一站启用。 args 与 hbreak 命令相同,断点设置方式相同。 但是,与 tbreak 命令一样,断点在程序第一次停止后会自动删除。 此外,与 hbreak 命令一样,断点需要硬件支持,而某些目标硬件可能不具备此支持。 见第 2.9.1.5 节。 另见第 2.9.1.6 节。

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

正则表达式的语法是与 grep 等工具一起使用的标准语法。

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

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

info breakpoints [n]
info break [n]
info watchpoints [n]

显示所有设置和未删除的断点、观察点和捕获点的表,显示每个断点的以下属性:

Number:分配的断点编号。
Type:断点、观察点或捕获点。
Disposition:断点是否在命中时被标记为禁用或删除。
State y:断点已启用 n : 断点禁用
Address: 断点在程序中的位置,作为内存地址。 如果断点在共享库的未来加载中处于挂起状态(详见下文),该地址将被列为 。
What: 断点在程序源中的位置,作为文件和行号。 对于挂起的断点,将列出传递给断点命令的原始字符串,因为在将来加载适当的共享库之前无法解析它。

如果断点是有条件的,则 info break 在受影响的断点之后的行上显示条件; 断点命令(如果有)列在其后。 允许挂起断点为其指定条件。 在加载允许挂起断点解析到有效位置的共享库之前,不会解析条件的有效性。

info break 以断点编号 n 作为参数仅列出该断点。 x 命令的便利变量 $_ 和默认检查地址被设置为列出的最后一个断点的地址(第 2.12.5 节)。

info break 显示断点被命中的次数。这在与 ignore 命令结合使用时特别有用。您可以忽略大量的断点命中,查看断点信息以查看断点被命中的次数,然后再次运行,忽略比该数字少的一次。这将得到
你很快就到了最后一次命中那个断点。

调试器允许您在程序的同一位置设置任意数量的断点。当断点是有条件的(第 2.9.1.6 节)时,这非常有用。如果找不到指定的断点位置,可能是因为该位置位于尚未加载的共享库中。在这种情况下,您可能希望调试器创建一个特殊的断点(称为挂起断点),以在将来加载适当的共享库时尝试自行解决。

挂起断点可用于在调试器会话开始时为您知道稍后将由被调试的程序动态加载的位置设置。加载共享库时,会检查加载是否解决了任何挂起的断点位置。如果挂起断点位置得到解析,则会创建常规断点并删除原始挂起断点。

提供了用于控制挂起断点支持的其他命令:

set breakpoint pending auto
这是默认行为。 当调试器找不到断点位置时,它会询问您是否应该创建挂起的断点。

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

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

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

正常的断点操作也适用于挂起的断点。 您可以为挂起的断点和/或挂起的命令指定在达到断点时运行的条件。 您还可以启用或禁用挂起的断点。 当您为挂起断点指定条件时,条件的解析将被推迟到挂起断点位置被解析的点。 禁用挂起的断点告诉调试器不要尝试在任何后续共享库加载上解析断点。 当重新启用挂起的断点时,调试器会检查该位置是否已解析。 这样做是因为自禁用断点以来可能发生了任意数量的共享库加载,并且这些加载中的一个或多个可以解析位置。

注意:
调试器本身有时会出于特殊目的在您的程序中设置断点,例如正确处理 longjmp(在 C 程序中)。 这些内部断点被分配负数,从 -1 开始; info 断点不显示它们。

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

weixin_38498942

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值