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

在Xcode中调试LLDB时如何更改变量值?,xcode,debugging,lldb,Xcode,Debugging,Lldb,在Xcode中,GDB允许您在调试时更改局部变量(请参阅)。LLDB是否提供类似的功能?如果是,我们如何使用它 expr myString = @"Foo" (lldb)帮助表达式 在当前 程序上下文,使用范围中当前的变量。此命令 接受“原始”输入(无需引用内容) 语法:表达式-- 命令选项用法:表达式[-f][-G] [-d][-u]--表达式[-o][-d ][-u]--表达式 -G <gdb-format> ( --gdb-format <gdb-format&

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

expr myString = @"Foo"
(lldb)帮助表达式
在当前 程序上下文,使用范围中当前的变量。此命令 接受“原始”输入(无需引用内容)

语法:表达式--

命令选项用法:表达式[-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.
-G(--gdb格式)
使用GDB格式说明符字符串指定格式。
-d(--动态值)
将表达式产生的值向上转换为其动态类型
如果有的话。
-f(--格式)
指定要用于显示的格式。
-o(--对象描述)
打印生成的值的对象描述
表情。
-u(--错误时展开)
如果表达式导致崩溃或断点,请清除程序状态
击中或发出信号。
示例:

expr my_struct->a=my_数组[3]
expr-f bin--(索引*8)+5
expr char c[]=“foo”;c[0]

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

“expr”是“expression”的缩写


下面的东西对我很有用。 我使用的是Xcode 8

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

  • 初始化到所需值后,正确放置断点
  • 然后在lldb命令行中执行“expression dict=nil”来更改它。(例如“无”)
  • 跨过断点
  • 检查下一行中的变量“dict”。将是零
  • 它看起来像是在控制台中

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

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

    的确,谢谢!还有一个小问题:我这样做是为了尝试更改UILabel的文本:
    'expr myLabel.text=@“hello!”
    但是我得到一个
    错误:在类型为“UILabel*”的对象上找不到属性“text”
    。。。有什么想法吗?
    expr(void)[label setText:@“Foo”]
    应该这样做。点语法通常在调试器中不起作用。lldb可能将其解释为您想要访问c-struct的成员,但我不确定这是否是它无法工作的原因。点语法也不适用于
    po
    。您必须使用
    po[label text]
    而不是
    po label.text
    实际上,lldb处理点语法的能力比gdb要好得多。gdb只是假设您将其视为一个C-struct,但它失败了。lldb将正确访问属性,但前提是它们实际上是用
    @property
    声明的。您还可以使用
    p
    作为
    expr
    的快捷方式。示例:
    (lldb)pURL=@”http://google.com“
    您也可以使用
    e
    作为
    expr
    的快捷方式。顺便说一句,
    p
    是用于打印的别名,它是
    expr--
    的别名(仅评估原始输入,无标志)
    expr-o--[object]
    po
    通常会为对象提供更有用的输出。请确保查看。我正在尝试设置一个objects属性,如果字符串长度在0-15个字符之间,它就可以工作。设置一个包含16个或更多字符的字符串是可以接受的,但当我打印回来时,它会显示一个无意义的字符串:po myObj.someString=“123456789012345646”,这是有效的,但是当我打印时,我得到了(字符串?$R68=“\0\0\0@\a\u{1}\c{5}\0\0\0\0\0\0\”