【问题标题】:Repeating Command in LLDBLLDB 中的重复命令
【发布时间】:2021-02-14 17:37:26
【问题描述】:

如何在 LLDB 中重复运行命令以调试 C++ 代码?

例如,当我在循环内设置断点并希望在停止之前继续迭代 10 次时,我目前手动输入 continue 十次来执行此操作。有没有更好的办法?

例如,假设我有这个代码块:

int i = 0;
while (true) {
  // Increment i
  i++;
}

如果我在注释行设置断点,我可以继续使用命令continue 进行循环的一次迭代并返回该行。但是,如果我想跳过 10 次迭代(即使用命令 continue 10 次),我该怎么做?

【问题讨论】:

  • 使用 gdb 你可以做c 10,但我不认为 lldb 支持这个。
  • 是的,我试过了,不幸的是它不起作用。不过还是谢谢你的建议!如果我不能解决这个问题,我可能会切换到 gdb,因为手动重复命令真的很烦人!

标签: c++ debugging repeat lldb


【解决方案1】:

lldb 倾向于使用 gdb 使用命令参数的选项。这样可以更轻松地使用多种不同的方法来调节特定命令,而无需为每个命令提供临时迷你语法。

无论如何,所以在 lldb 中你会这样做:

(lldb) c -i 10

你可以在帮助中看到这个:

(lldb) help continue
Continue execution of all threads in the current process.

Syntax: continue <cmd-options>

Command Options Usage:
  continue [-i <unsigned-integer>]

       -i <unsigned-integer> ( --ignore-count <unsigned-integer> )
            Ignore <N> crossings of the breakpoint (if it exists) for the currently selected thread.

'continue' is an abbreviation for 'process continue'

还请注意,您可以通过在刚刚命中的断点中设置忽略计数来执行相同的操作:break modify -i 10 &lt;BKPTNO&gt;

【讨论】:

  • 顺便说一句,continue 10 并不是真正的通用命令重复,它只是跳过您当前停止的断点的下 10 次命中。它甚至没有严格地“重复” continue 命令 10 次,因为如果您遇到另一个断点,它将停止。它实际上只是在您停止并继续的断点上设置忽略计数的语法糖。
  • 这正是我想要的!非常感谢!
【解决方案2】:

只需添加一个条件断点。在gdb中是这样的

  • break ... if cond
    • 使用条件cond设置断点;每次到达断点时计算表达式cond,并且仅当值非零时才停止——也就是说,如果cond 计算为真。 `...' 代表上述可能的参数之一(或无参数),指定中断的位置。有关断点条件的更多信息,请参见 Break conditions 部分。

https://ftp.gnu.org/old-gnu/Manuals/gdb/html_node/gdb_28.html

例如,如果i 当前为 0,并且您想在第 10 行中断,则使用

break 10 if i >= 10

只根据i的当前值增加条件值

我不知道lldb 但根据gdb 中的mapping list break foo if strcmp(y,"hello") == 0 可以在lldb 中按以下方式完成

(lldb) breakpoint set --name foo --condition '(int)strcmp(y,"hello") == 0'
(lldb) br s -n foo -c '(int)strcmp(y,"hello") == 0'

如果没有循环计数器,你可以自己declare a debug variable自己

expr unsigned int $foo = 1
breakpoint set --name foo --condition '++$foo >= 10'

【讨论】:

  • 这并不能真正回答问题。如果 OP 之前已经多次命中该断点,现在想跳过 10 次怎么办?
  • @cigien 只需将 10 添加到当前 i 值,它只会转发 10 次迭代
  • 嗯,没错,但那个循环只是一个例子。如果循环中没有任何内容可以指示何时可能遇到该断点怎么办?
  • @cigien 然后声明一个 lldb 变量
  • 我如何增加调试变量?
猜你喜欢
  • 2017-10-17
  • 2016-05-27
  • 1970-01-01
  • 2019-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-05
  • 1970-01-01
相关资源
最近更新 更多