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
呼び出しを無視します。どこで行うべきですか?