25

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

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

有人知道这是什么吗?

4

6 回答 6

5

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

-欧文

于 2010-10-05T22:28:13.703 回答
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 和模拟器。

于 2011-02-13T21:04:50.773 回答
1

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

于 2011-07-20T10:08:18.227 回答
0

我遇到了类似的问题,但我的问题是创建一个包含核心文本的自定义视图。一旦我的视图的 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)];        
}

诡异的。

于 2010-09-23T10:28:55.403 回答
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 抱怨断言 assert(cls) 失败。这意味着 getName 以某种方式获取 NULL 指针作为参数。

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

希望这可以帮助...

于 2010-09-13T19:35:01.707 回答
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

希望有帮助。

于 2010-09-14T01:34:58.783 回答