Skip to content

mono sgen problem  #85318

@srxqds

Description

@srxqds

we have hit the sgen proble when gc collection, the whole call stack show below :

>	mono-2.0-sgen.dll!copy_object_no_checks(_MonoObject * obj, _SgenGrayQueue * queue) Line 69	C
 	[Inline Frame] mono-2.0-sgen.dll!major_copy_or_mark_object_with_evacuation(_MonoObject * * obj, _MonoObject *) Line 86	C
 	mono-2.0-sgen.dll!major_scan_object_with_evacuation(_MonoObject * full_object, unsigned __int64 desc, _SgenGrayQueue * queue) Line 64	C
 	[Inline Frame] mono-2.0-sgen.dll!SGEN_LOAD_VTABLE_UNCHECKED(_MonoObject *) Line 23	C
 	[Inline Frame] mono-2.0-sgen.dll!sgen_safe_object_get_size(_MonoObject *) Line 757	C
 	mono-2.0-sgen.dll!sgen_cardtable_scan_object(_MonoObject * obj, unsigned __int64 block_obj_size, unsigned char * cards, ScanCopyContext ctx) Line 594	C
 	mono-2.0-sgen.dll!scan_card_table_for_block(_MSBlockInfo * block, CardTableScanType scan_type, ScanCopyContext ctx) Line 2625	C
 	mono-2.0-sgen.dll!major_scan_card_table(CardTableScanType scan_type, ScanCopyContext ctx, int job_index, int job_split_count, int block_count) Line 2667	C
 	mono-2.0-sgen.dll!job_scan_major_mod_union_card_table(void * worker_data_untyped, _SgenThreadPoolJob * job) Line 1483	C
 	mono-2.0-sgen.dll!sgen_workers_enqueue_job(int generation, _SgenThreadPoolJob * job, int enqueue) Line 185	C
 	mono-2.0-sgen.dll!major_copy_or_mark_from_roots(_SgenGrayQueue * gc_thread_gray_queue, unsigned __int64 * old_next_pin_slot, CopyOrMarkFromRootsMode mode, SgenObjectOperations * object_ops_nopar, SgenObjectOperations * object_ops_par) Line 2107	C
 	mono-2.0-sgen.dll!major_finish_collection(_SgenGrayQueue * gc_thread_gray_queue, const char * reason, int is_overflow, unsigned __int64 old_next_pin_slot, int forced) Line 2212	C
 	[Inline Frame] mono-2.0-sgen.dll!major_finish_concurrent_collection(int) Line 2460	C
 	mono-2.0-sgen.dll!sgen_perform_collection_inner(unsigned __int64 requested_size, int generation_to_collect, const char * reason, int forced_serial, int stw) Line 2549	C
 	[Inline Frame] mono-2.0-sgen.dll!sgen_perform_collection(unsigned __int64) Line 2636	C
 	mono-2.0-sgen.dll!sgen_ensure_free_space(unsigned __int64 size, int generation) Line 2511	C
 	mono-2.0-sgen.dll!sgen_alloc_obj_nolock(MonoVTable * vtable, unsigned __int64 size) Line 241	C
 	mono-2.0-sgen.dll!mono_gc_alloc_vector(MonoVTable * vtable, unsigned __int64 size, unsigned __int64 max_length) Line 1317	C

the vt is nullptr

static MONO_NEVER_INLINE GCObject *
copy_object_no_checks (GCObject *obj, SgenGrayQueue *queue)
{
	GCVTable vt = SGEN_LOAD_VTABLE_UNCHECKED (obj);
	gboolean has_references = SGEN_VTABLE_HAS_REFERENCES (vt);

how can I figure out the reason about it, can you give some advice or tricks to find what's wrong with it.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions