(Sorry that this post may be Blink-specific)
I'm having trouble using TerminateExecution to kill a Service Worker that's
in a loop like this:
while (true) { console.log('hi'); }
Loop bodies like {} and [ self.location; } work as expected. It seems
specific to console.log, and it's racy: most of the time it fails, but
occasionally it works. I think the termination exception may be eaten in
the following stack:
#3 0x00007fc7ee66f0b7 in v8::internal::Execution::TryCall (func=...,
receiver=..., argc=0, args=0x0, exception_out=<optimized out>) at
../../v8/src/execution.cc:207
#4 0x00007fc7ee8bcdce in v8::internal::Script::GetNameOrSourceURL
(script=...) at ../../v8/src/objects.cc:10142
#5 0x00007fc7ee802885 in
v8::internal::CaptureStackTraceHelper::NewStackFrameObject
(this=0x7fc7cfc2ad70, fun=..., code=..., pc=<optimized out>,
is_constructor=false) at ../../v8/src/isolate.cc:551
#6 0x00007fc7ee801bb1 in v8::internal::Isolate::CaptureCurrentStackTrace
(this=0x3c84dc05c020, frame_limit=<optimized out>, options=<optimized out>)
at ../../v8/src/isolate.cc:654
TryCall has a |is_termination| variable, which looks like it causes a
"rethrow" of TerminateExecution, but it's never set to true because
|exception_out| is NULL. However, just changing the function to rethrow did
not appear to solve the issue.
I wonder if GetNameOrSourceURL or someone else needs to detect the
exception. When termination works, I can capture a stack trace (below),
which looks like exception is "caught" within
V8ScriptRunner:runCompiledScript, and ultimately we can leave V8. But when
it doesn't work, it looks like it's "caught" in a mystery stack that starts
with blink::ConsoleBaseV8Internal::logMethodCallback, and we ultimately
loop forever calling that method.
More context is at: https://codereview.chromium.org/912753002/
(Stack trace from a trial that works)
#0 v8::internal::Isolate::PropagatePendingExceptionToExternalTryCatch
(this=0x3c84dbf4f020) at ../../v8/src/isolate.cc:1955
#1 0x00007fc7ee807a59 in
v8::internal::Isolate::OptionalRescheduleException (this=0x3c84dbf4f020,
is_bottom_call=true) at ../../v8/src/isolate.cc:1447
#2 0x00007fc7ee45351e in v8::Script::Run (this=<optimized out>) at
../../v8/src/api.cc:1515
#3 0x00007fc7e34165cb in blink::V8ScriptRunner::runCompiledScript
(isolate=0x3c84dbf4f020, script=..., context=0x1e1b9e050fa8) at
../../third_party/WebKit/Source/bindings/core/v8/V8ScriptRunner.cpp:400
#4 0x00007fc7e342aaf1 in blink::WorkerScriptController::evaluate
(this=0x3c84dbff6230, script="// oninstall = function() {\n while (true)
{\n console.log('i am still alive');\n }\n// }\n",
fileName="http://localhost:8009/resources/fetch-forever-worker.js",
scriptStartPosition=...) at
../../third_party/WebKit/Source/bindings/core/v8/WorkerScriptController.cpp:217
(Stack trace from a trial that fails)
#0 v8::internal::Isolate::PropagatePendingExceptionToExternalTryCatch
(this=0x3c84dc05c020) at ../../v8/src/isolate.cc:1955
#1 0x00007fc7ee807a59 in
v8::internal::Isolate::OptionalRescheduleException (this=0x3c84dc05c020,
is_bottom_call=true) at ../../v8/src/isolate.cc:1447
#2 0x00007fc7ee66f184 in v8::internal::Execution::TryCall (func=...,
receiver=..., argc=<optimized out>, args=<optimized out>,
exception_out=<optimized out>) at ../../v8/src/execution.cc:221
#3 0x00007fc7ee8bcdce in v8::internal::Script::GetNameOrSourceURL
(script=...) at ../../v8/src/objects.cc:10142
#4 0x00007fc7ee802885 in
v8::internal::CaptureStackTraceHelper::NewStackFrameObject
(this=0x7fc7cfc2ad70, fun=..., code=..., pc=<optimized out>,
is_constructor=false) at ../../v8/src/isolate.cc:551
#5 0x00007fc7ee801bb1 in v8::internal::Isolate::CaptureCurrentStackTrace
(this=0x3c84dc05c020, frame_limit=<optimized out>, options=<optimized out>)
at ../../v8/src/isolate.cc:654
#6 0x00007fc7ee461052 in v8::StackTrace::CurrentStackTrace
(isolate=0x3c84dc05c020, frame_limit=-290331648, options=<optimized out>)
at ../../v8/src/api.cc:2154
#7 0x00007fc7e339541d in blink::createScriptCallStack (maxStackSize=1,
emptyStackIsAllowed=true) at
../../third_party/WebKit/Source/bindings/core/v8/ScriptCallStackFactory.cpp:111
#8 0x00007fc7e3395514 in blink::createScriptCallStackForConsole
(maxStackSize=200, emptyStackIsAllowed=true) at
../../third_party/WebKit/Source/bindings/core/v8/ScriptCallStackFactory.cpp:125
#9 0x00007fc7e476f045 in blink::ConsoleMessage::collectCallStack
(this=0x1e1b9e245c30) at
../../third_party/WebKit/Source/core/inspector/ConsoleMessage.cpp:185
#10 0x00007fc7e476f69f in blink::ConsoleMessageStorage::reportMessage
(this=0x1e1b9e0cbf50, context=0x1e1b9e050fa8, prpMessage=...) at
../../third_party/WebKit/Source/core/inspector/ConsoleMessageStorage.cpp:25
#11 0x00007fc7e49ccc8a in
blink::WorkerGlobalScope::addMessageToWorkerConsole (this=0x1e1b9e050f10,
consoleMessage=...) at
../../third_party/WebKit/Source/core/workers/WorkerGlobalScope.cpp:309
#12 0x00007fc7e49ccb71 in blink::WorkerGlobalScope::addConsoleMessage
(this=0x1e1b9e050f10, prpConsoleMessage=...) at
../../third_party/WebKit/Source/core/workers/WorkerGlobalScope.cpp:303
#13 0x00007fc7e49c82af in blink::WorkerConsole::reportMessageToConsole
(this=0x1e1b9e0dd390, consoleMessage=...) at
../../third_party/WebKit/Source/core/workers/WorkerConsole.cpp:59
#14 0x00007fc7e46d4986 in blink::ConsoleBase::internalAddMessage
(this=0x1e1b9e0dd390, type=blink::LogMessageType,
level=blink::LogMessageLevel, scriptState=0x1e1b9e0cce98,
scriptArguments=...,
acceptNoArguments=false, printTrace=false) at
../../third_party/WebKit/Source/core/frame/ConsoleBase.cpp:228
#15 0x00007fc7e46d4b19 in blink::ConsoleBase::log (this=0x1e1b9e0dd390,
scriptState=0x1e1b9e0cce98, arguments=...) at
../../third_party/WebKit/Source/core/frame/ConsoleBase.cpp:64
#16 0x00007fc7e359f4d2 in blink::ConsoleBaseV8Internal::logMethod
(info=...) at gen/blink/bindings/core/v8/V8ConsoleBase.cpp:86
#17 0x00007fc7e359ad64 in blink::ConsoleBaseV8Internal::logMethodCallback
(info=...) at gen/blink/bindings/core/v8/V8ConsoleBase.cpp:92
#18 0x00000f1dd5059484 in ?? ()
#19 0x00007fc7cfc2b4c0 in ?? ()
#20 0x00007fc7cfc2b4f8 in ?? ()
#21 0x0000000000000001 in ?? ()
#22 0x0000000000000000 in ?? ()
--
--
v8-users mailing list
[email protected]
http://groups.google.com/group/v8-users
---
You received this message because you are subscribed to the Google Groups
"v8-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.