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

时间:2010-09-13 18:53:14

标签: xcode debugging ios assertion

由于我从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

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

有人知道这是什么吗?

6 个答案:

答案 0 :(得分:5)

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

-Owen

答案 1 :(得分:2)

我也遇到了这个问题,在最初使用iOS 3.2 SDK在Xcode 3.2.4中编写的iPad应用程序中,现在使用4.2 SDK在Xcode 3.2.5中调试,但只有在我将模拟器设置为3.2 iOS部署目标(所以我可以在3.2模拟器中运行)。每次在调试器的断点处停止,我都会重复这个断言八次。在单行上单步执行两次。

我无法理解的是,自从我上次在Xcode 3.2.4和iOS SDK 3.2中运行以来,我没有向项目中添加任何代码,因此我无法添加任何不存在的调用SDK或者它不会编译。

在有人找到答案之前,我认为唯一的解决方法(所以我可以在3.2环境中继续调试我的代码)是重新安装Xcode 3.2.4并使用3.2 SDK和模拟器。

答案 2 :(得分:1)

当我在模拟器“iPad 3.2模拟器”上运行时,我遇到了这个问题。当我将模拟器切换到“iPad 4.3模拟器”时,这个问题就消失了

答案 3 :(得分: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;
    }
}

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

哪个有点好笑,我们可以在哪里询问NULL类的名称?

希望这会有所帮助......

答案 4 :(得分:0)

我也有同样的问题;我没有解决方案,但我能够解决它。简而言之,我建议你添加更多断点......

我在调用堆栈中注意到它实际上是调试器行为不端。函数gdb_class_getClass调用getName,假设这是传递NULL而不是(比方说)MyClass。我正在尝试调试的代码是MyClass的一个方法。因此,考虑到调试器有MyClass的问题,我在MyClass的任何代码之外的一行(即在MyClass上调用该方法的行)设置了一个断点,并在程序中断时点击继续。这似乎解决了我的问题。 (请注意,自动继续不起作用。)

要明确:

//Set breakpoint here
[myClassInstance buggyMethod];

我的buggyMethod实际上在另一个文件中:

...
-(void)buggyMethod {
    //This is where I set my 'real' breakpoint

希望有所帮助。

答案 5 :(得分:0)

我遇到了类似的问题,但我的目标是创建一个包含Core Text的自定义视图。只要我的视图的drawRect调用行

CTFontRef titleFont = CTFontCreateWithName(CFSTR("Baskerville"), 40.0f, NULL); 

它会挂起应用程序,无论是在模拟器中还是在设备上。奇怪的是,我可以通过在View Controller的viewDidLoad方法中初始化另一个UIKit文本组件来解决这个问题...我甚至不必将其添加为子视图。这就像在Core Text加载字体之前需要加载一些常见的文本元素。

- (void)viewDidLoad
{
    [super viewDidLoad];
    UILabel *l = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 0, 0)];        
}

怪异。