Skip to content

calling isolate.get_heap_statistics from an interrupt segfaults on 140.0 or above #1883

@svix-jbrown

Description

@svix-jbrown

I'm upgrading an application that uses v8 from v8 137.3.0 to 140.0. We use request_interrupt to periodically sample the memory usage of the Isolate. In 137.x, this works; in 140.x, it segfaults.

Minified sample program, which segfaults in 142.0, but passes in 139.0:
use std::ffi::c_void;

const CODE: &str = r#"
    function busy() {
        for (var i = 0; i < 5000000000 ; ++i) {
            ;;
        }
    }
    busy()
"#;

extern "C" fn v8_interrupt_fn(isolate: &mut v8::Isolate, _data: *mut c_void) {
    let heap_stats = isolate.get_heap_statistics();

    let heap_size = heap_stats.used_heap_size();
    println!("{:?}", heap_size);
}

fn main() {
    let platform = v8::new_default_platform(0, false).make_shared();
    v8::V8::initialize_platform(platform);
    v8::V8::initialize();

    let isolate = &mut v8::Isolate::new(Default::default());
    let handle = isolate.thread_safe_handle();
    handle.request_interrupt(v8_interrupt_fn, std::ptr::null_mut());

    /* this version for <140.0 */
    //let scope = &mut v8::HandleScope::new(isolate);
    /* this version for >= 140.0 */
    let scope = std::pin::pin!(v8::HandleScope::new(isolate));
    let scope = &mut scope.init();
    let context = v8::Context::new(scope, Default::default());
    let scope = &mut v8::ContextScope::new(scope, context);

    let code = v8::String::new(scope, CODE).unwrap();
    println!("javascript code: {}", code.to_rust_string_lossy(scope));

    let script = v8::Script::compile(scope, code, None).unwrap();
    let result = script.run(scope).unwrap();
    let result = result.to_string(scope).unwrap();
    println!("result: {}", result.to_rust_string_lossy(scope));
}
traceback
  * frame #0: 0x0000000100251730 repro-v8-issue`::FreeMainThreadLinearAllocationAreas() at heap.cc:3710:3 [opt]
    frame #1: 0x000000010008c0c0 repro-v8-issue`::GetHeapStatistics() at api.cc:10372:9 [opt]
    frame #2: 0x0000000100005d80 repro-v8-issue`v8::isolate::Isolate::get_heap_statistics::h019b1ff3cf1a1fdb(self=0x0000000140008000) at isolate.rs:1222:7
    frame #3: 0x0000000100005d48 repro-v8-issue`repro_v8_issue::v8_interrupt_fn::h80a46865facae6f2(isolate=0x0000000140008000, _data=0x0000000000000000) at main.rs:13:30
    frame #4: 0x00000001001b2d00 repro-v8-issue`::InvokeApiInterruptCallbacks() at isolate.cc:2036:5 [opt]
    frame #5: 0x00000001001cff48 repro-v8-issue`::HandleInterrupts() at stack-guard.cc:385:15 [opt]
    frame #6: 0x0000000100651afc repro-v8-issue`::Runtime_StackGuard() at runtime-internal.cc:331:1 [opt]
    frame #7: 0x00000001015d07b4 repro-v8-issue`Builtins_CEntry_Return1_ArgvOnStack_NoBuiltinExit + 84
    frame #8: 0x0000000101531670 repro-v8-issue`Builtins_InterpreterEntryTrampoline + 432
    frame #9: 0x000000010152e90c repro-v8-issue`Builtins_JSEntryTrampoline + 172
    frame #10: 0x000000010152e5b0 repro-v8-issue`Builtins_JSEntry + 176
    frame #11: 0x00000001001a0df4 repro-v8-issue`::Invoke() at execution.cc:442:22 [opt]
    frame #12: 0x00000001001a13e4 repro-v8-issue`::CallScript() at execution.cc:542:10 [opt]
    frame #13: 0x0000000100085010 repro-v8-issue`::Run() at api.cc:1953:7 [opt]
    frame #14: 0x0000000100005594 repro-v8-issue`v8::script::_$LT$impl$u20$v8..data..Script$GT$::run::_$u7b$$u7b$closure$u7d$$u7d$::h0029f083922e612d((null)={closure_env#0} @ 0x000000016fdfdc68, sd=0x000000016fdfdd10) at script.rs:96:29
    frame #15: 0x00000001000040c4 repro-v8-issue`v8::scope::PinnedRef$LT$v8..scope..HandleScope$LT$$LP$$RP$$GT$$GT$::cast_local::h2a09eaa9b3f9c688(self=0x000000016fdfe1e0, _f={closure_env#0} @ 0x000000016fdfdd30) at scope.rs:690:15
    frame #16: 0x000000010000403c repro-v8-issue`v8::script::_$LT$impl$u20$v8..data..Script$GT$::run::haca42d5da85fab6b(self=0x000000013d02be48, scope=0x000000016fdfe1e0) at script.rs:96:13
    frame #17: 0x0000000100006b84 repro-v8-issue`repro_v8_issue::main::h5166e804cf311a29 at main.rs:40:25
    frame #18: 0x000000010000429c repro-v8-issue`core::ops::function::FnOnce::call_once::he7e708fd4f3795fd((null)=(repro-v8-issue`repro_v8_issue::main::h5166e804cf311a29 at main.rs:19), (null)=<unavailable>) at function.rs:253:5
    frame #19: 0x00000001000049d0 repro-v8-issue`std::sys::backtrace::__rust_begin_short_backtrace::h19ac56e1b67a0b10(f=(repro-v8-issue`repro_v8_issue::main::h5166e804cf311a29 at main.rs:19)) at backtrace.rs:158:18
    frame #20: 0x00000001000049a0 repro-v8-issue`std::rt::lang_start::_$u7b$$u7b$closure$u7d$$u7d$::he8b228c5e17083f5 at rt.rs:206:18
    frame #21: 0x000000010182ddbc repro-v8-issue`core::ops::function::impls::_$LT$impl$u20$core..ops..function..FnOnce$LT$A$GT$$u20$for$u20$$RF$F$GT$::call_once::hbb2eb0e6976088d9 at function.rs:290:21 [opt] [inlined]
    frame #22: 0x000000010182ddb4 repro-v8-issue`std::panicking::catch_unwind::do_call::h93858ce5ba09f3d9 at panicking.rs:589:40 [opt] [inlined]
    frame #23: 0x000000010182ddb0 repro-v8-issue`std::panicking::catch_unwind::h129a241a010f1b76 at panicking.rs:552:19 [opt] [inlined]
    frame #24: 0x000000010182ddb0 repro-v8-issue`std::panic::catch_unwind::h5ca6b885cfe10586 at panic.rs:359:14 [opt] [inlined]
    frame #25: 0x000000010182ddb0 repro-v8-issue`std::rt::lang_start_internal::_$u7b$$u7b$closure$u7d$$u7d$::hed6353a412388a00 at rt.rs:175:24 [opt] [inlined]
    frame #26: 0x000000010182da34 repro-v8-issue`std::panicking::catch_unwind::do_call::h6579b7caa3691f01 at panicking.rs:589:40 [opt] [inlined]
    frame #27: 0x000000010182da34 repro-v8-issue`std::panicking::catch_unwind::h4557f88752b89087 at panicking.rs:552:19 [opt] [inlined]
    frame #28: 0x000000010182da34 repro-v8-issue`std::panic::catch_unwind::h82809ba82b8374af at panic.rs:359:14 [opt] [inlined]
    frame #29: 0x000000010182da34 repro-v8-issue`std::rt::lang_start_internal::hdb28e94b6865fa11 at rt.rs:171:5 [opt]
    frame #30: 0x0000000100004978 repro-v8-issue`std::rt::lang_start::hddc927408c68c248(main=(repro-v8-issue`repro_v8_issue::main::h5166e804cf311a29 at main.rs:19), argc=1, argv=0x000000016fdff0d0, sigpipe='\0') at rt.rs:205:5
    frame #31: 0x0000000100006f2c repro-v8-issue`main + 36
    frame #32: 0x00000001954aeb98 dyld`start + 6076

I'm not sure if this is a rusty_v8 issue or a v8 issue or a "you're holding it wrong" issue, but figured I'd start here.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions