HaxeFoundation / hxcpp

Runtime files for c++ backend for haxe
Other
295 stars 184 forks source link

hx::MarkObjectAlloc Android crash. #1138

Open rainyt opened 1 month ago

rainyt commented 1 month ago
Stack frame #00 pc 0000000003065f3c /data/data/com.sxk.dark/cache/arm64-v8a-8-1-15-15/lib/arm64-v8a/libApplicationMain.so: Routine hx::MarkObjectAlloc(hx::Object*, hx::MarkContext*) at /Users/rainy/Documents/haxelib/hxcpp/4,3,2/include/hx/GC.h:496
Stack frame #01 pc 00000000030724f4 /data/data/com.sxk.dark/cache/arm64-v8a-8-1-15-15/lib/arm64-v8a/libApplicationMain.so: Routine hx::MarkContext::processMarkStack() at /Users/rainy/Documents/haxelib/hxcpp/4,3,2/src/hx/gc/Immix.cpp:1917
Stack frame #02 pc 0000000003074348 /data/data/com.sxk.dark/cache/arm64-v8a-8-1-15-15/lib/arm64-v8a/libApplicationMain.so: Routine GlobalAllocator::Collect(bool, bool, bool, bool) at /Users/rainy/Documents/haxelib/hxcpp/4,3,2/src/hx/gc/Immix.cpp:4942
Stack frame #03 pc 00000000030759bc /data/data/com.sxk.dark/cache/arm64-v8a-8-1-15-15/lib/arm64-v8a/libApplicationMain.so: Routine LocalAllocator::SetupStackAndCollect(bool, bool, bool, bool) at /Users/rainy/Documents/haxelib/hxcpp/4,3,2/src/hx/gc/Immix.cpp:6020
Stack frame #04 pc 000000000306db74 /data/data/com.sxk.dark/cache/arm64-v8a-8-1-15-15/lib/arm64-v8a/libApplicationMain.so: Routine GlobalAllocator::GetNextFree(int) at /Users/rainy/Documents/haxelib/hxcpp/4,3,2/src/hx/gc/Immix.cpp:3356
Stack frame #05 pc 000000000306e61c /data/data/com.sxk.dark/cache/arm64-v8a-8-1-15-15/lib/arm64-v8a/libApplicationMain.so: Routine LocalAllocator::CallAlloc(int, unsigned int) at /Users/rainy/Documents/haxelib/hxcpp/4,3,2/src/hx/gc/Immix.cpp:6287
Stack frame #06 pc 0000000000c6f4b8 /data/data/com.sxk.dark/cache/arm64-v8a-8-1-15-15/lib/arm64-v8a/libApplicationMain.so: Routine hx::ImmixAllocator::alloc(hx::ImmixAllocator*, unsigned long, bool, char const*) at /Users/rainy/Documents/haxelib/hxcpp/4,3,2/include/hx/GC.h:372 (discriminator 4)
Stack frame #07 pc 00000000007b5cc4 /data/data/com.sxk.dark/cache/arm64-v8a-8-1-15-15/lib/arm64-v8a/libApplicationMain.so: Routine hx::ObjectPtr<differ::data::ShapeCollision_obj>::operator=(hx::ObjectPtr<differ::data::ShapeCollision_obj> const&) at /Users/rainy/Documents/haxelib/hxcpp/4,3,2/include/hx/Object.h:366
Stack frame #08 pc 0000000002640f68 /data/data/com.sxk.dark/cache/arm64-v8a-8-1-15-15/lib/arm64-v8a/libApplicationMain.so: Routine hx::StackFrame::~StackFrame() at /Users/rainy/Documents/haxelib/hxcpp/4,3,2/include/hx/StackContext.h:673
Stack frame #09 pc 0000000002d1e358 /data/data/com.sxk.dark/cache/arm64-v8a-8-1-15-15/lib/arm64-v8a/libApplicationMain.so: Routine hx::StackFrame::~StackFrame() at /Users/rainy/Documents/haxelib/hxcpp/4,3,2/include/hx/StackContext.h:673
Stack frame #10 pc 00000000011b2408 /data/data/com.sxk.dark/cache/arm64-v8a-8-1-15-15/lib/arm64-v8a/libApplicationMain.so: Routine game::display::World_obj::onWorldRepel(Array<Dynamic>) at /Users/rainy/Documents/project/DarkCuisine2/branch/DarkCuisine2_24_07_29/Export/android/obj/./src/game/display/World.cpp:1920 (discriminator 1)
Stack frame #11 pc 00000000011b3c24 /data/data/com.sxk.dark/cache/arm64-v8a-8-1-15-15/lib/arm64-v8a/libApplicationMain.so: Routine game::display::World_obj::onTestCollier() at /Users/rainy/Documents/project/DarkCuisine2/branch/DarkCuisine2_24_07_29/Export/android/obj/./src/game/display/World.cpp:1766
Stack frame #12 pc 00000000011b6628 /data/data/com.sxk.dark/cache/arm64-v8a-8-1-15-15/lib/arm64-v8a/libApplicationMain.so: Routine hx::ObjectPtr<game::display::world::WorldBox_obj>::operator->() at /Users/rainy/Documents/haxelib/hxcpp/4,3,2/include/hx/Object.h:378
Stack frame #13 pc 0000000001a4fb48 /data/data/com.sxk.dark/cache/arm64-v8a-8-1-15-15/lib/arm64-v8a/libApplicationMain.so: Routine game::worlds::OnlineWorld_obj::onFrame() at /Users/rainy/Documents/project/DarkCuisine2/branch/DarkCuisine2_24_07_29/Export/android/obj/./src/game/worlds/OnlineWorld.cpp:738
Stack frame #14 pc 00000000016c2dec /data/data/com.sxk.dark/cache/arm64-v8a-8-1-15-15/lib/arm64-v8a/libApplicationMain.so: Routine game::worlds::GameWorld_obj::onFrame() at /Users/rainy/Documents/project/DarkCuisine2/branch/DarkCuisine2_24_07_29/Export/android/obj/./src/game/worlds/GameWorld.cpp:2083
Stack frame #15 pc 0000000001b2e6cc /data/data/com.sxk.dark/cache/arm64-v8a-8-1-15-15/lib/arm64-v8a/libApplicationMain.so: Routine zygame::core::Start_obj::onFrameEvent(hx::ObjectPtr<openfl::events::Event_obj>) at /Users/rainy/Documents/project/DarkCuisine2/branch/DarkCuisine2_24_07_29/Export/android/obj/./src/zygame/core/Start.cpp:818
Stack frame #16 pc 0000000001b2ee68 /data/data/com.sxk.dark/cache/arm64-v8a-8-1-15-15/lib/arm64-v8a/libApplicationMain.so: Routine hx::ObjectPtr<hx::Object>::ObjectPtr() at /Users/rainy/Documents/haxelib/hxcpp/4,3,2/include/hx/Object.h:335
Stack frame #17 pc 0000000003014eb4 /data/data/com.sxk.dark/cache/arm64-v8a-8-1-15-15/lib/arm64-v8a/libApplicationMain.so: Routine hx::CMemberFunction1::__run(Dynamic const&) at /Users/rainy/Documents/haxelib/hxcpp/4,3,2/include/hx/DynamicImpl.h:153
Stack frame #18 pc 00000000028f0698 /data/data/com.sxk.dark/cache/arm64-v8a-8-1-15-15/lib/arm64-v8a/libApplicationMain.so: Routine hx::ObjectPtr<openfl::events::Event_obj>::operator->() at /Users/rainy/Documents/haxelib/hxcpp/4,3,2/include/hx/Object.h:378
Stack frame #19 pc 0000000000f3c39c /data/data/com.sxk.dark/cache/arm64-v8a-8-1-15-15/lib/arm64-v8a/libApplicationMain.so: Routine hx::ObjectPtr<openfl::events::Event_obj>::operator->() at /Users/rainy/Documents/haxelib/hxcpp/4,3,2/include/hx/Object.h:378

