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


173

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


1
确保查看iOS中的高级调试。太棒了
亲爱的,

我正在尝试设置一个对象属性,如果字符串长度在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

Answers:


269
expr myString = @"Foo"

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

语法:表达式-

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

   -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-(index * 8)+ 5
expr char c [] =“ foo”; c [0]

重要说明:由于此命令采用“原始”输入,因此,如果您使用任何命令选项,则必须在命令选项的末尾与原始输入的开头之间使用“-”。

“ expr”是“ expression”的缩写


1
的确,谢谢!还有一个小问题:我这样做是为了尝试更改UILabel的文本:'expr myLabel.text = @"hello!"但是我得到了error: property 'text' not found on object of type 'UILabel *'...任何想法?
埃里克(Eric)

10
expr (void)[label setText:@"Foo"]应该这样做。点语法通常在调试器中不起作用。lldb可能会按照您想要访问c结构成员的方式来解释它,但是我不确定这是否是它不起作用的原因。点语法对po任何一个都不起作用。而不是po label.text您必须使用po [label text]
Matthias Bauch 2012年

4
实际上,lldb处理点语法比gdb更好。gdb只是假设您将其视为C结构,但这会失败。lldb将正确访问属性,但前提是它们实际上是使用声明的@property
BJ Homer

28
您也可以将其p用作的快捷方式expr。示例:(lldb) p url = @"http://google.com"
funroll

11
您也可以将其e用作的快捷方式expr。顺便说一句,p是打印的别名,是打印的别名expr --(只是对原始输入求值,没有标志),expr -o -- [object]或者po通常为对象提供更多有用的输出。
杰森·纽厄尔

21

以下内容对我有用。我正在使用Xcode 8。

如果要将一些变量(例如“ dict”)设置为nil,然后测试代码流,则可以尝试以下操作。

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

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

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

3

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.