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

Eri*_*ric 165 debugging xcode lldb

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

Mat*_*uch 259

expr myString = @"Foo"
Run Code Online (Sandbox Code Playgroud)

(lldb)help expr
使用当前范围内的变量评估当前程序上下文中的C/ObjC/C++表达式.此命令采用"原始"输入(无需引用内容).

语法:expression -

命令选项用法:表达式[-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.
Run Code Online (Sandbox Code Playgroud)

例子:

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

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

'expr'是'expression'的缩写

  • 您还可以使用`p`作为`expr`的快捷方式.示例:`(lldb)p url = @"http://google.com"` (27认同)
  • `expr(void)[label setText:@"Foo"]`应该这样做.Dot-Syntax通常在调试器中不起作用.lldb可能会解释它,因为你想访问一个c-struct的成员,但我不确定这是否是它不起作用的原因.Dot-Syntax也不适用于`po`.而不是`po label.text`你必须使用`po [label text]` (10认同)
  • 您还可以使用`e`作为`expr`的快捷方式.BTW,`p`是print的别名,它是`expr - 的别名(只是evalue原始输入,没有标志)`expr -o - [object]`或`po`通常为你提供更有用的输出虽然对象. (9认同)
  • 实际上,lldb比gdb更好地处理点语法.gdb只是假设你将它视为一个C-struct,它失败了.lldb将正确访问属性,但前提是它们实际上是用`@ property`声明的. (4认同)

ara*_*_86 17

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

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

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

它看起来像在控制台中.

(lldb) expression dict = nil
(NSDictionary *) $5 = nil
Run Code Online (Sandbox Code Playgroud)


ata*_*asa 6

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