在 LLDB 中重复命令

Repeating Command in LLDB

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

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

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

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

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

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

  • break ... if cond
    • Set a breakpoint with condition cond; evaluate the expression cond each time the breakpoint is reached, and stop only if the value is nonzero--that is, if cond evaluates as true. `...' stands for one of the possible arguments described above (or no argument) specifying where to break. See section Break conditions, for more information on breakpoint 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'

lldb 倾向于使用选项,而 gdb 将使用命令参数。这使得使用多种不同的方法来调节特定命令变得更加容易,而不必为每个命令提出临时 mini-syntaxes。

无论如何,在 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 <BKPTNO>.