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

Posted

技术标签:

【中文标题】在 Xcode 中使用 LLDB 进行调试时如何更改变量值?【英文标题】:How to change variables value while debugging with LLDB in Xcode? 【发布时间】: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\u1\c5\0\0\0\0\0\0\" 【参考方案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,然后测试代码流,你可以试试下面的方法。

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

它看起来像在控制台中。

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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于在 Xcode 中使用 LLDB 进行调试时如何更改变量值?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 调试进阶-更高效的使用 Xcode 和 LLDB

使用 Xcode LLDB 控制台在 Swift 中调试闭包

Xcode:如何退出 lldb swift repl

Xcode 调试技巧-b

LLDB调试基本使用

如何在 Xcode 4 中进行远程调试?