2016-05-26 4 views
0

В чем причина этого A/libc: invalid address or address of corrupt block 0x5da90aa0 passed to dlfree и A/libc: Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1), thread 19239 (IntentService[K)intermitent crash?Ошибка с кодом

Код C++ вызывает сбой. Никакие исключения не улавливаются с Java-land. Крушение наблюдается с перерывами на Android 4.4.4. Я не наблюдал его на Android 6.0.

код родной точки входа/выхода:

JNIEXPORT jstring 
JNICALL Java_com_company_product_ClassJNI_foo(JNIEnv* env, jobject obj, jstring options) 
{ 
    const jsize  optionLength = env->GetStringUTFLength(options); 
    std::vector <char> optionsBuffer(static_cast<int>(optionLength)); 
    env->GetStringUTFRegion(options, 0, optionLength, optionsBuffer.data()); 
    const std::string nativeOptions(optionsBuffer.cbegin(), optionsBuffer.cend()); 

    try 
    { 
     SerialWrapper si(env, obj); 
     const std::string result = Procedure::exec(nativeOptions, si); 

     // gets this far 

     return env->NewStringUTF(result.c_str()); 
    } 
    catch (const JObjectError& e) 
    { 
     const JSON jsonError{{PROP_ERROR, std::string(e.what())}}; 
     return env->NewStringUTF(jsonError.dump().c_str()); 
    } 
} 

Я прочитал, казалось бы, связанные сообщения обсуждают несколько потоков доступа к ресурсу, и я не верю, что будет вопрос здесь.

+0

Ваш обратный звонок действительно в 'catch' блок? Что возвращает ваша функция, если нет исключения? Это, скорее всего, вызовет крах. –

ответ

0

я не управлял родные строковые ресурсы правильно в первые несколько строк:

// problematic 
const jsize  optionLength = env->GetStringUTFLength(options); 
std::vector <char> optionsBuffer(static_cast<int>(optionLength)); 
env->GetStringUTFRegion(options, 0, optionLength, optionsBuffer.data()); 
const std::string nativeOptions(optionsBuffer.cbegin(), optionsBuffer.cend()); 

и когда очистка происходит на родном выходе, неправильное освобождение произошло.

После создания/использования этой функции полезности:

std::string createStdString(JNIEnv& env, jstring& javaString) 
{ 
    // appears to work 
    const char* rawString = env.GetStringUTFChars(javaString, nullptr); 
    const std::string nativeString(rawString); 
    env.ReleaseStringUTFChars(javaString, rawString); 
    return nativeString; 
} 

Я не наблюдал аварию.

Это сообщение было полезно: https://community.oracle.com/thread/1549127

Смежные вопросы