得到奇怪的调试器消息:断言失败:(cls),函数getName:这是什么?

nem*_*sys 25 debugging xcode assertion ios

自从我从Xcode 3.2.3升级到3.2.4和iOS 4.0.1升级到iOS 4.1 SDK后,当我在代码中设置断点并单步执行指令时,在每一步,调试器都会吐出一个或多个线:

Assertion failed: (cls), function getName, file /SourceCache/objc4_Sim/objc4-427.1.1/runtime/objc-runtime-new.m, line 3939

它不会发生在特定的行或特定的指令上.我的代码中有一些断点,每次遇到其中一个断点时,调试器就会开始喷出这些消息.由于程序正常工作,它似乎没有任何不利影响.当有数十行时,在控制台中检索信息会非常烦人.我确定他们没有显示任何东西,但我没有发现问题可能是什么以及可能导致它的指令.如果我没有遇到断点,那么我没有看到任何这些线.我多次清理并重建我的项目无济于事.

有人知道这是什么吗?

Owe*_*ett 5

我碰到了这个 - 这就是我发生的原因:我+localizedStringFromDate:dateStyle:timeStyle:在我的代码中使用 过.在iPhone上运行良好,但它不适用于4.0之前的SDK,所以它在iPad上咳嗽.看看你是否正在调用一些在SDK中不再可用或只在更高版本中可用的例程.坦率地说,我不能等待iPad上的4.1!

-Owen


Eng*_*epe 0

我有完全相同的问题。我知道这不是完整的答案,但这是我能找到的。

相关函数 getName 如下所示:

/***********************************************************************
* getName
* fixme
* Locking: runtimeLock must be held by the caller
**********************************************************************/
static const char *
getName(struct class_t *cls)
{
    // fixme hack rwlock_assert_writing(&runtimeLock);
    assert(cls);

    if (isRealized(cls)) {
        return cls->data->ro->name;
    } else {
        return ((const struct class_ro_t *)cls->data)->name;
    }
}
Run Code Online (Sandbox Code Playgroud)

所以gdb 抱怨断言assert(cls) 失败。这意味着 getName 以某种方式获取 NULL 指针作为参数。

这有点有趣,我们可以在哪里询问 NULL 类的名称?

希望这可以帮助...

  • 顺便说一句,assert(cls) 显然被标记为黑客攻击。这可能就是我们遇到麻烦的原因吧? (2认同)