在 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>
.
如何在 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 expressioncond
each time the breakpoint is reached, and stop only if the value is nonzero--that is, ifcond
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>
.