25

Xcode3.2.3から3.2.4およびiOS4.0.1からiOS4.1SDKにアップグレードしたため、コードにブレークポイントを設定し、命令をシングルステップオーバーすると、各ステップでデバッガーがその1つ以上を吐き出します。ライン:

Assertion failed: (cls), function getName, file /SourceCache/objc4_Sim/objc4-427.1.1/runtime/objc-runtime-new.m, line 3939

特定の行や特定の指示では発生しません。コードにいくつかのブレークポイントがあり、それらの1つにヒットするたびに、デバッガーはそれらのメッセージを吐き出し始めます。プログラムは正しく動作するので、悪影響はないようです。これらの行が数十行ある場合、コンソールで情報を取得するのは非常に面倒です。それらは無料で表示されていないことは確かですが、問題が何であるか、どのような指示が原因であるかはわかりません。ブレークポイントに到達しない場合、それらの行は表示されません。私は自分のプロジェクトを何度もクリーンアップして再構築しましたが、無駄になりました。

誰かがこれが何であるかについて何か考えがありますか?

4

6 に答える 6

5

私はこれに遭遇しました-そして、これが私の起こった理由です:私は +localizedStringFromDate:dateStyle:timeStyle:自分のコードで使用していました。iPhone では問題なく動作しましたが、4.0 より前の SDK では利用できないため、iPad では動作しませんでした。SDK で使用できなくなった、または新しいバージョンでのみ使用できるルーチンを呼び出しているかどうかを確認します。率直に言って、iPad の 4.1 が待ちきれません!

-オーウェン

于 2010-10-05T22:28:13.703 に答える
2

また、iOS 3.2 SDK を使用して Xcode 3.2.4 で最初に作成された iPad アプリでも、4.2 SDK を使用して Xcode 3.2.5 でデバッグされていますが、シミュレーターを 3.2 iOS 展開に設定した場合にのみ、この問題が発生しています。ターゲット (3.2 シミュレーターで実行できるように)。デバッガーのブレークポイントで停止するたびに、このアサートが 8 回繰り返されます。行を 1 回踏むと、さらに 2 つ取得されます。

私が理解できないのは、Xcode 3.2.4 および iOS SDK 3.2 で最後にプロジェクトを実行して以来、プロジェクトにコードを追加していないことです。そのため、その SDK またはその他に存在しなかった呼び出しを追加することはできません。それはコンパイルされませんでした。

誰かがこれに対する答えを見つけるまで、(3.2 環境でコードのデバッグを続行できるように) 唯一の回避策は、Xcode 3.2.4 を再インストールし、3.2 SDK とシミュレーターを使用することだと思います。

于 2011-02-13T21:04:50.773 に答える
1

シミュレーター「iPad 3.2シミュレーター」で実行していたときに、この問題が発生しました。シミュレーターを「iPad 4.3シミュレーター」に切り替えたらこの問題はなくなりました

于 2011-07-20T10:08:18.227 に答える
0

私も同じ問題を抱えています。解決策はありませんが、回避することはできます。つまり、ブレークポイントを追加することをお勧めします...

コール スタックで、実際に動作がおかしいのはデバッガであることに気付きました。関数は をgdb_class_getClass呼び出しますgetName。これは、(たとえば) MyClass の代わりに NULL を渡していると思われます。デバッグしようとしているコードは、MyClass のメソッドです。そこで、デバッガーが MyClass に問題があると考えて、MyClass の任意のコードの外側の行 (つまり、MyClass のメソッドを呼び出す行) にブレークポイントを設定し、プログラムが中断したときに続行を押します。これは私の場合の問題を解決するようです。(自動継続は機能しないことに注意してください。)

明確にするために:

//Set breakpoint here
[myClassInstance buggyMethod];

私の buggyMethod は実際には別のファイルにあります:

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

それが役立つことを願っています。

于 2010-09-14T01:34:58.783 に答える
0

私は同様の問題を抱えていますが、私のものは Core Text を含むカスタムビューを作成することです。ビューの drawRect が行を呼び出すとすぐに

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

シミュレーターでもデバイスでも、アプリがハングします。奇妙なことに、View Controller の viewDidLoad メソッドで別の UIKit テキスト コンポーネントを割り当て初期化することで、これを修正できます。サブビューとして追加する必要さえありません。Core Text がフォントに読み込まれる前に、いくつかの一般的なテキスト要素が読み込まれる必要があるようです。

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

変。

于 2010-09-23T10:28:55.403 に答える
0

私はまったく同じ問題を抱えています。それが完全な答えではないことは知っていますが、ここに私が見つけたものがあります。

関連する関数 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 クラスの名前をどこで尋ねることができるのでしょうか。

お役に立てれば...

于 2010-09-13T19:35:01.707 に答える