Подтвердить что ты не робот

Получение странного сообщения отладчика: Assertion failed: (cls), function getName: что это?

Поскольку я обновил с 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

Это не происходит на определенной строке или для конкретных инструкций. У меня есть несколько точек останова в моем коде, и каждый раз, когда я ударяю один из них, отладчик начинает извергать эти сообщения. По-видимому, это не оказывает отрицательного влияния, так как программа работает правильно. Это очень раздражает, чтобы получить информацию в консоли, когда есть десятки этих строк. Я уверен, что они не отображаются ни для чего, но я не нашел, что может быть проблемой и какая инструкция может вызвать это. Если я не попаду в точку останова, я не вижу ни одной из этих строк. Я очищал и перестраивал проект несколько раз безрезультатно.

Кто-нибудь знает, что это такое?

4b9b3361

Ответ 1

Я столкнулся с этим - и вот причина моя: я использовал +localizedStringFromDate:dateStyle:timeStyle: в моем коде. Работал отлично на iPhone, но он не был доступен до 4.0 SDK, поэтому он кашлял на iPad. Посмотрите, вызываете ли вы какую-то рутину, которая больше не доступна в SDK или доступна только в более поздних версиях. Честно говоря, я не могу дождаться 4.1 на iPad!

-Owen

Ответ 2

У меня также есть эта проблема в iPad-приложении, первоначально написанном на Xcode 3.2.4 с использованием iOS 3.2 SDK, который теперь отлаживается в Xcode 3.2.5 с использованием 4.2 SDK, но только когда я устанавливаю симулятор в 3.2. Цель развертывания iOS (поэтому я могу работать в симуляторе 3.2). Каждая остановка в точке останова в отладчике, я получаю это утверждение повторяется восемь раз. Один шаг по строке получает еще два.

Я не могу понять, что я не добавил код в проект, так как я его последний раз запускал в Xcode 3.2.4 и iOS SDK 3.2, поэтому я не могу добавить никаких вызовов, которые не присутствовали в этом SDK, иначе он не был бы скомпилирован.

Пока кто-то не найдет ответ на этот вопрос, я думаю, что единственным обходным решением (поэтому я могу продолжить отладку своего кода в среде 3.2) является переустановка Xcode 3.2.4 и использование 3.2 SDK и симулятора.

Ответ 3

У меня была эта проблема, когда я работал на симуляторе "iPad 3.2 simulator". Эта проблема исчезла, когда я переключил симулятор на "симулятор iPad 4.3"

Ответ 4

У меня точно такая же проблема. Я знаю, что это не полный ответ, но вот что я могу найти.

Соответствующая функция 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?

Надеюсь, что это поможет...

Ответ 5

У меня тоже такая же проблема; У меня нет решения, но я могу обойти его. Короче говоря, я предлагаю вам добавить больше контрольных точек...

В стеке вызовов я заметил, что на самом деле это отладчик, который плохо себя ведет. Функция gdb_class_getClass вызывает getName, предположительно это передает NULL вместо (скажем) MyClass. Код, который я пытаюсь отлаживать, - это метод MyClass. Поэтому, полагая, что у отладчика есть проблема с MyClass, я устанавливаю точку останова на строку вне любого кода MyClass (т.е. строку, вызывающую метод на MyClass), и ударяю, продолжая, когда программа ломается. Кажется, это решение проблемы в моем случае. (Обратите внимание, что auto-continue не работает.)

Чтобы быть ясным:

//Set breakpoint here
[myClassInstance buggyMethod];

Мой buggyMethod фактически находится в другом файле:

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

Надеюсь, что это поможет.

Ответ 6

У меня есть аналогичная проблема, но у меня есть создание пользовательского представления с Core Text в нем. Как только мой вид drawRect вызывает строку

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

Это зависает приложение, будь то в симуляторе или на устройстве. Причудливо, я могу исправить это путем инициализации другого текстового компонента UIKit в методе ViewDetLoad View Controller... Мне даже не нужно добавлять его в качестве подвью. Это похоже на некоторые обычные текстовые элементы, загруженные до того, как Core Text может загружаться в шрифтах.

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

Weird.