Ah that sounds more like the proper way to do it :)
I've not tried interrupts yet, so I'm no use here :)

On Wednesday, 14 November 2018 17:45:03 UTC, Konrad Piascik wrote:
>
> I have attached to node with the program executing in the middle of a 
> while/busy loop.
> I think I found what node is doing. 
>
> https://github.com/v8/v8/blob/96a039aab14b71069e88c4c04543e6bc9514a0d6/include/v8.h#L7969
>
> void v8::Isolate::RequestInterrupt(InterruptCallback callback, void* data);
> This function stops JavaScript execution and might be the answer to my 
> problem.  The callback is called on the isolate's thread.
>
> Cheers,
> Konrad
>
> On Wednesday, November 14, 2018 at 10:52:53 AM UTC-5, @soylentgraham wrote:
>>
>> Going off topic now, but can you attach & break into node.js whilst it's 
>> in a big blocking function? 
>> Or can you only break if you've previously attached? (I've only done 
>> light, very-async stuff in node)
>>
>> In long-running funcs (well, accidental massive loops) in chrome I find I 
>> struggle to break, so I kinda thought this was how it was, but maybe I'm 
>> wrong :)
>>
>>
>> On Wednesday, 14 November 2018 13:55:34 UTC, Konrad Piascik wrote:
>>>
>>> Yeah I can't make any assumptions or impose any requirements about what 
>>> the javascript to be executed will look like.
>>> It must be possible since Node.js already does this for long running 
>>> JavaScript.
>>>
>>> Thanks for the suggestions and quick responses
>>>
>>> -Konrad
>>>
>>> On Wednesday, November 14, 2018 at 7:53:57 AM UTC-5, @soylentgraham 
>>> wrote:
>>>>
>>>> The only way I could interrupt long runs of javascript, assuming you 
>>>> can't break it yourself into asynchronous code (via promises/await, this 
>>>> is 
>>>> the nicest approach IMO me), is adding a yield function to let the event 
>>>> loop run (I have other multithread-y reasons for this too, but letting 
>>>> external actions run is one)
>>>>
>>>> But if you can't add code at all, you are probably stuck (afaik, 
>>>> there's no real interrupting, because you're basically calling one big 
>>>> RunJavascript() func on your thread :)
>>>>
>>>> In case it's useful, this is the C++ side, (and I call yield() in JS to 
>>>> let other threads do JS calls, and let the debugger interrupt)
>>>>
>>>>
>>>> void TV8Container::Yield(size_t SleepMilliseconds)
>>>>
>>>> {
>>>>
>>>> // gr: temporary unlock, but need to exit&enter too
>>>>
>>>> {
>>>>
>>>> mIsolate->Exit();
>>>>
>>>> v8::Unlocker unlocker(mIsolate);
>>>>
>>>> // isolate unlock for a moment, let another thread jump in and run 
>>>> stuff
>>>>
>>>> auto ms = std::chrono::milliseconds(SleepMilliseconds);
>>>>
>>>> std::this_thread::sleep_for( ms );
>>>>
>>>> }
>>>>
>>>> // re-enter after unlocker has gone out of scope
>>>>
>>>> mIsolate->Enter();
>>>>
>>>> }
>>>>
>>>>
>>>> On Tuesday, 13 November 2018 21:06:59 UTC, Konrad Piascik wrote:
>>>>>
>>>>> Hi @soylentgraham,
>>>>>
>>>>> I'm trying to replicate what you're doing as well but am running into 
>>>>> some other problems.  The most notable of which is that my websocket is 
>>>>> on 
>>>>> a different thread than my isolate creation.
>>>>> I see from your solution that you're adding the frontend messages to a 
>>>>> queue and looking through them in your event loop.  My problem is that I 
>>>>> have long running javascript that is not intended to exit/return until 
>>>>> the 
>>>>> program stops.  Do you have any suggestions/ideas?
>>>>>
>>>>> Thanks,
>>>>> Konrad
>>>>>   
>>>>>
>>>>> On Tuesday, September 18, 2018 at 10:49:43 AM UTC-4, @soylentgraham 
>>>>> wrote:
>>>>>>
>>>>>> YetAnotherUpdate
>>>>>>
>>>>>> After some more digging, I found the issue I have is identified node 
>>>>>> and chromium too... 
>>>>>>
>>>>>> https://github.com/nodejs/node/commit/b1e26128f317a6f5a5808a0a727e98f80f088b84
>>>>>>
>>>>>> So, it looks like the default v8 [platform] isn't chrome-dev-tools 
>>>>>> compatible.
>>>>>> Ibon's case worked as it has a specific Android platform 
>>>>>> implementation. Chromium and Node also have their own platform.
>>>>>>
>>>>>> So, I made the most basic platform proxy possible to work around it...
>>>>>>
>>>>>> https://github.com/SoylentGraham/V8InspectorMinimal/blob/master/src/TV8Platform.h
>>>>>>
>>>>>> And it works!
>>>>>> I can now modify code on the fly, execute from the console.
>>>>>> I can't seem to debug, and pressing pause-execution a few times gives 
>>>>>> me a new assert, but the higher level code is a bit of a mess at this 
>>>>>> point, so I'm probably implementing something wrong...
>>>>>>
>>>>>> Still, if anyone else ever finds this problem... V8 alone cannot be 
>>>>>> used with chrome dev tools. (as of 7.1.0.0  
>>>>>>
>>>>>> 4544e18b0c3845a9fca422cf0903df4803343cf1)
>>>>>>
>>>>>> On Friday, 14 September 2018 11:44:33 UTC+1, @soylentgraham wrote:
>>>>>>>
>>>>>>> So the core of my issue at the moment, is this assert (UNIMPLEMENTED)
>>>>>>>
>>>>>>> void 
>>>>>>> DefaultWorkerThreadsTaskRunner::PostDelayedTask(std::unique_ptr<Task> 
>>>>>>> task,
>>>>>>>
>>>>>>>                                                      double 
>>>>>>> delay_in_seconds) {
>>>>>>>
>>>>>>>   base::LockGuard<base::Mutex> guard(&lock_);
>>>>>>>
>>>>>>>   if (terminated_) return;
>>>>>>>
>>>>>>>   if (delay_in_seconds == 0) {
>>>>>>>
>>>>>>>     queue_.Append(std::move(task));
>>>>>>>
>>>>>>>     return;
>>>>>>>
>>>>>>>   }
>>>>>>>
>>>>>>>   // There is no use case for this function with non zero 
>>>>>>> delay_in_second on a
>>>>>>>
>>>>>>>   // worker thread at the moment, but it is still part of the 
>>>>>>> interface.
>>>>>>>
>>>>>>>   UNIMPLEMENTED();
>>>>>>>
>>>>>>> }
>>>>>>>
>>>>>>> from 
>>>>>>>
>>>>>>> DefaultPlatform::CallDelayedOnWorkerThread(
>>>>>>>
>>>>>>> being called by
>>>>>>>
>>>>>>> protocol::Response V8InspectorImpl::EvaluateScope::setTimeout(double 
>>>>>>> timeout) {
>>>>>>>
>>>>>>>   if (m_isolate->IsExecutionTerminating()) {
>>>>>>>
>>>>>>>     return protocol::Response::Error("Execution was terminated");
>>>>>>>
>>>>>>>   }
>>>>>>>
>>>>>>>   m_cancelToken.reset(new CancelToken());
>>>>>>>
>>>>>>>   v8::debug::GetCurrentPlatform()->CallDelayedOnWorkerThread(
>>>>>>>
>>>>>>>       v8::base::make_unique<TerminateTask>(m_isolate, 
>>>>>>> m_cancelToken), timeout);
>>>>>>>
>>>>>>>   return protocol::Response::OK();
>>>>>>>
>>>>>>> }
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> so, SetTimeout in the inspector, explicitly uses something 
>>>>>>> we[developers] know isn't implemented...
>>>>>>> From reading things before, Node.js was using the default platform, 
>>>>>>> I think now it has it's own platform. Maybe chromium does too...
>>>>>>> Perhaps the demo/unittest debugger/d8/inspector doesn't call 
>>>>>>> settimeout, so this hasn't been found with default setups...
>>>>>>>
>>>>>>> Maybe I HAVE to implement my own platform to support chrome dev 
>>>>>>> tools and handle delayed jobs...
>>>>>>>
>>>>>>>
>>>>>>> On Thursday, 13 September 2018 17:14:58 UTC+1, @soylentgraham wrote:
>>>>>>>>
>>>>>>>> For any future readers;
>>>>>>>> I went back to trying to build a debug v8 set of libs (wouldnt 
>>>>>>>> compile before, added is_component_build=false which I think fixed 
>>>>>>>> that)
>>>>>>>> Built with latest master (
>>>>>>>> 4544e18b0c3845a9fca422cf0903df4803343cf1) 
>>>>>>>>
>>>>>>>> Which forced me to correct a few uses of deprecated functions, 
>>>>>>>> including v8::String::NewFromUtf8() with no isolate, so *possibly* 
>>>>>>>> that was the source of the crash re: scriptorigin. I now get an origin 
>>>>>>>> in 
>>>>>>>> CDT (kinda, it still breaks in a VMXX file)
>>>>>>>>
>>>>>>>> Then asserts as before in "code that should never be reached" (see 
>>>>>>>> earlier in the thread)
>>>>>>>>
>>>>>>>> [image: Screen Shot 2018-09-13 at 17.08.09.png]
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> On Wednesday, 12 September 2018 17:34:30 UTC+1, @soylentgraham 
>>>>>>>> wrote:
>>>>>>>>>
>>>>>>>>> With a lot of back & forth help from Ibon/hyperandroid, we've got 
>>>>>>>>> a bit further in working out which things are good, and which are 
>>>>>>>>> bad. 
>>>>>>>>> Feels like we're close, but things are still unstable, and a bit 
>>>>>>>>> unresponsive.
>>>>>>>>>
>>>>>>>>> I can kinda break into the code (which only shows *this *in 
>>>>>>>>> sources)
>>>>>>>>> Still get the assert above from trying to autocomplete too many 
>>>>>>>>> times. (albeit after a RunMessageLoop callback now)
>>>>>>>>> And if I add a script origin, I get a crash trying to stacktrace 
>>>>>>>>> (immediately when connecting, still trying to figure this out, as my 
>>>>>>>>> scriptorigin is okay)
>>>>>>>>>
>>>>>>>>> More stripped back version here (cutting more dependencies out, 
>>>>>>>>> but all my setup, inspector, frontend, messaging is in v8minimal.cpp)
>>>>>>>>> https://github.com/SoylentGraham/V8InspectorMinimal
>>>>>>>>>
>>>>>>>>> On Monday, 27 August 2018 13:49:37 UTC+1, @soylentgraham wrote:
>>>>>>>>>>
>>>>>>>>>> Through various sources (ie, googling & github) I've finally got 
>>>>>>>>>> a bit of a grasp of the flow for connecting chrome dev tools to my 
>>>>>>>>>> v8 app. 
>>>>>>>>>> (which is using a pretty recent HEAD build I've built myself with 
>>>>>>>>>> all 
>>>>>>>>>> default settings other than compiling as a static lib[s]. 
>>>>>>>>>> v8-version.h says 
>>>>>>>>>> 7.0.0.0)
>>>>>>>>>>
>>>>>>>>>> I connect via an explicit url (can't quite get json/list/ to show 
>>>>>>>>>> up in chrome yet)
>>>>>>>>>> *chrome-devtools://devtools/bundled/inspector.html?experiments=true&v8only=true&ws=127.0.0.1:8008
>>>>>>>>>>  
>>>>>>>>>> <http://127.0.0.1:8008>*
>>>>>>>>>> (Not sure how relevant the v8only=true and experiments=true are, 
>>>>>>>>>> couldn't find any documentation on this)
>>>>>>>>>>
>>>>>>>>>> This connects to my websocket, and I pass all messages straight 
>>>>>>>>>> to *Session->dispatchProtocolMessage*
>>>>>>>>>>
>>>>>>>>>> My channel then gets *sendResponse's* in return, which I send 
>>>>>>>>>> back to chrome over my websocket.
>>>>>>>>>>
>>>>>>>>>> Chrome dev tools shows essentially an empty debugger, no sources, 
>>>>>>>>>> no console output, no errors...
>>>>>>>>>>
>>>>>>>>>> The responses my isolate/context sends back, suggest maybe I have 
>>>>>>>>>> some JS symbols/modules missing, which maybe I need to implement?
>>>>>>>>>> I'm kinda assuming this, as the debugger. methods succeed, but 
>>>>>>>>>> things like *Inspector.enable* (which I haven't found anyone 
>>>>>>>>>> implementing, but some people are implementing Inspector objects, 
>>>>>>>>>> just with 
>>>>>>>>>> different methods) fail
>>>>>>>>>>
>>>>>>>>>> *Chrome tools message: {"id":16,"method":"Inspector.enable"}*
>>>>>>>>>>
>>>>>>>>>> *Channel response: 
>>>>>>>>>> {"error":{"code":-32601,"message":"'Inspector.enable' wasn't 
>>>>>>>>>> found"},"id":16}*
>>>>>>>>>> Is this why chrome isn't proceeding with anything?
>>>>>>>>>> Am I supposed to implement these, or perhaps are they missing 
>>>>>>>>>> from my native blobs when I built my v8 libraries?
>>>>>>>>>>
>>>>>>>>>> My overloads of the inspector client functions like 
>>>>>>>>>> *runMessageLoopOnPause* aren't being called, but I assume that's 
>>>>>>>>>> just because I haven't gotten to any stage where commands are being 
>>>>>>>>>> evaluated?
>>>>>>>>>>
>>>>>>>>>> Below is what I get when I connect chrome, but then it just sits 
>>>>>>>>>> there :)
>>>>>>>>>>
>>>>>>>>>> Thanks for any pointers in the right direction!
>>>>>>>>>>
>>>>>>>>>> *Chrome tools message: 
>>>>>>>>>> {"id":1,"method":"Network.enable","params":{"maxPostDataSize":65536}}*
>>>>>>>>>>
>>>>>>>>>> *Channel response: 
>>>>>>>>>> {"error":{"code":-32601,"message":"'Network.enable' wasn't 
>>>>>>>>>> found"},"id":1}*
>>>>>>>>>>
>>>>>>>>>> *Chrome tools message: {"id":2,"method":"Page.enable"}*
>>>>>>>>>>
>>>>>>>>>> *Channel response: 
>>>>>>>>>> {"error":{"code":-32601,"message":"'Page.enable' wasn't 
>>>>>>>>>> found"},"id":2}*
>>>>>>>>>>
>>>>>>>>>> *Chrome tools message: {"id":3,"method":"Page.getResourceTree"}*
>>>>>>>>>>
>>>>>>>>>> *Chrome tools message: {"id":4,"method":"Profiler.enable"}*
>>>>>>>>>>
>>>>>>>>>> *Channel response: 
>>>>>>>>>> {"error":{"code":-32601,"message":"'Page.getResourceTree' wasn't 
>>>>>>>>>> found"},"id":3}*
>>>>>>>>>>
>>>>>>>>>> *Channel response: {"id":4,"result":{}}*
>>>>>>>>>>
>>>>>>>>>> *Chrome tools message: {"id":5,"method":"Runtime.enable"}*
>>>>>>>>>>
>>>>>>>>>> *Channel response: 
>>>>>>>>>> {"method":"Runtime.executionContextCreated","params":{"context":{"id":1,"origin":"","name":"PopEngineContextName"}}}*
>>>>>>>>>>
>>>>>>>>>> *Channel response: {"id":5,"result":{}}*
>>>>>>>>>>
>>>>>>>>>> *Chrome tools message: {"id":6,"method":"Debugger.enable"}*
>>>>>>>>>>
>>>>>>>>>> *Channel response: 
>>>>>>>>>> {"method":"Debugger.scriptParsed","params":{"scriptId":"9","url":"","startLine":0,"startColumn":0,"endLine":1,"endColumn":0,"executionContextId":1,"hash":"2a70962568dbbde00fb323decd63c2ca137b304c","isLiveEdit":false,"sourceMapURL":"","hasSourceURL":false,"isModule":false,"length":17}}*
>>>>>>>>>>
>>>>>>>>>> *Channel response: 
>>>>>>>>>> {"id":6,"result":{"debuggerId":"(6B1A58050CBFAE70E5B41C5556E5520D)"}}*
>>>>>>>>>>
>>>>>>>>>> *Chrome tools message: 
>>>>>>>>>> {"id":7,"method":"Debugger.setPauseOnExceptions","params":{"state":"uncaught"}}*
>>>>>>>>>>
>>>>>>>>>> *Channel response: {"id":7,"result":{}}*
>>>>>>>>>>
>>>>>>>>>> *Chrome tools message: 
>>>>>>>>>> {"id":8,"method":"Debugger.setAsyncCallStackDepth","params":{"maxDepth":32}}*
>>>>>>>>>>
>>>>>>>>>> *Channel response: {"id":8,"result":{}}*
>>>>>>>>>>
>>>>>>>>>> *Chrome tools message: {"id":9,"method":"DOM.enable"}*
>>>>>>>>>>
>>>>>>>>>> *Channel response: 
>>>>>>>>>> {"error":{"code":-32601,"message":"'DOM.enable' wasn't 
>>>>>>>>>> found"},"id":9}*
>>>>>>>>>>
>>>>>>>>>> *Chrome tools message: {"id":10,"method":"CSS.enable"}*
>>>>>>>>>>
>>>>>>>>>> *Channel response: 
>>>>>>>>>> {"error":{"code":-32601,"message":"'CSS.enable' wasn't 
>>>>>>>>>> found"},"id":10}*
>>>>>>>>>>
>>>>>>>>>> *Chrome tools message: {"id":11,"method":"Overlay.enable"}*
>>>>>>>>>>
>>>>>>>>>> *Channel response: 
>>>>>>>>>> {"error":{"code":-32601,"message":"'Overlay.enable' wasn't 
>>>>>>>>>> found"},"id":11}*
>>>>>>>>>>
>>>>>>>>>> *Chrome tools message: 
>>>>>>>>>> {"id":12,"method":"Overlay.setShowViewportSizeOnResize","params":{"show":true}}*
>>>>>>>>>>
>>>>>>>>>> *Channel response: 
>>>>>>>>>> {"error":{"code":-32601,"message":"'Overlay.setShowViewportSizeOnResize'
>>>>>>>>>>  
>>>>>>>>>> wasn't found"},"id":12}*
>>>>>>>>>>
>>>>>>>>>> *Chrome tools message: {"id":13,"method":"Log.enable"}*
>>>>>>>>>>
>>>>>>>>>> *Channel response: 
>>>>>>>>>> {"error":{"code":-32601,"message":"'Log.enable' wasn't 
>>>>>>>>>> found"},"id":13}*
>>>>>>>>>>
>>>>>>>>>> *Chrome tools message: 
>>>>>>>>>> {"id":14,"method":"Log.startViolationsReport","params":{"config":[{"name":"longTask","threshold":200},{"name":"longLayout","threshold":30},{"name":"blockedEvent","threshold":100},{"name":"blockedParser","threshold":-1},{"name":"handler","threshold":150},{"name":"recurringHandler","threshold":50},{"name":"discouragedAPIUse","threshold":-1}]}}*
>>>>>>>>>>
>>>>>>>>>> *Channel response: 
>>>>>>>>>> {"error":{"code":-32601,"message":"'Log.startViolationsReport' 
>>>>>>>>>> wasn't 
>>>>>>>>>> found"},"id":14}*
>>>>>>>>>>
>>>>>>>>>> *Chrome tools message: {"id":15,"method":"ServiceWorker.enable"}*
>>>>>>>>>>
>>>>>>>>>> *Channel response: 
>>>>>>>>>> {"error":{"code":-32601,"message":"'ServiceWorker.enable' wasn't 
>>>>>>>>>> found"},"id":15}*
>>>>>>>>>>
>>>>>>>>>> *Chrome tools message: {"id":16,"method":"Inspector.enable"}*
>>>>>>>>>>
>>>>>>>>>> *Channel response: 
>>>>>>>>>> {"error":{"code":-32601,"message":"'Inspector.enable' wasn't 
>>>>>>>>>> found"},"id":16}*
>>>>>>>>>>
>>>>>>>>>> *Chrome tools message: 
>>>>>>>>>> {"id":17,"method":"Target.setAutoAttach","params":{"autoAttach":true,"waitForDebuggerOnStart":true}}*
>>>>>>>>>>
>>>>>>>>>> *Channel response: 
>>>>>>>>>> {"error":{"code":-32601,"message":"'Target.setAutoAttach' wasn't 
>>>>>>>>>> found"},"id":17}*
>>>>>>>>>>
>>>>>>>>>> *Chrome tools message: 
>>>>>>>>>> {"id":18,"method":"Target.setDiscoverTargets","params":{"discover":true}}*
>>>>>>>>>>
>>>>>>>>>> *Channel response: 
>>>>>>>>>> {"error":{"code":-32601,"message":"'Target.setDiscoverTargets' 
>>>>>>>>>> wasn't 
>>>>>>>>>> found"},"id":18}*
>>>>>>>>>>
>>>>>>>>>> *Chrome tools message: 
>>>>>>>>>> {"id":19,"method":"Target.setRemoteLocations","params":{"locations":[{"host":"localhost","port":9229}]}}*
>>>>>>>>>>
>>>>>>>>>> *Channel response: 
>>>>>>>>>> {"error":{"code":-32601,"message":"'Target.setRemoteLocations' 
>>>>>>>>>> wasn't 
>>>>>>>>>> found"},"id":19}*
>>>>>>>>>>
>>>>>>>>>> *Chrome tools message: 
>>>>>>>>>> {"id":20,"method":"Debugger.setBlackboxPatterns","params":{"patterns":["/main\\.js\\b"]}}*
>>>>>>>>>>
>>>>>>>>>> *Channel response: {"id":20,"result":{}}*
>>>>>>>>>>
>>>>>>>>>> *Chrome tools message: 
>>>>>>>>>> {"id":21,"method":"Page.getNavigationHistory","params":{}}*
>>>>>>>>>>
>>>>>>>>>> *Channel response: 
>>>>>>>>>> {"error":{"code":-32601,"message":"'Page.getNavigationHistory' 
>>>>>>>>>> wasn't 
>>>>>>>>>> found"},"id":21}*
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>

-- 
-- 
v8-users mailing list
v8-users@googlegroups.com
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 v8-users+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to