OSVR-Android-Build icon indicating copy to clipboard operation
OSVR-Android-Build copied to clipboard

Crash on GearVR with Unity

Open janoc opened this issue 10 years ago • 6 comments

I am getting this crash with Unity. The same code works OK when called from a Java app via JNI. Memory management problem? The same code works OK on PC/Windows.

This was tested against an external server with Razer Hydra (default empty config file) running on a PC, with both the localhost rewriting and the yet unmerged remote server API patches.

I/Unity   (13506):

I/Unity   (13506): (Filename: C Line: 0)

I/Unity   (13506):

I/Unity   (13506): [OSVR] Starting with app ID: com.reviatech.testapp4 and hostName2: 10.10.28.104

I/Unity   (13506): UnityEngine.Debug:Internal_Log(Int32, String, Object)

I/Unity   (13506): UnityEngine.Debug:Log(Object)

I/Unity   (13506): OSVR.Unity.ClientKit:EnsureStarted() (at C:\R\Dev\OSVR-Unity\OSVR-Unity\Assets\OSVRUnity\src\ClientKit.cs:79)

I/Unity   (13506): OSVR.Unity.ClientKit:OnEnable() (at C:\R\Dev\OSVR-Unity\OSVR-Unity\Assets\OSVRUnity\src\ClientKit.cs:101)

I/Unity   (13506):

I/Unity   (13506): (Filename: C Line: 0)

I/Unity   (13506):

I/DEBUG   (12910): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***

I/DEBUG   (12910): Build fingerprint: 'samsung/zerofltexx/zeroflte:5.0.2/LRX22G/G920FXXU1AOE3:user/release-keys'

I/DEBUG   (12910): Revision: '11'

I/DEBUG   (12910): ABI: 'arm'

I/DEBUG   (12910): pid: 13506, tid: 13524, name: UnityMain  >>> com.Reviatech.gearvrosvr <<<

I/DEBUG   (12910): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xe08005d8

I/DEBUG   (12910):     r0 0000007a  r1 e08005b8  r2 00000001  r3 f772cfac

I/DEBUG   (12910):     r4 e0800000  r5 ffffff28  r6 e087be94  r7 f7720650

I/DEBUG   (12910):     r8 f033ffc0  r9 0000000c  sl da682c98  fp efdfec3c

I/DEBUG   (12910):     ip e0875ec8  sp efdfebc8  lr f76c9819  pc f7700510  cpsr 20000030

I/DEBUG   (12910):

I/DEBUG   (12910): backtrace:

I/DEBUG   (12910):     #00 pc 00049510  /system/lib/libc.so (ifree+47)

I/DEBUG   (12910):     #01 pc 00012817  /system/lib/libc.so (free+10)

I/DEBUG   (12910):     #02 pc 001e81c4  /data/app/com.Reviatech.gearvrosvr-1/lib/arm/libosvrCommon.so (std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()+80)

I/DEBUG   (12910):     #03 pc 0017aa48  /data/app/com.Reviatech.gearvrosvr-1/lib/arm/libosvrCommon.so (Json::Reader::~Reader()+28)

I/DEBUG   (12910):     #04 pc 001a5f7c  /data/app/com.Reviatech.gearvrosvr-1/lib/arm/libosvrCommon.so (void osvr::common::serialization::JSONSerializationTraitsBase<osvr::common::serialization::JsonOn

lyMessageTag, osvr::common::serialization::StringOnlyMessageTag>::deserialize<osvr::common::BufferReader<osvr::common::ExternalBufferReadingWrapper<char> > >(osvr::common::BufferReader<osvr::common::E

xternalBufferReadingWrapper<char> >&, Json::Value&, osvr::common::serialization::JsonOnlyMessageTag const&)+268)

I/DEBUG   (12910):     #05 pc 001a5c60  /data/app/com.Reviatech.gearvrosvr-1/lib/arm/libosvrCommon.so (void osvr::common::serialization::deserializeRaw<Json::Value, osvr::common::BufferReader<osvr::co

