Iphone 如何从Xcode 4中的断点操作打印字符串值?

Iphone 如何从Xcode 4中的断点操作打印字符串值?,iphone,xcode,gdb,debugging,Iphone,Xcode,Gdb,Debugging,我有一个断点操作,正在使用下拉列表中的Log选项。我想打印出字符串(摘要)值。我正在这样做: the person name is: @p.name@ 但这会打印内存地址。我可以切换到调试器命令选项并执行以下操作 po f.name 但是我失去了我的描述,就像在第一个选项中使用的那样。使用Log选项,是否有办法打印字符串值而不是内存地址?您可以做几件事。从下拉列表中添加一个日志函数,然后添加另一个框并选择Debugger Command,然后输入po f.name 如果您希望日志更复杂,可以

我有一个断点操作,正在使用下拉列表中的Log选项。我想打印出字符串(摘要)值。我正在这样做:

the person name is: @p.name@
但这会打印内存地址。我可以切换到调试器命令选项并执行以下操作

po f.name

但是我失去了我的描述,就像在第一个选项中使用的那样。使用Log选项,是否有办法打印字符串值而不是内存地址?

您可以做几件事。从下拉列表中添加一个日志函数,然后添加另一个框并选择
Debugger Command
,然后输入
po f.name

如果您希望日志更复杂,可以执行以下操作:

the person name is: @(const char *)[(NSString*)[p.name description] UTF8String]@
po (void)NSLog(@"the person name is: %@", p.name)

您最好的选择可能只是使用调试器的图形界面来监视变量。如果要记录消息,请使用
NSLog

我最后对同一断点使用了两种不同的操作。首先是日志,然后是带有po varName的调试器命令。唯一的缺点是它将打印在两个不同的行中


您可以使用“调试器命令”将NSLog语句与断点一起使用,但需要添加“expr”

-


这是一个只使用一个操作的解决方案,使用的字符比
expr
解决方案少

但是,除非像这样添加
void

the person name is: @(const char *)[(NSString*)[p.name description] UTF8String]@
po (void)NSLog(@"the person name is: %@", p.name)
你的日志会打印出一个恼人的“零”。例如:

(lldb) po NSLog(@"foo")
 nil
2013-06-19 14:42:59.025 TheMove[95864:c07] foo

(lldb) po (void)NSLog(@"foo")
2013-06-19 14:43:10.758 TheMove[95864:c07] foo

如果您可以使用nil(我可以),只需输入
po

就可以更快、更容易地记住。您不需要在断点中执行两个操作,只需使用一个命令(log message),将包含变量内容的消息放在此处(见图)。单击“automatically continues”(自动继续)就像在代码中有一个print命令,但好的是,代码中没有print语句


对于Swift和Xcode 12.2,您可以双击断点,并将
调试器命令
用作操作和命令,无论您通常在调试器上花费多少时间

在本例中,我使用
po
和一个字符串作为param(以避免打印内存地址),其中包含我正在调试的值。我还启用了
自动继续…
,以避免停止执行

您还可以添加其他文本或其他变量


但要记住的是,运行这些操作需要一些时间,因此对于计时很重要的操作来说,这些操作并不好。

在我的例子中,XCode只会忽略我键入的任何内容。调试器的类型是否重要(即GDB/LLDB)?@futureelite7 GDB和LLDB都应该能够做到这一点。您可以尝试使用“Expression”操作而不是“Log Message”,然后就在那里
NSLog
。因此,在“表达式”窗口中,您可以键入如下内容:
(void)NSLog(@“Log this variable:%@”,aVariable)
@jasonco4.6中似乎没有表达式操作。有时这样的调整会有帮助:
人名是:@(const char*)[(NSString*)[[(id)p name]description]UTF8String]@
如果使用多个类似的断点执行此操作,我建议在消息中添加前缀,以便于在控制台日志中过滤输出。将操作设置为记录消息。将消息内容设置为
####事件名称:@eventName@
。并在控制台日志窗格中使用*#####作为搜索模式。您可以使用Jason建议的一个操作这让我有点困惑,在您的表达式中,您使用的是“而不是”"对于引号。它们在Xcode中看起来几乎相同。对于其他任何人来说,当它在Xcode中时,它给出了这个错误
错误:程序中出现了意外的“@”。谢谢Mike;我没有注意到这一点。它一定是在我复制/粘贴表达式时被自动替换的。修复了它。我多次尝试使用@expr@语法,但几乎没有成功cess.这是一个非常简单的解决方法,谢谢!仅供参考:使用Swift时,这看起来像是
po NSLog(“人名是:%@”,p.name)
,目前无法处理字符串。我真希望它能够:(