1

JNI (Clang C-API) 経由で Clang を使用しようとしています。いくつかの反復の後、新しいオブジェクトの作成を停止してクラッシュします。

map method 0 args: create Method instance 0x7fa26ba23c90 0x7fa26ba2a0c0 libclang: インデックス作成中にクラッシュが検出されまし
た['-c', '-x', 'c++'], 'unsaved_files': [],
'options': 0, }

コードは非常に単純です。

mapMethod(JNIEnv *env, const CXIdxDeclInfo *info) {

    debug("map method");

    int numArgs = clang_Cursor_getNumArguments(info->cursor);
    debug("  %i args:", numArgs);

    debug("create Method instance %p %p", MethodClass, MethodConstructor);
    jobject result = env->NewObject(MethodClass, MethodConstructor);

    debug("create Method  params instance");

メソッド クラスとコンストラクターが正しく検出され、グローバルとして登録されている (そうであると思われる) ため、いくつかの反復で動作します。

// method
    MethodClass = (jclass)env->NewGlobalRef(env->FindClass("name/antonsmirnov/clang/dto/index/Method"));
    debug(MethodClass != NULL ? "found MethodClass" : "not found MethodClass");

    MethodConstructor = env->GetMethodID(MethodClass, "<init>", "()V");
    debug(MethodConstructor != NULL ? "found MethodConstructor" : "not found MethodConstructor");

私はいくつかの「jniのヒントとコツ」の記事を読んで、env->DeleteLocalRef試してみるだけでローカル参照が大きすぎるようにしようとしましたが、結果はありません:

// magic 
    jint ensureResult = env->EnsureLocalCapacity(1024);
    debug("ensure result %i", ensureResult);

    jint pushResult = env->PushLocalFrame(1024);
    debug("push result %i", pushResult);

Clang が例外をハイジャックしているため、本当の理由がわかりません。私が言ったように、問題は数回の繰り返しの後に発生するため、制限を超えた問題または問題のようです。

なにが問題ですか?

更新:私はいくつかの調査を行ったところ、以前にいくつかのローカル変数を削除すると、1回の反復と1回のオブジェクトインスタンスを取得できることがわかりました。したがって、実際に16個のローカル変数を使用しているように感じ、EnsureLocalCapacity呼び出しを無視します。どこで行うべきですか?

4

2 に答える 2

1

EnsureLocalCapacityin の使用を修正しましたJNI_OnLoad()(各ネイティブ メソッド呼び出しでは機能しませんでした)。

于 2013-11-11T08:17:07.847 に答える