【问题标题】:How to change variables value while debugging with LLDB in Xcode?在 Xcode 中使用 LLDB 进行调试时如何更改变量值?
【发布时间】:2012-04-12 00:54:42
【问题描述】:

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

【问题讨论】:

  • 请务必查看Advanced debugging in iOS。太棒了
  • 我正在尝试设置一个 objects 属性,如果字符串长度在 0-15 个字符之间,则该属性有效。设置一个 16 个或更多字符的字符串是可以接受的,但是当我打印回来时,它会显示一个无意义的字符串:po myObj.someString = "1234567890123456",它有效,但是当我打印时我得到 (String? $R68 = " \0\0\0\0@\a\u{1}\c{5}\0\0\0\0\0\0\"

标签: xcode debugging lldb


【解决方案1】:
expr myString = @"Foo"

(lldb) 帮助表达式
评估当前的 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'是'表达式'的缩写

【讨论】:

  • 确实,谢谢!还有一个小问题:我这样做是为了尝试更改 UILabel 的文本:'expr myLabel.text = @"hello!" 但我得到了error: property 'text' not found on object of type 'UILabel *'... 有什么想法吗?
  • expr (void)[label setText:@"Foo"] 应该这样做。点语法通常在调试器中不起作用。 lldb 可能将其解释为您想访问 c-struct 的成员,但我不确定这是否是它不起作用的原因。点语法也不适用于po。而不是po label.text,你必须使用po [label text]
  • 实际上,lldb 处理点语法比 gdb 好得多。 gdb 只是假设您将其视为 C 结构,但它失败了。 lldb 将正确访问属性,但前提是它们实际上是用@property 声明的。
  • 您也可以使用p 作为expr 的快捷方式。示例:(lldb) p url = @"http://google.com"
  • 您也可以使用e 作为expr 的快捷方式。顺便说一句,p 是 print 的别名,它是 expr -- 的别名(仅评估原始输入,没有标志)expr -o -- [object]po 通常会为您提供更有用的对象输出。
【解决方案2】:

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

如果你想将一些变量(例如“dict”)设置为nil,然后测试代码流,你可以试试下面的方法。

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

它看起来像在控制台中。

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-01
      • 2023-02-04
      • 2016-02-06
      • 2013-05-16
      • 2019-04-19
      • 2011-06-18
      • 2021-01-26
      • 1970-01-01
      相关资源
      最近更新 更多