Skip to content

Destination not object when scanning iseq #106

@wks

Description

@wks

We observed in the CI https://github.com/mmtk/mmtk-ruby/actions/runs/10933871805/job/30353030059 that a field of an iseq, is pointing to a non-MMTk object.

 ERROR: An MMTk GC thread panicked.  This is a bug.
     panicked at src/scanning.rs:42:13:
     Destination is not an MMTk object. Src: 0x200fff6ee58 dst: 0x200fff12718
        0: mmtk_ruby::handle_gc_thread_panic
                  at /home/runner/work/mmtk-ruby/mmtk-ruby/git/mmtk-ruby/mmtk/src/lib.rs:101:14
        1: mmtk_ruby::set_panic_hook::{{closure}}
                  at /home/runner/work/mmtk-ruby/mmtk-ruby/git/mmtk-ruby/mmtk/src/lib.rs:130:13
        2: <alloc::boxed::Box<F,A> as core::ops::function::Fn<Args>>::call
                  at /rustc/aedd173a2c086e558c2b66d3743b344f977621a7/library/alloc/src/boxed.rs:2029:9
        3: std::panicking::rust_panic_with_hook
                  at /rustc/aedd173a2c086e558c2b66d3743b344f977621a7/library/std/src/panicking.rs:785:13
        4: std::panicking::begin_panic_handler::{{closure}}
                  at /rustc/aedd173a2c086e558c2b66d3743b344f977621a7/library/std/src/panicking.rs:659:13
        5: std::sys_common::backtrace::__rust_end_short_backtrace
                  at /rustc/aedd173a2c086e558c2b66d3743b344f977621a7/library/std/src/sys_common/backtrace.rs:171:18
        6: rust_begin_unwind
                  at /rustc/aedd173a2c086e558c2b66d3743b344f977621a7/library/std/src/panicking.rs:647:5
        7: core::panicking::panic_fmt
                  at /rustc/aedd173a2c086e558c2b66d3743b344f977621a7/library/core/src/panicking.rs:72:14
        8: <mmtk_ruby::scanning::VMScanning as mmtk::vm::scanning::Scanning<mmtk_ruby::Ruby>>::scan_object_and_trace_edges::{{closure}}
                  at /home/runner/work/mmtk-ruby/mmtk-ruby/git/mmtk-ruby/mmtk/src/scanning.rs:42:13
        9: mmtk_ruby::abi::ObjectClosure::c_function_registered
                  at /home/runner/work/mmtk-ruby/mmtk-ruby/git/mmtk-ruby/mmtk/src/abi.rs:217:9
       10: rb_mmtk_call_object_closure
                  at /home/runner/work/mmtk-ruby/mmtk-ruby/git/ruby/build/../mmtk_support.c:516:12
       11: rb_mmtk_mark_and_move
                  at /home/runner/work/mmtk-ruby/mmtk-ruby/git/ruby/build/../mmtk_support.c:590:36
       12: rb_gc_impl_mark_and_move
                  at /home/runner/work/mmtk-ruby/mmtk-ruby/git/ruby/build/../gc/default.c:5226:9
       13: rb_gc_mark_and_move
                  at /home/runner/work/mmtk-ruby/mmtk-ruby/git/ruby/build/../gc.c:2087:5
       14: rb_iseq_mark_and_move
                  at /home/runner/work/mmtk-ruby/mmtk-ruby/git/ruby/build/../iseq.c:351:9
       15: rb_imemo_mark_and_move
                  at /home/runner/work/mmtk-ruby/mmtk-ruby/git/ruby/build/../imemo.c:455:9
       16: rb_gc_update_object_references
                  at /home/runner/work/mmtk-ruby/mmtk-ruby/git/ruby/build/../gc.c:3413:9
       17: rb_mmtk_update_object_references
                  at /home/runner/work/mmtk-ruby/mmtk-ruby/git/ruby/build/../gc/default.c:10721:5
       18: rb_mmtk_scan_object_ruby_style
                  at /home/runner/work/mmtk-ruby/mmtk-ruby/git/ruby/build/../mmtk_support.c:551:5
       19: <mmtk_ruby::scanning::VMScanning as mmtk::vm::scanning::Scanning<mmtk_ruby::Ruby>>::scan_object_and_trace_edges::{{closure}}
                  at /home/runner/work/mmtk-ruby/mmtk-ruby/git/mmtk-ruby/mmtk/src/scanning.rs:59:17
       20: mmtk_ruby::abi::ObjectClosure::set_temporarily_and_run_code
                  at /home/runner/work/mmtk-ruby/mmtk-ruby/git/mmtk-ruby/mmtk/src/abi.rs:201:22
       21: <mmtk_ruby::scanning::VMScanning as mmtk::vm::scanning::Scanning<mmtk_ruby::Ruby>>::scan_object_and_trace_edges
                  at /home/runner/work/mmtk-ruby/mmtk-ruby/git/mmtk-ruby/mmtk/src/scanning.rs:56:9
       22: mmtk::scheduler::gc_work::ScanObjectsWork::do_work_common::{{closure}}
                  at /home/runner/.cargo/git/checkouts/mmtk-core-3306bdeb8eb4322b/73be50d/src/scheduler/gc_work.rs:873:21

And the failing test is a btest case:

  #344 test_insns.rb:465: 
         r = false
         t = [true, nil]
         q, w, e = r, *t             # here
         w
    #=> "" (expected "true")  concatarray
  FAIL 1/0 tests failed
  make: *** [uncommon.mk:899: yes-btest] Error 1

The line iseq.c:351:9 scans the field body->location.label. Due to the nature of the release build, it may not indicate the exact line, but should be approximate.

We have enabled an aggressive assertion when running CI, i.e. -DMMTK_WB_ASSERT_VO, in #105, even when testing the release build. But the same error is not observed again after re-running the tests on CI for 5 times.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions