Получение странного сообщения отладчика: Утверждение не удалось: (cls), функция 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

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

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


person nemesys    schedule 13.09.2010    source источник
comment
У меня также есть эта проблема, одна вещь, хотя я, кажется, получаю ее только с симулятором iPad, а не с симулятором iPhone.   -  person AndersK    schedule 23.09.2010
comment
Тоже есть проблема. Он появился, когда я (необычно) запустил свое приложение на Симуляторе. У вас есть это на симе или устройстве или на обоих?   -  person Kalle    schedule 06.10.2010


Ответы (6)


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

-Оуэн

person Owen Hartnett    schedule 05.10.2010
comment
Спасибо, Оуэн, я посмотрю! - person nemesys; 06.10.2010

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

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

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

person SteveCaine    schedule 13.02.2011

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

person Saqib Saud    schedule 20.07.2011

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

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

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

person Engin Kurutepe    schedule 13.09.2010
comment
Кстати, assert(cls) явно помечен как хак. Это может быть причиной наших бед? - person Engin Kurutepe; 13.09.2010
comment
Я совершенно не понимаю, откуда это. Я не использую NSKeyedUnarchiver. Я конвертирую NSString в правильный список, но сообщение в консоли появляется при любой инструкции, даже до того, как я отправлю 'propertyList' в строку, поэтому я сбит с толку. - person nemesys; 14.09.2010
comment
Когда у меня будет время, я попытаюсь добавить точку останова в эту функцию getName, чтобы увидеть, откуда исходят эти вызовы. Надеюсь, это может сказать мне, что я сделал, что вызывает это ... - person nemesys; 15.09.2010
comment
исходный код getName, к сожалению, недоступен из отладчика, только сборка :) - person Engin Kurutepe; 15.09.2010

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

Я заметил в стеке вызовов, что на самом деле неправильно себя ведет отладчик. Функция 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

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

person Corin    schedule 14.09.2010

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

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

Это зависает приложение, будь то в симуляторе или на устройстве. Как ни странно, я могу исправить это, выделив другой текстовый компонент UIKit в методе viewDidLoad контроллера представления... Мне даже не нужно добавлять его в качестве подпредставления. Это похоже на то, что ему нужно загрузить некоторые общие текстовые элементы, прежде чем основной текст сможет загрузить шрифты.

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

Странный.

person jowie    schedule 23.09.2010