如何改变变量值,同时调试与 Xcode 的 LLDB?

在 Xcode,gDB 允许在调试时更改本地变量(参见 在 XCode 中调试时如何更改 NSString 值?)。LLDB 是否提供类似的功能?如果是这样,我们如何使用它?

80957 次浏览
expr myString = @"Foo"

(lldb) help expr
计算当前 程序上下文,使用当前作用域中的变量 接受“原始”输入(不需要引用内容)。

句法: 表达式——

命令选项用法: expression [-f ][-G ] [-d ][-u ]——表达式[-o ][-d 表情

   -G <gdb-format>  ( --gdb-format <gdb-format> )
Specify a format using a GDB format specifier string.


-d <boolean>  ( --dynamic-value <boolean> )
Upcast the value resulting from the expression to its dynamic type
if available.


-f <format>  ( --format <format> )
Specify a format to be used for display.


-o  ( --object-description )
Print the object description of the value resulting from the
expression.


-u <boolean>  ( --unwind-on-error <boolean> )
Clean up program state if the expression causes a crash, breakpoint
hit or signal.

例子:

Expr my _ struct-> a = my _ array [3]
Expr-f bin ——(索引 * 8) + 5
Expr char c [] = “ foo”; c [0]

重要提示: 因为此命令接受“原始”输入,所以如果使用任何命令选项,则必须在 命令选项和原始输入的开头。

Expr 是 Expression 的缩写

下面这些对我有用。 我用的是 Xcode 8。

如果希望将某个变量(例如“ dict”)设置为 nil,然后测试代码流,可以尝试以下操作。

  1. 在初始化后将断点正确放置到所需的值。
  2. 然后在 lldb 命令行中执行“ expression dict = nil”来修改它(例如“ nil”)
  3. 跨过断点。
  4. 检查下一行中的变量“ dict”,它将为空。

它将看起来像在控制台中。

(lldb) expression dict = nil
(NSDictionary *) $5 = nil

如果您使用 Xcode 10或11,在初始化为所需的变量之后将断点正确放置,那么您可以使用 po myString = "Hello World"轻松地更改您的变量。

如果希望每次命中断点时都发生这种情况,可以将表达式添加到断点中。

  1. 在要操作变量的位置创建断点
  2. 右键单击并选择编辑断点
  3. 在操作单选框中选择“调试器命令”
  4. 输入 e yourStringName = "Your new value"
  5. 选中“评估操作后自动继续”复选框。

Screenshot of example breakpoint with expression command