Получение странного сообщения отладчика: 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
Это не происходит на определенной строке или для конкретных инструкций. У меня есть несколько точек останова в моем коде, и каждый раз, когда я ударяю один из них, отладчик начинает извергать эти сообщения. По-видимому, это не оказывает отрицательного влияния, так как программа работает правильно. Это очень раздражает, чтобы получить информацию в консоли, когда есть десятки этих строк. Я уверен, что они не отображаются ни для чего, но я не нашел, что может быть проблемой и какая инструкция может вызвать это. Если я не попаду в точку останова, я не вижу ни одной из этих строк. Я очищал и перестраивал проект несколько раз безрезультатно.
Кто-нибудь знает, что это такое?
Ответы
Ответ 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.