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

由于我从Xcode 3.2.3升级到3.2.4和iOS 4.0.1到iOS 4.1 SDK,当我在我的代码中设置一个断点并且单步执行指令时,在每一步中,debugging器将吐出一个或多个线:

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

它不会发生在特定的行或特定的说明。 我在代码中有几个断点,每当我点击其中一个时,debugging器开始喷出这些消息。 程序正常工作似乎没有任何不利影响。 当有几十条这样的线路时,检索控制台中的信息是非常烦人的。 我相信他们不是什么都没有显示出来,但是我还没有发现问题可能是什么,什么样的指令可能会导致它。 如果我不打断点,那么我没有看到任何这些线。 我做了清理和重build我的项目多次无济于事。

有人知道这是什么吗?

我遇到了这个 – 这是我发生的原因:我已经在我的代码中使用了+localizedStringFromDate:dateStyle:timeStyle: 在iPhone上工作得很好,但是4.0以前版本的SDK没有这个function,所以它在iPad上播放。 看看你是否调用了一些在SDK中不再可用的例程,或者只能在更高版本中使用。 坦率地说,我不能等待iPad上的4.1!

-Owen

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

我不明白的是,自从我上次在Xcode 3.2.4和iOS SDK 3.2中运行它之后,我没有向该项目添加任何代码,所以我不能添加任何不在该SDK中的调用,否则它不会编译。

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

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

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

相关的函数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抱怨assertion assert(cls)失败。 这意味着getName以某种方式得到一个NULL指针作为参数。

有趣的是,我们在哪里可以要求一个NULL类的名字?

希望这可以帮助…

我也有同样的问题; 我没有解决scheme,但我可以解决它。 总之,我build议你添加更多的断点…

我注意到在调用堆栈中,它实际上是debugging器的行为不当。 函数gdb_class_getClass调用getName ,据推测这是传递NULL而不是(比方说)MyClass。 我试图debugging的代码是MyClass的一个方法。 所以,认为debugging器对MyClass有问题,我在MyClass的任何代码之外(即调用MyClass上的方法的那一行)设置一个断点,并在程序中断时继续点击。 这似乎解决了我的情况下的问题。 (请注意,自动继续不起作用。)

要清楚:

 //Set breakpoint here [myClassInstance buggyMethod]; 

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

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

希望有所帮助。

我有一个类似的问题,但我的创build自定义视图与核心文本。 只要我的观点的drawRect调用线

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

无论是在模拟器还是在设备上,它都会挂起应用程序。 奇怪的是,我可以通过在视图控制器的viewDidLoad方法中alloc-initing另一个UIKit文本组件来纠正这个问题……我甚至不必将它作为子视图添加。 这就像它需要一些常见的文本元素加载之前核心文本可以加载字体。

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

奇怪的。