【问题标题】:Xcode debugger -- inspect a deeply nested objectXcode 调试器——检查一个深度嵌套的对象
【发布时间】:2010-10-14 00:24:09
【问题描述】:

我有一个递归下降树对象。我希望能够设置断点并在 Xcode 调试器中检查它。检查顶层工作得很好。但是在我下降一个级别左右之后,调试器说 ivars 的值超出了范围。有什么办法可以防止这种情况发生吗?

编辑:

回应评论--

ivar 是 Expression 类的对象。嵌套主要来自主体 ivar,它通常是表达式对象的 NSMutableArray。所以你可能有这样的结构:

-表达式
---正文(2个表达式)
-----0 表达式
-------正文(1个表达式)
----------0 表达式
------------正文 [空]
-----1 表达式
-------正文[空]

还有一个头部ivar,是Token类的一个对象,里面又包含一些字符串ivar,不嵌套。

我使用调试器的方式——我在 Expression 对象内的方法中设置了一个断点。然后我单击显示三角形以获取参数,然后单击 self,然后单击 body ivar,然后单击 body ivar 中的表达式,依此类推。但最终调试器不再告诉我事物的值。

【问题讨论】:

  • 开始赏金以解决这个问题。最好的答案是不涉及编写任何代码的答案。但是,如果有一种方法可以让我编写一次代码,然后能够检查我的类的任何对象树,而无需提前指定树中的确切位置,那么即使是涉及将 ivars 纳入范围的额外代码的答案也会有价值我会想在运行时去。
  • 您能指定 ivars 类型吗?你是如何使用调试器的?在 gdb 的控制台中单击鼠标或输入命令?
  • 你可能对这个话题感兴趣:stackoverflow.com/questions/1427871/…
  • 这很有趣,谢谢。但即使将“{(int)[$VAR count]} objects {(NSString *)[(NSArray *)$VAR description]}:s” 放入汇总字段后,我仍然只能检查顶部的内容-水平体。我试过带引号和不带引号。
  • 您可以接受与控制台相关的解决方案吗?您可以为您的类实现一个自定义的description 方法,该方法在包含的对象上递归调用description 并以这种方式构造一个字符串。这样,您可以通过在根实例上调用 description 来获取整个树,类似于调试器将执行的操作(请参阅链接线程以了解如何在调试器控制台上执行此操作)。您可能无法请求子树,但您可以在运行时检查树。

标签: xcode debugging


【解决方案1】:

我建议将此添加到您的 Expression 课程中。然后你可以在调试器中po [expression explode] 打印表达式的树。先决条件是为您的 Expressionclass 打印出其余 ivars 的正确 -description 方法。

- (void) explodeAtLevel:(int)aLevel {
    NSMutableString* out = [[NSMutableString alloc] init];

    for (int i = 0;  i < aLevel; i++) [out appendString:@"-"];

    [out appendString:self.description];
    printf("%s\n", [out UTF8String]);
    [out release];

    for (id *subitem in body)
      if ([subitem isMemberOfClass:[Expression class]])
        [((Expression*)subitem) explodeAtLevel:(aLevel + 1)];
}


- (void) explode {
  [self explodeAtLevel:0];
}

【讨论】:

  • 这似乎是我能做的最好的了。虽然 isKindOfClass 比 isMemberOfClass 好得多。一个问题——当我在调试器中运行该方法时,我经常收到消息“值无法转换为整数”。当我从程序中的代码运行相同的方法时,我没有收到该消息。你能解释一下发生了什么吗?
  • isKindOfClass 如果您有基类的子类,确实会更好。至于调试器消息,我建议尝试注释掉[out appendString:self.description];。如果问题消失了,那是在您的 -description 方法中。
猜你喜欢
  • 2015-09-15
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 2017-08-27
  • 2018-11-30
  • 1970-01-01
  • 2020-07-21
  • 2018-02-14
相关资源
最近更新 更多