Hi everyone, recently after fixing the interface type crash (https://github.com/HaxeFoundation/haxe/pull/11743), the backend only has a crash related to MarkObject Alloc, which makes me think it may be related to GC. Can you help me see what could be causing this?

This error message is quite random, except for the almost identical call stack above, but the rest below is mostly random.

rainyt commented 1 month ago
-D HXCPP_GC_GENERATIONAL
-D HXCPP_CHECK_POINTER
-D HXCPP_STACK_LINE
-D HXCPP_DEBUG_LINK
-D HXCPP_STACK_TRACE

Current define.

rainyt commented 1 month ago

https://github.com/HaxeFoundation/hxcpp/pull/1085 Will this be helpful?

hughsando commented 1 month ago

I don't think the pinning code is relevant here. Debugging GC errors can be a bit painful. There are some possibilities - a bug with the marking, or incorrect usage, particularly around thread attaching and detaching. First test is to try -debug mode and take off HXCPP_GC_GENERATIONAL - see if that helps. Another step it to try to identify the offending object, and who owns or should own it. If you uncomment #define HXCPP_GC_DEBUG_LEVEL 1 in Immix.cpp then the stack trace of the crash should be more informative. Also, what library are you using? openfl/nme/etc?

rainyt commented 1 month ago

in Immix.cpp then the stack trace of the crash should be more informative.

Hi, I use the OpenFL library, and if I stop using 'HXCPP_GC_GENERATIONAL', there may be a brief pause in GC requests after a few seconds, which can make users uncomfortable. I would prefer to keep 'HXCPP_GC_GENERATIONAL', but you mentioned that 'HXCPP_GC_GENERATIONAL' is a definition that may cause GC problems, and I will try to remove it and test it again.

I may not be able to debug it because I rarely encounter this issue and reproducing it is very difficult.

hughsando commented 1 month ago

Yes, without a good way of reproducing, it is hard to know. Check the performance of HXCPP_GC_DEBUG_LEVEL 1 If you find it acceptable, it could be worthwhile putting this on in production. I also would expect some lime/openfl code on the callstack. Perhaps lime could be build with -D HXCPP_DEBUG_LINK too, so they might show up.

rainyt commented 1 month ago
:MarkObjectAllocUnchecked(hx::Object*, hx::MarkContext*) at /Users/rainy/Documents/haxelib/hxcpp/4,3,2/src/hx/gc/Immix.cpp:2200
Stack frame #232 pc 000000000307a130  /data/data/com.sxk.dark/cache/arm64-v8a-8-6-09-13/lib/arm64-v8a/libApplicationMain.so: Routine hx::MarkObjectAllocUnchecked(hx::Object*, hx::MarkContext*) at /Users/rainy/Documents/haxelib/hxcpp/4,3,2/src/hx/gc/Immix.cpp:2200
Stack frame #233 pc 000000000307a130  /data/data/com.sxk.dark/cache/arm64-v8a-8-6-09-13/lib/arm64-v8a/libApplicationMain.so: Routine hx::MarkObjectAllocUnchecked(hx::Object*, hx::MarkContext*) at /Users/rainy/Documents/haxelib/hxcpp/4,3,2/src/hx/gc/Immix.cpp:2200
Stack frame #234 pc 000000000307a130  /data/data/com.sxk.dark/cache/arm64-v8a-8-6-09-13/lib/arm64-v8a/libApplicationMain.so: Routine hx::MarkObjectAllocUnchecked(hx::Object*, hx::MarkContext*) at /Users/rainy/Documents/haxelib/hxcpp/4,3,2/src/hx/gc/Immix.cpp:2200
Stack frame #235 pc 000000000307a130  /data/data/com.sxk.dark/cache/arm64-v8a-8-6-09-13/lib/arm64-v8a/libApplicationMain.so: Routine hx::MarkObjectAllocUnchecked(hx::Object*, hx::MarkContext*) at /Users/rainy/Documents/haxelib/hxcpp/4,3,2/src/hx/gc/Immix.cpp:2200
Stack frame #236 pc 000000000307a130  /data/data/com.sxk.dark/cache/arm64-v8a-8-6-09-13/lib/arm64-v8a/libApplicationMain.so: Routine hx::MarkObjectAllocUnchecked(hx::Object*, hx::MarkContext*) at /Users/rainy/Documents/haxelib/hxcpp/4,3,2/src/hx/gc/Immix.cpp:2200
Stack frame #237 pc 000000000307a130  /data/data/com.sxk.dark/cache/arm64-v8a-8-6-09-13/lib/arm64-v8a/libApplicationMain.so: Routine hx::MarkObjectAllocUnchecked(hx::Object*, hx::MarkContext*) at /Users/rainy/Documents/haxelib/hxcpp/4,3,2/src/hx/gc/Immix.cpp:2200

When I added the loop error that occurred after HXCPP_GC_DEBUG_LEVEL 1, I didn't see any other useful information.

hughsando commented 1 month ago

Yes, that is a bit of a shame. It looks like it is marking a large linked-list, and the important information (which linked list) is missing because of the stack size. It may have crashed because of a stack-overflow too, due to debug marking, which is a weakness of this method. As a side note, it is much better for hxcpp speed to use an Array, rather than a List, for almost every situation, particularly for collection speed. Do you know of large-ish linked lists, and can they be replaced? However, it might be the underlying library that is creating the list.

rainyt commented 1 month ago

I'm not sure, is there any other way I can debug it? like ignore the List?

rainyt commented 2 weeks ago

After I removed the definition of HXCPP_GC_GENERATIONAL, most crashes have disappeared.

there may be a brief pause in GC requests after a few seconds Is there any other way to relieve it? I hope to give players a stable enough experience.

If you have any message, please let me know, thank you. @hughsando

barisyild commented 2 weeks ago

HXCPP_GC_GENERATIONAL increases the probability of a crash for me too :(