在 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 进行调试时如何更改变量值?的主要内容,如果未能解决你的问题,请参考以下文章