mmon::ExternalBufferReadingWrapper<char> >, osvr::common::serialization::JsonOnlyMessageTag>(osvr::common::BufferReader<osvr::common::ExternalBufferReadingWrapper<char> >&, Json::Value&, osvr::common:

:serialization::JsonOnlyMessageTag const&)+36)

I/DEBUG   (12910):     #06 pc 001a58fc  /data/app/com.Reviatech.gearvrosvr-1/lib/arm/libosvrCommon.so (void osvr::common::serialization::DeserializeFunctor<osvr::common::BufferReader<osvr::common::Ext

ernalBufferReadingWrapper<char> > >::apply<Json::Value, osvr::common::serialization::JsonOnlyMessageTag>(boost::call_traits<Json::Value>::reference, osvr::common::serialization::JsonOnlyMessageTag con

st&)+44)

I/DEBUG   (12910):     #07 pc 001a55b0  /data/app/com.Reviatech.gearvrosvr-1/lib/arm/libosvrCommon.so (void osvr::common::serialization::DeserializeFunctor<osvr::common::BufferReader<osvr::common::Ext

ernalBufferReadingWrapper<char> > >::operator()<osvr::common::serialization::JsonOnlyMessageTag, Json::Value>(Json::Value&, osvr::common::serialization::JsonOnlyMessageTag const&)+36)

I/DEBUG   (12910):     #08 pc 001a5020  /data/app/com.Reviatech.gearvrosvr-1/lib/arm/libosvrCommon.so (void osvr::common::messages::ReplacementTreeFromServer::MessageSerialization::processMessage<osvr

::common::serialization::DeserializeFunctor<osvr::common::BufferReader<osvr::common::ExternalBufferReadingWrapper<char> > > >(osvr::common::serialization::DeserializeFunctor<osvr::common::BufferReader

<osvr::common::ExternalBufferReadingWrapper<char> > >&)+40)

I/DEBUG   (12910):     #09 pc 001a4844  /data/app/com.Reviatech.gearvrosvr-1/lib/arm/libosvrCommon.so (void osvr::common::deserialize<osvr::common::BufferReader<osvr::common::ExternalBufferReadingWrap

per<char> >, osvr::common::messages::ReplacementTreeFromServer::MessageSerialization>(osvr::common::BufferReader<osvr::common::ExternalBufferReadingWrapper<char> >&, osvr::common::messages::Replacemen

tTreeFromServer::MessageSerialization&)+48)

I/DEBUG   (12910):     #10 pc 001a41e4  /data/app/com.Reviatech.gearvrosvr-1/lib/arm/libosvrCommon.so (osvr::common::SystemComponent::m_handleReplaceTree(void*, vrpn_HANDLERPARAM)+132)

I/DEBUG   (12910):     #11 pc 001accd8  /data/app/com.Reviatech.gearvrosvr-1/lib/arm/libosvrCommon.so (vrpn_TypeDispatcher::doCallbacksFor(int, int, timeval, unsigned int, char const*)+456)

I/DEBUG   (12910):     #12 pc 001b3458  /data/app/com.Reviatech.gearvrosvr-1/lib/arm/libosvrCommon.so (vrpn_Endpoint::dispatch(int, int, timeval, unsigned int, char*)+164)

I/DEBUG   (12910):     #13 pc 001b30e0  /data/app/com.Reviatech.gearvrosvr-1/lib/arm/libosvrCommon.so (vrpn_Endpoint_IP::getOneTCPMessage(int, char*, unsigned int)+772)

I/DEBUG   (12910):     #14 pc 001b176c  /data/app/com.Reviatech.gearvrosvr-1/lib/arm/libosvrCommon.so (vrpn_Endpoint_IP::handle_tcp_messages(timeval const*)+604)

I/DEBUG   (12910):     #15 pc 001b06c8  /data/app/com.Reviatech.gearvrosvr-1/lib/arm/libosvrCommon.so (vrpn_Endpoint_IP::mainloop(timeval*)+1152)

