@@ -183,8 +183,9 @@ static ruby_gc_params_t gc_params = {
183
183
/* RGENGC_CHECK_MODE
184
184
* 0: disable all assertions
185
185
* 1: enable assertions (to debug RGenGC)
186
- * 2: enable bits check (for debugging)
187
- * 3: show all references
186
+ * 2: enable generational bits check (for debugging)
187
+ * 3: enable livness check
188
+ * 4: show all references
188
189
*/
189
190
#ifndef RGENGC_CHECK_MODE
190
191
#define RGENGC_CHECK_MODE 0
@@ -4197,6 +4198,7 @@ reflist_dump(struct reflist *refs)
4197
4198
}
4198
4199
}
4199
4200
4201
+ #if RGENGC_CHECK_MODE >= 3
4200
4202
static int
4201
4203
reflist_refered_from_machine_context (struct reflist * refs )
4202
4204
{
@@ -4207,6 +4209,7 @@ reflist_refered_from_machine_context(struct reflist *refs)
4207
4209
}
4208
4210
return 0 ;
4209
4211
}
4212
+ #endif
4210
4213
4211
4214
struct allrefs {
4212
4215
rb_objspace_t * objspace ;
@@ -4297,7 +4300,7 @@ objspace_allrefs_destruct(struct st_table *refs)
4297
4300
st_free_table (refs );
4298
4301
}
4299
4302
4300
- #if RGENGC_CHECK_MODE >= 3
4303
+ #if RGENGC_CHECK_MODE >= 4
4301
4304
static int
4302
4305
allrefs_dump_i (st_data_t k , st_data_t v , st_data_t ptr )
4303
4306
{
@@ -4337,9 +4340,11 @@ gc_check_before_marks_i(st_data_t k, st_data_t v, void *ptr)
4337
4340
/* parent is old */
4338
4341
if (!MARKED_IN_BITMAP (GET_HEAP_PAGE (parent )-> rememberset_bits , parent ) &&
4339
4342
!MARKED_IN_BITMAP (GET_HEAP_PAGE (obj )-> rememberset_bits , obj )) {
4340
- fprintf (stderr , "gc_marks_check_i: WB miss %p (%s) -> %p (%s)\n " ,
4343
+ fprintf (stderr , "gc_marks_check_i: WB miss %p (%s) -> %p (%s) " ,
4341
4344
(void * )parent , obj_type_name (parent ),
4342
4345
(void * )obj , obj_type_name (obj ));
4346
+ reflist_dump (refs );
4347
+ fprintf (stderr , "\n" );
4343
4348
objspace -> rgengc .error_count ++ ;
4344
4349
}
4345
4350
}
@@ -4348,6 +4353,7 @@ gc_check_before_marks_i(st_data_t k, st_data_t v, void *ptr)
4348
4353
return ST_CONTINUE ;
4349
4354
}
4350
4355
4356
+ #if RGENGC_CHECK_MODE >= 3
4351
4357
static int
4352
4358
gc_check_after_marks_i (st_data_t k , st_data_t v , void * ptr )
4353
4359
{
@@ -4372,6 +4378,7 @@ gc_check_after_marks_i(st_data_t k, st_data_t v, void *ptr)
4372
4378
}
4373
4379
return ST_CONTINUE ;
4374
4380
}
4381
+ #endif
4375
4382
4376
4383
static void
4377
4384
gc_marks_check (rb_objspace_t * objspace , int (* checker_func )(ANYARGS ), const char * checker_name )
@@ -4387,7 +4394,7 @@ gc_marks_check(rb_objspace_t *objspace, int (*checker_func)(ANYARGS), const char
4387
4394
st_foreach (objspace -> rgengc .allrefs_table , checker_func , (st_data_t )objspace );
4388
4395
4389
4396
if (objspace -> rgengc .error_count > 0 ) {
4390
- #if RGENGC_CHECK_MODE >= 3
4397
+ #if RGENGC_CHECK_MODE >= 4
4391
4398
allrefs_dump (objspace );
4392
4399
#endif
4393
4400
rb_bug ("%s: GC has problem." , checker_name );
@@ -4445,7 +4452,7 @@ gc_marks(rb_objspace_t *objspace, int full_mark)
4445
4452
}
4446
4453
#endif
4447
4454
4448
- #if RGENGC_CHECK_MODE >= 2
4455
+ #if RGENGC_CHECK_MODE >= 3
4449
4456
gc_marks_check (objspace , gc_check_after_marks_i , "after_marks" );
4450
4457
#endif
4451
4458
0 commit comments