Closed
Bug 1491336
Opened 6 years ago
Closed 6 years ago
Crash [@ js::Scope::environmentChainLength] or Assertion failure: lazyScript->enclosingScriptHasEverBeenCompiled(), at vm/Debugger.cpp:5563
Categories
(Core :: JavaScript Engine, defect)
Tracking
()
RESOLVED
FIXED
mozilla64
Tracking | Status | |
---|---|---|
firefox-esr60 | --- | unaffected |
firefox62 | --- | unaffected |
firefox63 | --- | fixed |
firefox64 | --- | fixed |
People
(Reporter: decoder, Assigned: arai)
References
Details
(5 keywords, Whiteboard: [jsbugmon:update])
Crash Data
Attachments
(2 files)
(deleted),
patch
|
jorendorff
:
review+
|
Details | Diff | Splinter Review |
(deleted),
patch
|
arai
:
review+
pascalc
:
approval-mozilla-beta+
|
Details | Diff | Splinter Review |
The following testcase crashes on mozilla-central revision 2a4cf603095a (build with --enable-posix-nspr-emulation --enable-valgrind --enable-gczeal --disable-tests --disable-profiling --disable-debug --without-intl-api --enable-optimize --target=i686-pc-linux-gnu, run with --fuzzing-safe min.js):
var g = newGlobal();
var dbg = new Debugger(g);
g.eval("" + function f() {
() => {};
});
for (s of dbg.findScripts()) s.lineCount;
Backtrace:
received signal SIGSEGV, Segmentation fault.
0x08646d2b in js::Scope::environmentChainLength (this=0x0) at js/src/vm/Scope.cpp:344
#0 0x08646d2b in js::Scope::environmentChainLength (this=0x0) at js/src/vm/Scope.cpp:344
#1 0x087e35cf in js::frontend::EmitterScope::checkEnvironmentChainLength (this=0xffffc22c, bce=0xffffc458) at js/src/frontend/EmitterScope.cpp:67
#2 0x087eab6d in js::frontend::EmitterScope::enterFunction (this=<optimized out>, bce=<optimized out>, funbox=<optimized out>) at js/src/frontend/EmitterScope.cpp:639
#3 0x087da688 in js::frontend::BytecodeEmitter::emitFunctionFormalParametersAndBody (this=0xffffc458, pn=0xf6ebe0a0) at js/src/frontend/BytecodeEmitter.cpp:7427
#4 0x087c77fa in js::frontend::BytecodeEmitter::emitTree (this=0xffffc458, pn=0xf6ebe0a0, valueUsage=js::frontend::ValueUsage::WantValue, emitLineNote=js::frontend::BytecodeEmitter::EMIT_LINENOTE) at js/src/frontend/BytecodeEmitter.cpp:7943
#5 0x087c80f3 in js::frontend::BytecodeEmitter::emitTree (this=<optimized out>, pn=<optimized out>, valueUsage=js::frontend::ValueUsage::WantValue, emitLineNote=<optimized out>, valueUsage=js::frontend::ValueUsage::WantValue) at js/src/frontend/BytecodeEmitter.cpp:8330
#6 0x087c837d in js::frontend::BytecodeEmitter::emitFunctionScript (this=<optimized out>, fn=<optimized out>, isTopLevel=<optimized out>) at js/src/frontend/BytecodeEmitter.cpp:2638
#7 0x087c955b in js::frontend::CompileLazyFunction (cx=<optimized out>, lazy=..., chars=<optimized out>, length=<optimized out>) at js/src/frontend/BytecodeCompiler.cpp:851
#8 0x085d4f68 in JSFunction::createScriptForLazilyInterpretedFunction (cx=0xf6e1a800, fun=...) at js/src/vm/JSFunction.cpp:1640
#9 0x0854694d in JSFunction::getOrCreateScript (cx=0xf6e1a800, fun=...) at js/src/vm/JSFunction.h:536
#10 0x0856bf93 in js::LazyScript::functionDelazifying (script=..., cx=0xf6e1a800) at js/src/vm/JSScript-inl.h:83
#11 DelazifyScript (cx=cx@entry=0xf6e1a800, lazyScript=lazyScript@entry=...) at js/src/vm/Debugger.cpp:5294
#12 0x0856d4bd in DebuggerScriptGetLineCountMatcher::match (lazyScript=..., this=<synthetic pointer>) at js/src/vm/Debugger.cpp:5627
#13 JS::detail::GCVariantImplementation<js::LazyScript*, js::WasmInstanceObject*>::match<DebuggerScriptGetLineCountMatcher, mozilla::Variant<JSScript*, js::LazyScript*, js::WasmInstanceObject*> > (v=..., matcher=<synthetic pointer>) at /srv/jenkins/jobs/mozilla-central-build-jsshell/workspace/arch/32/compiler/gcc/instrumentation/none/type/opt/dist/include/js/GCVariant.h:102
#14 JS::detail::GCVariantImplementation<JSScript*, js::LazyScript*, js::WasmInstanceObject*>::match<DebuggerScriptGetLineCountMatcher, mozilla::Variant<JSScript*, js::LazyScript*, js::WasmInstanceObject*> > (v=..., matcher=<synthetic pointer>) at /srv/jenkins/jobs/mozilla-central-build-jsshell/workspace/arch/32/compiler/gcc/instrumentation/none/type/opt/dist/include/js/GCVariant.h:104
#15 js::MutableWrappedPtrOperations<mozilla::Variant<JSScript*, js::LazyScript*, js::WasmInstanceObject*>, JS::Rooted<mozilla::Variant<JSScript*, js::LazyScript*, js::WasmInstanceObject*> > >::match<DebuggerScriptGetLineCountMatcher> (matcher=<synthetic pointer>, this=0xffffcc30) at /srv/jenkins/jobs/mozilla-central-build-jsshell/workspace/arch/32/compiler/gcc/instrumentation/none/type/opt/dist/include/js/GCVariant.h:182
#16 DebuggerScript_getLineCount (cx=0xf6e1a800, argc=0, vp=0xffffcd48) at js/src/vm/Debugger.cpp:5646
#17 0x081d0777 in CallJSNative (args=..., native=0x856d310 <DebuggerScript_getLineCount(JSContext*, unsigned int, JS::Value*)>, cx=0xf6e1a800) at js/src/vm/Interpreter.cpp:449
[...]
#40 main (argc=<optimized out>, argv=<optimized out>, envp=<optimized out>) at js/src/shell/js.cpp:9973
eax 0x0 0
ebx 0xffffc22c -15828
ecx 0x8b96ff4 146370548
edx 0x0 0
esi 0x1 1
edi 0xffffc458 -15272
ebp 0x0 0
esp 0xffffbf54 4294950740
eip 0x8646d2b <js::Scope::environmentChainLength() const+43>
=> 0x8646d2b <js::Scope::environmentChainLength() const+43>: movzbl 0x4(%edx),%ecx
0x8646d2f <js::Scope::environmentChainLength() const+47>: cmp $0xc,%cl
Updated•6 years ago
|
Whiteboard: [jsbugmon:update,bisect] → [jsbugmon:update]
Comment 1•6 years ago
|
||
JSBugMon: Bisection requested, result:
autoBisect shows this is probably related to the following changeset:
The first bad revision is:
changeset: https://hg.mozilla.org/mozilla-central/rev/351618a4e6a7
user: Tooru Fujisawa
date: Thu Jul 26 12:36:18 2018 +0900
summary: Bug 1434305 - Part 10: Support LazyScript in Debugger::ScriptQuery::findScripts. r=jimb
This iteration took 242.111 seconds to run.
Arai-san, is bug 1434305 a likely regressor?
Blocks: 1434305
Flags: needinfo?(arai.unmht)
Assignee | ||
Comment 3•6 years ago
|
||
yeah, the arrow function is removed by constant folding, and the function isn't get emitted.
we should check if the function is emitted, after delazifying the enclosing script,
and if it's not emitted, we should throw error
Assignee | ||
Comment 4•6 years ago
|
||
Assignee | ||
Comment 5•6 years ago
|
||
Now, accessing the properties which triggers delazification throws if the function for the script is removed by constant folding or DCE or something.
Assignee: nobody → arai.unmht
Status: NEW → ASSIGNED
Flags: needinfo?(arai.unmht)
Attachment #9010134 -
Flags: review?(jimb)
Assignee | ||
Updated•6 years ago
|
Attachment #9010134 -
Flags: review?(jorendorff)
Comment 7•6 years ago
|
||
Comment on attachment 9010134 [details] [diff] [review]
Do not support delazification of functions which is optimized out.
Review of attachment 9010134 [details] [diff] [review]:
-----------------------------------------------------------------
Thank you, arai.
::: js/src/jit-test/tests/debug/Debugger-findScripts-optimized-out.js
@@ +22,5 @@
> + continue;
> + }
> +
> + // Check inner functions only.
> + if (s.displayName.startsWith("inner") || s.displayName.startsWith("enclosing/")) {
displayName no longer includes this information, so the test doesn't actually run for any of the scripts.
So maybe:
try {
s.lineCount; // don't assert
} catch (exc) {
// If that didn't throw, it's fine. If it did, check the message.
assertEq(exc.message, "function is optimized out");
}
::: js/src/vm/Debugger.cpp
@@ +5572,5 @@
> +
> + if (!lazyScript->enclosingScriptHasEverBeenCompiled()) {
> + // If the function corresponds to this script is removed by
> + // constant folding, delazifying the enclosing script doesn't touch
> + // this script while emitting the bytecode.
How about:
// It didn't work! Delazifying the enclosing script still didn't delazify
// this script. This happens when the function corresponding to this script
// was removed by constant folding.
Attachment #9010134 -
Flags: review?(jorendorff)
Attachment #9010134 -
Flags: review?(jimb)
Attachment #9010134 -
Flags: review+
Assignee | ||
Comment 8•6 years ago
|
||
https://hg.mozilla.org/integration/mozilla-inbound/rev/bc381243c490f6e5b54a65734af5504e598e129d
Bug 1491336 - Do not support delazification of functions which is optimized out. r=jorendorff
Comment 9•6 years ago
|
||
bugherder |
Status: ASSIGNED → RESOLVED
Closed: 6 years ago
Resolution: --- → FIXED
Target Milestone: --- → mozilla64
Comment 10•6 years ago
|
||
Is there a user impact which justifies backport consideration here or can this ride the trains?
status-firefox62:
--- → unaffected
status-firefox63:
--- → affected
status-firefox-esr60:
--- → unaffected
Flags: needinfo?(jimb)
Flags: needinfo?(arai.unmht)
Flags: in-testsuite+
Assignee | ||
Comment 11•6 years ago
|
||
[Beta/Release Uplift Approval Request]
Feature/Bug causing the regression: Bug 1434305
User impact if declined: Possible crash with null-dereference while setting breakpoint in debugger
Is this code covered by automated tests?: Yes
Has the fix been verified in Nightly?: Yes
Needs manual test from QE?: No
If yes, steps to reproduce:
List of other uplifts needed: None
Risk to taking this patch: Low
Why is the change risky/not risky? (and alternatives if risky): This adds error handling for a path that was previously assertion
String changes made/needed:
Flags: needinfo?(arai.unmht)
Attachment #9015101 -
Flags: review+
Attachment #9015101 -
Flags: approval-mozilla-beta?
Comment 12•6 years ago
|
||
Comment on attachment 9015101 [details] [diff] [review]
(mozilla-beta) Do not support delazification of functions which is optimized out. r=jorendorff
Crash fix, uplift approved for 63 beta 13, thanks.
Attachment #9015101 -
Flags: approval-mozilla-beta? → approval-mozilla-beta+
Comment 13•6 years ago
|
||
bugherder uplift |
You need to log in
before you can comment on or make changes to this bug.
Description
•