Странное странное сообщение отладчика: Утверждение не выполнено: (cls), функция getName: что это? - PullRequest
25 голосов
/ 13 сентября 2010

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

5 голосов
/ 06 октября 2010

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

-Owen

2 голосов
/ 14 февраля 2011

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

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

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

1 голос
/ 20 июля 2011

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

0 голосов
/ 23 сентября 2010

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

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

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

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

Weird.

0 голосов
/ 14 сентября 2010

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

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

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

//Set breakpoint here
[myClassInstance buggyMethod];

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

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

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

0 голосов
/ 13 сентября 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...