【问题标题】:How to view function return in Xcode while debugging?调试时如何在 Xcode 中查看函数返回?
【发布时间】:2015-12-17 15:50:17
【问题描述】:

例如,如果我想知道 [NSKeyedArchiver archiveRootObject:self.privateItems toFile:[self.itemArchPath absoluteString]];

我能做什么?

【问题讨论】:

  • po [NSKeyedArchiver archiveRootObject:self.privateItems toFile:[self.itemArchPath absoluteString]] 应该返回保存的布尔结果,但这会再次保存。如果您想在保存后(断点上方)查看结果,我认为您需要以某种方式捕获结果:BOOL saveResult = [NSKeyedArchiver archiveRootObject:self.privateItems toFile:[self.itemArchPath absoluteString]]

标签: ios xcode debugging lldb


【解决方案1】:

如果您想查看[NSKeyedArchiver archiveRootObject:self.privateItems toFile:[self.itemArchPath absoluteString]] 的结果,您可以将其结果包装在一个简单的条件语句中并打印一条消息:该方法返回一个布尔值,因此它是真或假。

例子:

bool result = [NSKeyedArchiver archiveRootObject:self.privateItems toFile:[self.itemArchPath absoluteString]];
if (result) {
    NSLog(@"It worked!");
} else {
    NSLog(@"It failed!");
}

如果您的意思是要检查保存的内容,那么您可能应该打印保存的路径并在您的 Mac 上查看它(如果您使用的是模拟器)或尝试将对象重新加载到确保它符合您的预期。

【讨论】:

  • 有什么高级或优雅的方法可以做到这一点吗?我认为 xcode 有类似 Visual Studio 或 p @eax 的东西可以工作。
  • 好吧,您可以在bool result 行之后放置一个断点,然后使用p result 检查内容,但要确保范围没有结束(即,将int meh = 10 或其他内容放在后面可以肯定)否则 Xcode 可能会丢失该值。查看布尔值的高级方法并不多:)
【解决方案2】:

在 lldb 和 Xcode 中,如果您“跳出”某个函数,当跳出完成时,我们将显示您刚刚离开的函数的返回值。

在 Xcode 中,在退出后停止时,Locals 视图的第一个元素(称为“返回值”)将是您刚退出的函数的返回值。

如果你在命令行 lldb 中,同样的事情会出现在停止打印的线程部分:

(lldb) fin
Process 43838 stopped
* thread #1: tid = 0x849c80, 0x0000000100000f5b SimpleStepOut`main(argc=1, argv=0x00007fff5fbff5b8) + 27 at main.c:18, queue = 'com.apple.main-thread', stop reason = step out
Return value: (int) $0 = 5

    frame #0: 0x0000000100000f5b SimpleStepOut`main(argc=1, argv=0x00007fff5fbff5b8) + 27 at main.c:18
   15   
   16   int main(int argc, const char * argv[]) {
   17       // insert code here...
-> 18       printf("Hello, World - %d!\n", return_five());
   19       return 0;
   20   }

注意,如果您自定义了帧格式,则可能没有此元素,它是 thread.return-value

当“步入/退出”碰巧退出函数时,执行此操作会有点困难,因此目前它仅在您退出函数时才有效。

【讨论】:

  • 顺便说一句,由于你想知道返回值的函数没有调试信息,所以我们不会知道返回类型。您可以通过运行 lldb 命令“expr @import Foundation”来解决这个问题 - 如果您使用的是 Xcode 7.x。此外,默认情况下 lldb 不会“介入”没有调试信息的函数,您必须使用 lldb 命令“step -a false”来介入。
【解决方案3】:

TwoStraws 的答案是正确的。

但是,如果您希望在调试时且仅在调试时查找返回值(TwoStraws 的答案中的result),您可以进入对archiveRootObject:toFile: 的调用,然后点击F8。这将跳出函数并(通常)包含一个名为“return”的伪局部变量,该变量将保存调用的返回值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多