如何在Xcode中使用LLDB调试时更改变量的值?

198

1
确保查看iOS高级调试。 它非常棒。 - mfaani
我正在尝试设置一个对象的属性,如果字符串长度在0-15个字符之间,则可以正常工作。设置16个或更多字符的字符串是被接受的,但当我打印它时,它会显示一个无意义的字符串: po myObj.someString = "1234567890123456",这是有效的,但当我打印时,我得到(String?$R68 =“\ 0 \ 0 \ 0 \ 0 @ \ a \ u {1} \ c {5} \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \” - Nick Wright
4个回答

301
expr myString = @"Foo"

(lldb) help expr
在当前程序上下文中评估C/ObjC/C++表达式,使用当前作用域中的变量。该命令接受“raw”输入(不需要引用内容)。

语法:expression --

命令选项用法:expression [-f ] [-G ] [-d ] [-u ]-- expression [-o] [-d ] [-u ]-- expression

   -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.

示例:

表达式 my_struct->a = my_array[3]
表达式 -f bin -- (index * 8) + 5
表达式 char c[] = "foo"; c[0]

重要提示:由于该命令接受“原始”输入,因此如果您使用任何命令选项,则必须在命令选项结尾和原始输入开头之间使用“--”。

“expr”是“expression”的缩写


1
确实,谢谢!再问一个小问题:我正在尝试更改UILabel的文本:“'expr myLabel.text = @“hello!”`,但是我收到了错误消息:“属性'text'在类型为'UILabel *'的对象上未找到”... 有什么想法吗? - Eric
10
expr (void)[label setText:@"Foo"] 应该可以实现。点语法在调试器中通常不起作用。lldb 可能会将其解释为您要访问 c 结构体的成员,但我不确定这是它无法工作的原因。点语法也不适用于 po。与其使用 po label.text,您应该使用 po [label text] - Matthias Bauch
4
实际上,lldb 比 gdb 更好地处理了点语法。gdb 只是假设你正在将其视为 C 结构体,并且会失败。lldb 将正确访问属性,但仅当它们使用 @property 声明时才能够这样做。 - BJ Homer
29
你还可以使用 p 作为 expr 的快捷方式。例如:(lldb) p url = @"http://google.com" - funroll
我发现在使用LLVM和Swift时,如果我有一个传递的方法参数并尝试更改它,值会发生变化,但代码不会识别更改(即我将Bool从false更改为true)。我必须在方法调用之前在LLVM中更改该值,然后代码才能看到更改。 - Ray Hunter
15
你也可以使用 e 代替 expr。另外,pprint 的别名,它是 expr --(仅对原始输入求值)或 expr -o -- [object]po 的别名,通常会为对象提供更有用的输出。 - Jason Newell

23

以下的方法适用于我的情况。 我正在使用Xcode 8。

如果你想将某个变量(例如“dict”)设置为nil,然后测试代码流程,可以尝试以下步骤。

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

它将在控制台中显示类似于以下内容。

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

8
如果您使用的是Xcode 10或11,请在变量被初始化后正确设置断点,然后可以轻松地使用 po myString = "Hello World" 更改变量。

1

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

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

Screenshot of example breakpoint with expression command


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接