uname -mr:B.11.23 ia64
g++ --版本:g++ (GCC) 4.4.0
java-版本:
Java(TM) SE 运行时环境(build 1.6.0.06-jinteg_20_jan_2010_05_50-b00) Java HotSpot(TM) Server VM(build 14.3-b01-jre1.6.0.06-rc1,混合模式)
我正在尝试运行使用 JNI 的 Java 应用程序。它在 JNI 代码中崩溃,并带有以下(缩写)堆栈跟踪:
(0) 0xc0000000249353e0 VMError::report_and_die{_ZN7VMError14report_and_dieEv} + 0x440 在 /CLO/Components/JAVA_HOTSPOT/Src/src/share/vm/utilities/vmError.cpp:738 [/opt/java6/jre/lib/IA64W/server/ libjvm.so] (1) 0xc000000024559240 os::Hpux::JVM_handle_hpux_signal{_ZN2os4Hpux22JVM_handle_hpux_signalEiP9 __siginfoPvi} + 0x760 在 /CLO/Components/JAVA_HOTSPOT/Src/src/os_cpu/hp-ux_ia64/vm/os_hp-ux_ia64.cpp:1051 [/opt/java6/jre/lib/IA64W/server/libjvm.so] (2) 0xc0000000245331c0 os::Hpux::signalHandler{_ZN2os4Hpux13signalHandlerEiP9__siginfoPv} + 0x80 在 /CLO/Components/JAVA_HOTSPOT/Src/src/os/hp-ux/vm/os_hp-ux.cpp:4295 [/opt/java6/jre /lib/IA64W/server/libjvm.so] (3) 0xe00000010e002620 ---- 信号 11 (SIGSEGV) 传递 ---- (4) 0xc0000000000d2d20 __pthread_mutex_lock + 0x400 在 /ux/core/libs/threadslibs/src/common/pthreads/mutex.c:3895 [/usr/lib/hpux64/libpthread.so.1] (5) 0xc000000000342e90 __thread_mutex_lock + 0xb0 at ../../../../../core/libs/libc/shared_em_64/../core/threads/wrappers1.c:273 [/usr/lib/hpux64 /libc.so.1] (6) 0xc00000000177dff0 _HPMutexWrapper::lock{_ZN15_HPMutexWrapper4lockEPv} + 0x90 [/usr/lib/hpux64/libstd_v2.so.1] (7) 0xc0000000017e9960 std::basic_string,std::allocator{_ZNSsC1ERKSs} + 0x80 [/usr/lib/hpux64/libstd_v2.so.1] (8) 0xc000000008fd9fe0 JniString::str{_ZNK9JniString3strEv} + 0x50 在 eg_handler_jni.cxx:50 [/soft/bus-7_0/lib/libbus_registry_jni.so.7.0.0] (9) 0xc000000008fd7060 pt_efacec_se_aut_frk_cmp_registry_REGHandler::getKey{_ZN44pt_efacec_se_aut_frk_cmp_registry_REGHandler6getKeyEP8_jstringi} + 0xa0 [/soft/bus-7_0/lib/libbus_registry_jni.so.7.0.0] (10) 0xc000000008fd17f0 Java_pt_efacec_se_aut_frk_cmp_registry_REGHandler_getKey__Ljava_lang_String_2I + 0xa0 [/soft/bus-7_0/lib/libbus_registry_jni.so.7.0.0] (11) 0x9fffffffdf400ed0 展开堆栈时出现内部错误 (-3) [/CLO/Components/JAVA_HOTSPOT/Src/src/os_cpu/hp-ux_ia64/vm/thread_hp-ux_ia64.cpp:142]
此 JNI 代码和依赖项是使用 g++ 编译的,是多线程和 64 位 (-pthread -mlp64 -shared -fPIC)。LD_LIBRARY_PATH 环境变量设置依赖位置,并在 JNI 共享库上运行 ldd 找到它们:
ldd libbus_registry_jni.so:
libefa-d.so.7 => /soft/bus-7_0/lib/libefa-d.so.7 libbus_registry-d.so.7 => /soft/bus-7_0/lib/libbus_registry-d.so.7 libboost_thread-gcc44-mt-d-1_41.so => /usr/local/lib/libboost_thread-gcc44-mt-d-1_41.so libboost_system-gcc44-mt-d-1_41.so => /usr/local/lib/libboost_system-gcc44-mt-d-1_41.so libboost_regex-gcc44-mt-d-1_41.so => /usr/local/lib/libboost_regex-gcc44-mt-d-1_41.so librt.so.1 => /usr/lib/hpux64/librt.so.1 libstdc++.so.6 => /opt/hp-gcc-4.4.0/lib/gcc/ia64-hp-hpux11.23/4.4.0/../../../hpux64/libstdc++.so.6 libm.so.1 => /usr/lib/hpux64/libm.so.1 libgcc_s.so.0 => /opt/hp-gcc-4.4.0/lib/gcc/ia64-hp-hpux11.23/4.4.0/../../../hpux64/libgcc_s.so.0 libunwind.so.1 => /usr/lib/hpux64/libunwind.so.1 librt.so.1 => /usr/lib/hpux64/librt.so.1 libm.so.1 => /usr/lib/hpux64/libm.so.1 libunwind.so.1 => /usr/lib/hpux64/libunwind.so.1 libdl.so.1 => /usr/lib/hpux64/libdl.so.1 libunwind.so.1 => /usr/lib/hpux64/libunwind.so.1 libc.so.1 => /usr/lib/hpux64/libc.so.1 libuca.so.1 => /usr/lib/hpux64/libuca.so.1
查看堆栈跟踪,奇怪的是,虽然正在使用 ldd list g++ 的 libstdc++,但报告为已使用的 std:string 复制 c'tor 是 libstd_v2 中的一个,这是 aCC 提供的实现。
当 str() 方法返回时,崩溃发生在以下代码中:
类 JniString { 标准::字符串 m_utf8; 上市: JniString(JNIEnv* env, jstring 实例) { const char* utf8Chars = env->GetStringUTFChars(instance, 0); 如果(utf8Chars == 0){ 环境->异常清除();// RPF throw std::runtime_error("GetStringUTFChars 返回 0"); } m_utf8.assign(utf8Chars); env->ReleaseStringUTFChars(instance, utf8Chars); } std::string str() 常量 { 返回 m_utf8; } };
同时使用两个 C++ 实现可能是导致崩溃的原因,但这不应该发生。
有任何想法吗?