Получение странного сообщения отладчика: 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

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

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

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

-Оуэн

У меня также есть эта проблема, в iPad-приложении, первоначально написанном на Xcode 3.2.4 с использованием iOS 3.2 SDK, который теперь отлаживается в Xcode 3.2.5 с использованием SDK 4.2, но только когда я установил симулятор в 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.

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

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

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

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

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

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

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

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

Interesting Posts
Давайте будем гением компьютера.