【问题标题】:How to print string value from breakpoint action in Xcode 4?如何从 Xcode 4 中的断点操作打印字符串值?
【发布时间】:2009-04-12 21:23:27
【问题描述】:

我有一个断点操作,并且正在使用下拉菜单中的“日志”选项。我想打印出字符串(摘要)值。我正在这样做:

the person name is: @p.name@

但是会打印内存地址。我可以切换到调试器命令选项并执行

po f.name

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

【问题讨论】:

    标签: iphone xcode gdb debugging


    【解决方案1】:

    您可以使用“调试器命令”使用带有断点的 NSLog 语句,但您需要添加“expr”

    expr (void)NSLog(@"The Person Name is %@", p.name)
    

    -

    【讨论】:

    • 这让我有点困惑,在你的表达中你使用“而不是”作为引号。它们在 Xcode 中看起来几乎相同。对于其他人来说,当它在那里时,它给出了这个错误error: unexpected '@' in program.
    • 谢谢迈克;我没有注意到这一点。当我复制/粘贴表达式时,它必须被自动替换。修好了。
    【解决方案2】:

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

    如果你想让你的日志更复杂,你可以做更多这样的事情:

    the person name is: @(const char *)[(NSString*)[p.name description] UTF8String]@
    

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

    【讨论】:

    • 在我的例子中,XCode 会忽略我输入的任何内容。调试器的类型是否重要(即 GDB / LLDB)?
    • @futureelite7 GDB 和 LLDB 都应该能够做到这一点。您可以尝试使用“Expression”操作而不是“Log Message”,然后只使用NSLog。因此,在“表达式”窗口中,您可以输入如下内容:(void)NSLog(@"Log this variable: %@", aVariable);
    • @JasonCoco 似乎 Xcode 4.6 中没有 Expression 动作。
    • 有时这样的调整会有所帮助:the person name is: @(const char *)[(NSString*)[[(id)p name] description] UTF8String]@
    • 如果您使用多个相似的断点执行此操作,我建议在您的消息中添加一个前缀,以便轻松过滤控制台日志中的输出。将操作设置为记录消息。将消息内容设置为#### event name: @eventName@。并使用 *#### 作为控制台日志窗格中的搜索模式。
    【解决方案3】:

    这是一个仅使用一个操作的解决方案,并且使用的字符少于expr 解决方案。

    但是,除非您像这样添加void

    po (void)NSLog(@"the person name is: %@", p.name)
    

    您的日志会打印出令人讨厌的“nil”。例如:

    (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 就可以更快地键入并且更容易记住

    【讨论】:

    • 我多次尝试使用@expr@ 语法,但收效甚微。这是一个非常简单的解决方法,谢谢!
    • 仅供参考:使用 Swift 时,这看起来像 po NSLog("the person name is: %@", p.name)
    【解决方案4】:

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

    【讨论】:

    • 你可以像 Jason 建议的那样使用一种操作
    【解决方案5】:

    你不需要在断点TWO actions,你可以有ONE命令(日志消息),你把消息包括变量的内容(见图)。通过单击“自动继续”,它就像在代码中具有打印命令一样,但好处是,您的代码中没有打印语句。

    【讨论】:

    • 目前不适用于字符串。我真的希望它做到了:(
    【解决方案6】:

    对于 Swift 和 Xcode 12.2,您可以双击断点并使用 Debugger Command 作为操作和命令,无论您通常在调试器上使用什么时间。

    在示例中,我使用po 和一个字符串作为参数(以避免打印内存地址),其中包含我正在调试的值。我还启用了Automatically continue... 以避免停止执行。

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

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

    【讨论】:

      猜你喜欢
      • 2017-09-15
      • 1970-01-01
      • 2018-07-15
      • 1970-01-01
      • 1970-01-01
      • 2021-10-07
      • 1970-01-01
      • 2012-01-14
      • 1970-01-01
      相关资源
      最近更新 更多