I/DEBUG   (12910):     #16 pc 001b7450  /data/app/com.Reviatech.gearvrosvr-1/lib/arm/libosvrCommon.so (vrpn_Connection_IP::mainloop(timeval const*)+268)

I/DEBUG   (12910):     #17 pc 0013765c  /data/app/com.Reviatech.gearvrosvr-1/lib/arm/libosvrCommon.so (osvr::common::DeviceWrapper::m_update()+92)

I/DEBUG   (12910):     #18 pc 00126ab8  /data/app/com.Reviatech.gearvrosvr-1/lib/arm/libosvrCommon.so (osvr::common::BaseDevice::update()+168)

I/DEBUG   (12910):     #19 pc 000b0a08  /data/app/com.Reviatech.gearvrosvr-1/lib/arm/libosvrClient.so (osvr::client::PureClientContext::m_update()+272)

I/DEBUG   (12910):     #20 pc 000b0394  /data/app/com.Reviatech.gearvrosvr-1/lib/arm/libosvrClient.so (osvr::client::PureClientContext::PureClientContext(char const*, char const*)+1680)

I/DEBUG   (12910):     #21 pc 000a07b4  /data/app/com.Reviatech.gearvrosvr-1/lib/arm/libosvrClient.so (osvr::client::createContext(char const*, char const*)+172)

I/DEBUG   (12910):     #22 pc 00017e0c  /data/app/com.Reviatech.gearvrosvr-1/lib/arm/libosvrClientKit.so (osvrClientInitHost+132)

I/DEBUG   (12910):     #23 pc 0000f2cc  <unknown>

W/ActivityManager( 3522):   Force finishing activity com.Reviatech.gearvrosvr/com.unity3d.player.UnityPlayerActivity

I/DEBUG   (12910):

I/DEBUG   (12910): Tombstone written to: /data/tombstones/tombstone_00

janoc avatar Jun 23 '15 08:06 janoc

Some additional info - this bug seems to be a known bug with JsonCPP on Android, probably due to some incompatibility with the Android NDK's C++ library implementation.

Here is a mention of this crash in Json::Reader destructor http://tech.bingfengsa.com/a/20131231/6513.html (translation: https://translate.google.fr/translate?sl=auto&tl=en&js=y&prev=_t&hl=en&ie=UTF-8&u=http%3A%2F%2Ftech.bingfengsa.com%2Fa%2F20131231%2F6513.html&edit-text=&act=url )

Basically the reporter suggests to use char * instead of std::string and/or use a single global instance of the Json::Reader() so that it is never destructed, thus avoiding the bug.

Here is a similar report where it was happening on PC, but with an old GCC version: http://stackoverflow.com/questions/17911438/jsoncpp-very-simple-test-crashes-when-jsonreader-goes-ot-of-scope

There is also this report of another crash problem from 2013 that was only fixed this year and it also mentions some sort of issue with the free() implementation on Android in the comment: http://sourceforge.net/p/jsoncpp/bugs/46/

Updating JSON to the latest version 1.6.2 vs. 1.2.1 doesn't fix the original crash, but it is probably a good idea anyway because of the fix from March this year.

janoc avatar Jun 30 '15 14:06 janoc

OK, we have managed to get rid of this crash by:

  • upgrading to the latest jsoncpp
  • switching to gnustl_dynamic (gnustl_static used to be the default)

I have tested the code with both GCC 4.9 and Clang 3.5 and it works with either, so I suspect it was a corner case caused by the gnustl_static linking.

janoc avatar Jul 06 '15 08:07 janoc

Hello,

I guess we could close this issue, couldn't we?

Best,

araujobsd avatar Jun 16 '16 08:06 araujobsd

@araujobsd I am not against, but please verify jsoncpp was updated since this. I know it has been in the mainstream OSVR, but not sure the fixes were merged to the Android repo as well. I am not working on Android right now.

janoc avatar Jun 16 '16 09:06 janoc

OK, I will double check it.

Thanks for the prompt reply janoc :)

araujobsd avatar Jun 16 '16 09:06 araujobsd

Welcome.

janoc avatar Jun 16 '16 09:06 janoc