Hi Elmi,

thanks for being quiet for two weeks. I was on vacation. I will investigate 
your latest remarks regarding string conversion and the message loop. I 
will reply here. Would you be available for a call? Via Discord, Zoom, or 
the like...

Regards

Am Mittwoch, 26. August 2020 21:58:31 UTC+2 schrieb Elmi Ahmadov:
>
> Hi Immanuel,
>
> Do you have any progress? Did you solve "Connection is closed" issue?
>
> On Friday, August 21, 2020 at 4:55:19 PM UTC+2, Elmi Ahmadov wrote:
>>
>> There could a few things that influence cut off messages, could you 
>> please post how do you convert V8 `StringBuffer` message to a string format 
>> that Boost can send to CDT.
>>
>> you have to implement `runMessageLoopOnPause` and 
>> `schedulePauseOnNextStatement` methods to stop the execution.
>> If you don't implement your waiting logic in `runMessageLoopOnPause` it 
>> will just execute without waiting a user action (I changed my example to 
>> see how it behaves).
>>
>> If you have an example WebAssembly source code maybe you can use my 
>> example to see how it works.
>> Analyzing the WebSocket messages really helps. I remember that I spend 
>> almost one or two weeks to understand how it works.
>>
>> On Friday, August 21, 2020 at 11:56:30 AM UTC+2, Immanuel Haffner wrote:
>>>
>>> Hi Elmi,
>>>
>>> I am using boost web sockets now, just like you do ;) So cut off 
>>> messages are not the fault of sockpp.  In the "Console" tab of CDT i see an 
>>> error
>>>
>>> Connection is closed, can't dispatch pending call
>>>
>>> I suspect that V8 simply finished execution, in which case I stop the 
>>> WebSocket server and dispose of the inspector.
>>>
>>> To be precise, I want to debug a function of a WebAssembly module, 
>>> called "run".  This is how I invoke the function through the V8 API:
>>> /* Get the exports of the created WebAssembly instance. */
>>> auto exports = instance->Get(context, 
>>> V8STR("exports")).ToLocalChecked().As<v8::Object>();
>>> auto run = exports->Get(context, 
>>> V8STR("run")).ToLocalChecked().As<v8::Function>();
>>>
>>> /* Invoke the exported function `run` of the module. */
>>> args_t args { v8::Int32::New(isolate_, wasm_context.id), };
>>> const uint32_t head_of_heap = run->Call(context, context->Global(), 1, 
>>> args).ToLocalChecked().As<v8::Int32>()->Value();
>>>
>>> Now how can I break/pause on entry to that function and inspect it in 
>>> CDT? I tried invoking 
>>> v8_inspector_session->schedulePauseOnNextStatement(...);
>>> But that did not help...
>>>
>>> I am confused and lost :/
>>> Your help is very appreciated Elmi
>>>
>>> Am Freitag, 21. August 2020 11:06:31 UTC+2 schrieb Elmi Ahmadov:
>>>>
>>>> Hi Immanuel,
>>>>
>>>> Seems the messages that come from V8 instance are cut off, maybe 
>>>> because of sockpp. They are also not complete, there should be a response 
>>>> for each request but in your case there are only 3 responses.
>>>>
>>>> The logic to wait the V8 instance should be done in 
>>>> `runMessageLoopOnPause` method.
>>>> In my example, I'm calling a Boost method to get a new message from 
>>>> CDT. So, until there is a new message the V8 instance would wait.
>>>>
>>>> On Friday, August 21, 2020 at 10:10:15 AM UTC+2, Immanuel Haffner wrote:
>>>>>
>>>>> Here is what the network messages in CDT look like:
>>>>>
>>>>> [image: cdt_network.png]
>>>>>
>>>>> I guess the execution doesn't wait for CDT. My WebAssembly function is 
>>>>> executed right away and the connection is closed.
>>>>> How do I make my `v8::Isolate` instance wait for commands from CDT?
>>>>>
>>>>> Am Donnerstag, 20. August 2020 22:04:15 UTC+2 schrieb Elmi Ahmadov:
>>>>>>
>>>>>> Seems you've managed to make a communication between CDT and your 
>>>>>> server. I also checked `sockpp` which does not support websocket 
>>>>>> protocol 
>>>>>> out of box. Probably, you should implement all required parts yourself.
>>>>>>
>>>>>> I'm using Google Groups old UI which allows me to add image to the 
>>>>>> post, it's next to the `Link`: 
>>>>>>
>>>>>> [image: Screenshot from 2020-08-20 21-58-22.png]
>>>>>>
>>>>>>
>>>>>> But I also couldn't find it in the new UI, if you're using the new UI 
>>>>>> you can switch back to the old UI, click settings (gear icon) at the top 
>>>>>> of 
>>>>>> the page and click "Return to classic Google Groups", then you can 
>>>>>> attach 
>>>>>> an image.
>>>>>>
>>>>>> On Thursday, August 20, 2020 at 1:54:43 PM UTC+2, Immanuel Haffner 
>>>>>> wrote:
>>>>>>>
>>>>>>> Hi Elmi,
>>>>>>>
>>>>>>> thank you for checking. My biggest mistage was to write directly to 
>>>>>>> a socket rather than use the WebSocket protocol. After doing so, i now 
>>>>>>> see 
>>>>>>> some messages in CDT. However, there are only 8 green and one last red 
>>>>>>> message. I suppose the last message wasn't sent in full. The second 
>>>>>>> last 
>>>>>>> message was "Runtime.runIfWaitingForDebugger". There is no 
>>>>>>> `Debugger.scriptExecuted` message, though.
>>>>>>>
>>>>>>> Checking V8 code I couldn't find `schedulePauseOnNextStatement`, who 
>>>>>>> is invoking that?
>>>>>>>
>>>>>>> How do I attach an image to a Google Groups post?
>>>>>>>
>>>>>>> Elmi Ahmadov schrieb am Donnerstag, 20. August 2020 um 11:59:17 
>>>>>>> UTC+2:
>>>>>>>
>>>>>>>> I checked your code and you're missing 
>>>>>>>> `runMessageLoopOnMessage`/`quitMessageLoopOnPause` and 
>>>>>>>> `schedulePauseOnNextStatement` (this could be redundant), but in 
>>>>>>>> general, 
>>>>>>>> these methods are necessary. in `runMessageLoopOnPause` method, you 
>>>>>>>> should 
>>>>>>>> block the thread until there is a new message from CDT, in case there 
>>>>>>>> is a 
>>>>>>>> breakpoint and CDT requires user action.
>>>>>>>> Maybe your code does not wait for a user action and execution is 
>>>>>>>> done very quickly.
>>>>>>>>
>>>>>>>> Could you please post WS messages from CDT Network monitor tab? 
>>>>>>>> There should be such response messages: *`Debugger.scriptExecuted`* 
>>>>>>>> and *`Debugger.paused`*.
>>>>>>>> And one important thing is you have to execute your code after you 
>>>>>>>> got a *`**Runtime.runIfWaitingForDebugger` *message from CDT.
>>>>>>>>
>>>>>>>>
>>>>>>>> On Thursday, August 20, 2020 at 10:36:30 AM UTC+2 
>>>>>>>> haffner....@gmail.com wrote:
>>>>>>>>
>>>>>>>>> Ok, I figured the cause for the segmentation violation. I must 
>>>>>>>>> dispose of the inspector and the session and channel before disposing 
>>>>>>>>> of 
>>>>>>>>> the isolate.  I am still left with "WebSocket disconnected". The CDT 
>>>>>>>>> Network monitor says "Connection closed before receiving a handshake 
>>>>>>>>> response".  Maybe I did something wrong establishing a TCP connection?
>>>>>>>>>
>>>>>>>>> Immanuel Haffner schrieb am Donnerstag, 20. August 2020 um 
>>>>>>>>> 10:07:27 UTC+2:
>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Hi again,
>>>>>>>>>>
>>>>>>>>>> I figured that the `chome-devtools://` part doesn't work in 
>>>>>>>>>> Chromium.  Using `devtools://` instead works. However, I get a 
>>>>>>>>>> segmentation 
>>>>>>>>>> violation. 
>>>>>>>>>>
>>>>>>>>>> Here is the code I wrote to connect the V8 inspector:
>>>>>>>>>>
>>>>>>>>>>     struct ServerChannel : v8_inspector::V8Inspector::Channel
>>>>>>>>>>     {
>>>>>>>>>>         private:
>>>>>>>>>>         sockpp::tcp_socket *socket_;
>>>>>>>>>>
>>>>>>>>>>         public:
>>>>>>>>>>         ServerChannel() { }
>>>>>>>>>>
>>>>>>>>>>         void set_socket(sockpp::tcp_socket *socket) { socket_ = 
>>>>>>>>>> socket; }
>>>>>>>>>>
>>>>>>>>>>         private:
>>>>>>>>>>         void sendResponse(int, 
>>>>>>>>>> std::unique_ptr<v8_inspector::StringBuffer> message) override {
>>>>>>>>>>             auto v8_sv = message->string();
>>>>>>>>>>             socket_->write_n(v8_sv.characters8(), v8_sv.length());
>>>>>>>>>>         }
>>>>>>>>>>
>>>>>>>>>>         void 
>>>>>>>>>> sendNotification(std::unique_ptr<v8_inspector::StringBuffer> 
>>>>>>>>>> message) 
>>>>>>>>>> override {
>>>>>>>>>>             auto v8_sv = message->string();
>>>>>>>>>>             socket_->write_n(v8_sv.characters8(), v8_sv.length());
>>>>>>>>>>         }
>>>>>>>>>>
>>>>>>>>>>         void flushProtocolNotifications() override { }
>>>>>>>>>>     };
>>>>>>>>>>
>>>>>>>>>>     struct MyV8InspectorClient : v8_inspector::V8InspectorClient
>>>>>>>>>>     {
>>>>>>>>>>         private:
>>>>>>>>>>         sockpp::tcp_acceptor acceptor_;
>>>>>>>>>>         std::unique_ptr<ServerChannel> channel_;
>>>>>>>>>>         std::unique_ptr<v8_inspector::V8Inspector> inspector_;
>>>>>>>>>>         std::unique_ptr<v8_inspector::V8InspectorSession> 
>>>>>>>>>> session_;
>>>>>>>>>>         int16_t port_;
>>>>>>>>>>
>>>>>>>>>>         public:
>>>>>>>>>>         MyV8InspectorClient(int16_t port, v8::Isolate *isolate)
>>>>>>>>>>             : acceptor_(port)
>>>>>>>>>>             , port_(port)
>>>>>>>>>>         {
>>>>>>>>>>             if (not acceptor_)
>>>>>>>>>>                 throw std::runtime_error("failed to initalize TCP 
>>>>>>>>>> server");
>>>>>>>>>>
>>>>>>>>>>             channel_ = std::make_unique<ServerChannel>();
>>>>>>>>>>             inspector_ = 
>>>>>>>>>> v8_inspector::V8Inspector::create(isolate, this);
>>>>>>>>>>
>>>>>>>>>>             std::string state("mutable");
>>>>>>>>>>             v8_inspector::StringView sv(reinterpret_cast<const 
>>>>>>>>>> uint8_t*>(state.c_str()), state.length());
>>>>>>>>>>             session_ = inspector_->connect(
>>>>>>>>>>                 /* contextGroupId= */ 1,
>>>>>>>>>>                 /* channel=        */ channel_.get(),
>>>>>>>>>>                 /* state=          */ sv
>>>>>>>>>>             );
>>>>>>>>>>         }
>>>>>>>>>>
>>>>>>>>>>         MyV8InspectorClient(const MyV8InspectorClient&) = delete;
>>>>>>>>>>         MyV8InspectorClient(MyV8InspectorClient&&) = default;
>>>>>>>>>>
>>>>>>>>>>         ~MyV8InspectorClient() {
>>>>>>>>>>             session_.reset();
>>>>>>>>>>             inspector_.reset();
>>>>>>>>>>             channel_.reset();
>>>>>>>>>>         }
>>>>>>>>>>
>>>>>>>>>>         void onMessage(std::string_view sv) {
>>>>>>>>>>             v8_inspector::StringView msg(reinterpret_cast<const 
>>>>>>>>>> uint8_t*>(sv.data()), sv.length());
>>>>>>>>>>             session_->dispatchProtocolMessage(msg);
>>>>>>>>>>         }
>>>>>>>>>>
>>>>>>>>>>         void launch() {
>>>>>>>>>>             std::cout << "WebSocket based Inspector Agent 
>>>>>>>>>> started.\n"
>>>>>>>>>>                       << "Open the following link in your 
>>>>>>>>>> Chrome/Chromium browser:\n\n\t"
>>>>>>>>>>                       << 
>>>>>>>>>> "devtools://devtools/bundled/inspector.html?experiments=true&v8only=true&ws=
>>>>>>>>>> 127.0.0.1:" <<  port_
>>>>>>>>>>                       << '\n' << std::endl;
>>>>>>>>>>
>>>>>>>>>>             auto socket = 
>>>>>>>>>> std::make_unique<sockpp::tcp_socket>(acceptor_.accept());
>>>>>>>>>>             if (not *socket)
>>>>>>>>>>                 throw std::runtime_error("failed to establish 
>>>>>>>>>> connection to TCP client");
>>>>>>>>>>             channel_->set_socket(socket.get());
>>>>>>>>>>
>>>>>>>>>>             auto thread = 
>>>>>>>>>> std::thread([this](std::unique_ptr<sockpp::tcp_socket> socket) {
>>>>>>>>>>                 uint8_t buf[512];
>>>>>>>>>>                 std::vector<uint8_t> msg;
>>>>>>>>>>                 msg.reserve(512);
>>>>>>>>>>                 std::size_t n;
>>>>>>>>>>
>>>>>>>>>>                 for (;;) {
>>>>>>>>>>                     std::cerr << "receiving bytes..." << 
>>>>>>>>>> std::endl;
>>>>>>>>>>                     while ((n = socket->read_n(buf, 
>>>>>>>>>> ARR_SIZE(buf))) > 0)
>>>>>>>>>>                         msg.insert(msg.end(), buf, buf + n); // 
>>>>>>>>>> append recently read bytes to msg
>>>>>>>>>>                     if (not msg.empty()) {
>>>>>>>>>>                         std::cerr << "the received message is " 
>>>>>>>>>> << msg.size() << " bytes" << std::endl;
>>>>>>>>>>                         std::string_view 
>>>>>>>>>> sv(reinterpret_cast<char*>(&msg[0]), msg.size());
>>>>>>>>>>                         this->onMessage(sv);
>>>>>>>>>>                         msg.clear();
>>>>>>>>>>                     }
>>>>>>>>>>                     std::this_thread::yield();
>>>>>>>>>>                 }
>>>>>>>>>>             },
>>>>>>>>>>             std::move(socket));
>>>>>>>>>>             thread.detach();
>>>>>>>>>>         }
>>>>>>>>>>     };
>>>>>>>>>>
>>>>>>>>>> It's mostly taken from your example and condensed into a single 
>>>>>>>>>> class.  Instead of boost, I use sockpp for socket programming.i
>>>>>>>>>>
>>>>>>>>>> After creating a `v8::Isolate`, I do the following:
>>>>>>>>>>
>>>>>>>>>>         inspector_ = 
>>>>>>>>>> std::make_unique<MyV8InspectorClient>(cdt_port, isolate_);
>>>>>>>>>>         inspector_->launch();
>>>>>>>>>>
>>>>>>>>>> However, when connecting to the inspector it says "WebSocket 
>>>>>>>>>> disconnected" and the application crashes with a segmentation 
>>>>>>>>>> violation:
>>>>>>>>>>
>>>>>>>>>>     AddressSanitizer:DEADLYSIGNAL
>>>>>>>>>>     
>>>>>>>>>> =================================================================
>>>>>>>>>>     ==13072==ERROR: AddressSanitizer: SEGV on unknown address 
>>>>>>>>>> 0x1d580000a838 (pc 0x561c8173e6b4 bp 0x7fff75fa6430 sp 
>>>>>>>>>> 0x7fff75fa6430 T0)
>>>>>>>>>>     ==13072==The signal is caused by a READ memory access.
>>>>>>>>>>         #0 0x561c8173e6b4 in v8::Isolate::GetHeapProfiler() 
>>>>>>>>>> ../../../../../third-party/v8/v8/src/execution/isolate.h:1059:48
>>>>>>>>>>         #1 0x561c82d3fd77 in 
>>>>>>>>>> v8_inspector::V8HeapProfilerAgentImpl::stopTrackingHeapObjectsInternal()
>>>>>>>>>>  
>>>>>>>>>> ../../../../../third-party/v8/v8/src/inspector/v8-heap-profiler-agent-impl.cc:316:14
>>>>>>>>>>         #2 0x561c82d3feb9 in 
>>>>>>>>>> v8_inspector::V8HeapProfilerAgentImpl::disable() 
>>>>>>>>>> ../../../../../third-party/v8/v8/src/inspector/v8-heap-profiler-agent-impl.cc:204:3
>>>>>>>>>>         #3 0x561c8208f095 in 
>>>>>>>>>> v8_inspector::V8InspectorSessionImpl::~V8InspectorSessionImpl() 
>>>>>>>>>> ../../../../../third-party/v8/v8/src/inspector/v8-inspector-session-impl.cc:151:24
>>>>>>>>>>         #4 0x561c8208f33d in 
>>>>>>>>>> v8_inspector::V8InspectorSessionImpl::~V8InspectorSessionImpl() 
>>>>>>>>>> ../../../../../third-party/v8/v8/src/inspector/v8-inspector-session-impl.cc:147:51
>>>>>>>>>>         #5 0x561c80ec9eff in 
>>>>>>>>>> std::default_delete<v8_inspector::V8InspectorSession>::operator()(v8_inspector::V8InspectorSession*)
>>>>>>>>>>  
>>>>>>>>>> const 
>>>>>>>>>> /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/10.1.0/../../../../include/c++/10.1.0/bits/unique_ptr.h:84:2
>>>>>>>>>>         #6 0x561c80ec9d3e in 
>>>>>>>>>> std::__uniq_ptr_impl<v8_inspector::V8InspectorSession, 
>>>>>>>>>> std::default_delete<v8_inspector::V8InspectorSession> 
>>>>>>>>>> >::reset(v8_inspector::V8InspectorSession*) 
>>>>>>>>>> /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/10.1.0/../../../../include/c++/10.1.0/bits/unique_ptr.h:181:4
>>>>>>>>>>         #7 0x561c80eca183 in 
>>>>>>>>>> std::unique_ptr<v8_inspector::V8InspectorSession, 
>>>>>>>>>> std::default_delete<v8_inspector::V8InspectorSession> 
>>>>>>>>>> >::reset(v8_inspector::V8InspectorSession*) 
>>>>>>>>>> /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/10.1.0/../../../../include/c++/10.1.0/bits/unique_ptr.h:455:7
>>>>>>>>>>         #8 0x561c80ec7193 in 
>>>>>>>>>> db::v8_helper::MyV8InspectorClient::~MyV8InspectorClient() 
>>>>>>>>>> /home/immanuel/Documents/Work/PhD/mutable/mutable/build/debug/../../src/backend/V8Platform.hpp:74:18
>>>>>>>>>>         #9 0x561c80ec723b in 
>>>>>>>>>> db::v8_helper::MyV8InspectorClient::~MyV8InspectorClient() 
>>>>>>>>>> /home/immanuel/Documents/Work/PhD/mutable/mutable/build/debug/../../src/backend/V8Platform.hpp:73:28
>>>>>>>>>>         #10 0x561c80eb361f in 
>>>>>>>>>> std::default_delete<db::v8_helper::MyV8InspectorClient>::operator()(db::v8_helper::MyV8InspectorClient*)
>>>>>>>>>>  
>>>>>>>>>> const 
>>>>>>>>>> /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/10.1.0/../../../../include/c++/10.1.0/bits/unique_ptr.h:84:2
>>>>>>>>>>         #11 0x561c80eaede6 in 
>>>>>>>>>> std::unique_ptr<db::v8_helper::MyV8InspectorClient, 
>>>>>>>>>> std::default_delete<db::v8_helper::MyV8InspectorClient> 
>>>>>>>>>> >::~unique_ptr() 
>>>>>>>>>> /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/10.1.0/../../../../include/c++/10.1.0/bits/unique_ptr.h:360:4
>>>>>>>>>>         #12 0x561c80ea6e97 in db::V8Platform::~V8Platform() 
>>>>>>>>>> /home/immanuel/Documents/Work/PhD/mutable/mutable/build/debug/../../src/backend/V8Platform.cpp:221:1
>>>>>>>>>>         #13 0x561c80ea6f2b in db::V8Platform::~V8Platform() 
>>>>>>>>>> /home/immanuel/Documents/Work/PhD/mutable/mutable/build/debug/../../src/backend/V8Platform.cpp:218:1
>>>>>>>>>>         #14 0x561c80e9ea3f in 
>>>>>>>>>> std::default_delete<db::WasmPlatform>::operator()(db::WasmPlatform*) 
>>>>>>>>>> const 
>>>>>>>>>> /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/10.1.0/../../../../include/c++/10.1.0/bits/unique_ptr.h:84:2
>>>>>>>>>>         #15 0x561c80e9e8f6 in std::unique_ptr<db::WasmPlatform, 
>>>>>>>>>> std::default_delete<db::WasmPlatform> >::~unique_ptr() 
>>>>>>>>>> /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/10.1.0/../../../../include/c++/10.1.0/bits/unique_ptr.h:360:4
>>>>>>>>>>         #16 0x561c80e8efbd in db::WasmBackend::~WasmBackend() 
>>>>>>>>>> /home/immanuel/Documents/Work/PhD/mutable/mutable/build/debug/../../src/backend/WebAssembly.hpp:110:8
>>>>>>>>>>         #17 0x561c80e8efeb in db::WasmBackend::~WasmBackend() 
>>>>>>>>>> /home/immanuel/Documents/Work/PhD/mutable/mutable/build/debug/../../src/backend/WebAssembly.hpp:110:8
>>>>>>>>>>         #18 0x561c80ccf1ff in 
>>>>>>>>>> std::default_delete<db::Backend>::operator()(db::Backend*) const 
>>>>>>>>>> /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/10.1.0/../../../../include/c++/10.1.0/bits/unique_ptr.h:84:2
>>>>>>>>>>         #19 0x561c80ca8b16 in std::unique_ptr<db::Backend, 
>>>>>>>>>> std::default_delete<db::Backend> >::~unique_ptr() 
>>>>>>>>>> /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/10.1.0/../../../../include/c++/10.1.0/bits/unique_ptr.h:360:4
>>>>>>>>>>         #20 0x561c80c86dd9 in process_stream(std::istream&, char 
>>>>>>>>>> const*, db::Diagnostic) 
>>>>>>>>>> /home/immanuel/Documents/Work/PhD/mutable/mutable/build/debug/../../src/shell.cpp:151:13
>>>>>>>>>>         #21 0x561c80c9a265 in main 
>>>>>>>>>> /home/immanuel/Documents/Work/PhD/mutable/mutable/build/debug/../../src/shell.cpp:675:13
>>>>>>>>>>         #22 0x7f6259a37001 in __libc_start_main 
>>>>>>>>>> (/usr/lib/libc.so.6+0x27001)
>>>>>>>>>>         #23 0x561c80ba722d in _start 
>>>>>>>>>> (/home/immanuel/Documents/Work/PhD/mutable/mutable/build/debug/bin/shell+0x117222d)
>>>>>>>>>>
>>>>>>>>>>     AddressSanitizer can not provide additional info.
>>>>>>>>>>     SUMMARY: AddressSanitizer: SEGV 
>>>>>>>>>> ../../../../../third-party/v8/v8/src/execution/isolate.h:1059:48 in 
>>>>>>>>>> v8::Isolate::GetHeapProfiler()
>>>>>>>>>>
>>>>>>>>>> Can you spot what's going wrong?  I did not override 
>>>>>>>>>> `V8InspectorClientImpl::runMessageLoopOnPause` like you did. Is this 
>>>>>>>>>> necessary?
>>>>>>>>>>
>>>>>>>>>> Kind regards,
>>>>>>>>>> Immanuel
>>>>>>>>>> Elmi Ahmadov schrieb am Mittwoch, 19. August 2020 um 21:40:58 
>>>>>>>>>> UTC+2:
>>>>>>>>>>
>>>>>>>>>>> Dear Immanuel,
>>>>>>>>>>>
>>>>>>>>>>> You've got the right idea from my example code. You need a 
>>>>>>>>>>> websocket to create a communication channel between V8 Inspector 
>>>>>>>>>>> and CDT.
>>>>>>>>>>> The URL to debug the code is usually as follows and it works for 
>>>>>>>>>>> me.
>>>>>>>>>>>
>>>>>>>>>>> devtools:
>>>>>>>>>>> //devtools/bundled/inspector.html?experiments=true&v8only=true&ws=IP:WebSocketPort
>>>>>>>>>>>
>>>>>>>>>>> Without a minimal sample code it's difficult to say what you're 
>>>>>>>>>>> missing. 
>>>>>>>>>>> You can also use Chrome DevTools Network Activity tab (you need 
>>>>>>>>>>> to open another Inspector console, see the screenshot), just filter 
>>>>>>>>>>> *WS* to see what happens between your server and CDT, which 
>>>>>>>>>>> helped me a lot.
>>>>>>>>>>>  
>>>>>>>>>>>
>>>>>>>>>>> [image: Screenshot from 2020-08-19 21-37-48.png]
>>>>>>>>>>>
>>>>>>>>>>> There is another Chrome built-in feature that helped me is 
>>>>>>>>>>> *Protocol 
>>>>>>>>>>> Monitor*, you can here how to enable it: 
>>>>>>>>>>> https://chromedevtools.github.io/devtools-protocol/
>>>>>>>>>>>
>>>>>>>>>>> On Wednesday, August 19, 2020 at 4:17:00 PM UTC+2, Immanuel 
>>>>>>>>>>> Haffner wrote:
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> Dear Elmi,
>>>>>>>>>>>>
>>>>>>>>>>>> thank you for your reply. I had a long look at your example. To 
>>>>>>>>>>>> be honest, I find it a bit bloatet.
>>>>>>>>>>>>
>>>>>>>>>>>> Let me phrase in my own words what I have learned from your 
>>>>>>>>>>>> code:
>>>>>>>>>>>>
>>>>>>>>>>>> 1) I need a socket to receive messages from CDT and send 
>>>>>>>>>>>> responses back to CDT.
>>>>>>>>>>>> 2) I must implement `v8_inspector::V8Inspector::Channel` to 
>>>>>>>>>>>> have `sendResponse()` and `sendNotification()` send the respective 
>>>>>>>>>>>> message 
>>>>>>>>>>>> over the socket to CDT.
>>>>>>>>>>>> 3) I need an instance of `v8_inspector::V8InspectorClient`. I 
>>>>>>>>>>>> am not sure whether I must overwrite anything from this class in a 
>>>>>>>>>>>> subclass. I think the base class is actually fine...
>>>>>>>>>>>> 4) I must use `v8_inspector::V8Inspector::create()` to create 
>>>>>>>>>>>> an instance of `v8_inspector::V8Inspector`. I believe this is 
>>>>>>>>>>>> where all the 
>>>>>>>>>>>> inspector logic is implemented...
>>>>>>>>>>>> 5) Using the `V8Inspector` instance I create a 
>>>>>>>>>>>> `v8_inspector::V8InspectorSession` by calling `connect()`. Here I 
>>>>>>>>>>>> must pass 
>>>>>>>>>>>> a reference to an instance of my 
>>>>>>>>>>>> `v8_inspector::V8Inspector::Channel` 
>>>>>>>>>>>> subclass.
>>>>>>>>>>>> This was the basic setup. Now it's time to run the server loop.
>>>>>>>>>>>> 6) In a detached thread, read from the socket and pass the 
>>>>>>>>>>>> message on by invoking `dispatchProtocolMessage()` on my instance 
>>>>>>>>>>>> of `v8_inspector::V8InspectorSession`.
>>>>>>>>>>>>
>>>>>>>>>>>> When running my code, the TCP acceptor is set up and waiting 
>>>>>>>>>>>> for a client. I visit `localhost:<PORT>` with Chromium (the 
>>>>>>>>>>>> chrome-devtool:// links just won't work). Then my application 
>>>>>>>>>>>> executes the 
>>>>>>>>>>>> WebAssembly and the browser says the page isn't working 
>>>>>>>>>>>> (ERR_EMPTY_RESPONSE).
>>>>>>>>>>>>
>>>>>>>>>>>> What am I missing?
>>>>>>>>>>>> Elmi Ahmadov schrieb am Mittwoch, 19. August 2020 um 10:21:38 
>>>>>>>>>>>> UTC+2:
>>>>>>>>>>>>
>>>>>>>>>>>>> Hi.
>>>>>>>>>>>>>
>>>>>>>>>>>>> I have an example project how to use V8 inspector API: 
>>>>>>>>>>>>> https://github.com/ahmadov/v8_inspector_example. Hope this 
>>>>>>>>>>>>> would help.
>>>>>>>>>>>>>
>>>>>>>>>>>>> Best regards
>>>>>>>>>>>>>
>>>>>>>>>>>>> On Wednesday, August 19, 2020 at 10:11:00 AM UTC+2, Immanuel 
>>>>>>>>>>>>> Haffner wrote:
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Hi all,
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> I followed this V8 documentation [1] to embed V8 into my 
>>>>>>>>>>>>>> application. The application compiles inputs to WebAssembly 
>>>>>>>>>>>>>> modules and 
>>>>>>>>>>>>>> executes them in embedded V8.  Now I would like to debug these 
>>>>>>>>>>>>>> WebAssembly 
>>>>>>>>>>>>>> modules.  Searching online brought me to ChromeDevTools and the 
>>>>>>>>>>>>>> v8-inspector API.  I mostly followed this guide [2] to set up a 
>>>>>>>>>>>>>> `V8InspectorSession` and implemented the `V8Inspector::Channel` 
>>>>>>>>>>>>>> interface 
>>>>>>>>>>>>>> by creating a TCP server, waiting for a connection, and then in 
>>>>>>>>>>>>>> `sendResponse()` and `sendNotification()` I simply send the 
>>>>>>>>>>>>>> message over 
>>>>>>>>>>>>>> the TCP socket.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> To debug, I launch chromium and connect to localhost on the 
>>>>>>>>>>>>>> port where the TCP server was created. Sadly, this doesn't work. 
>>>>>>>>>>>>>> The 
>>>>>>>>>>>>>> `sendResponse()` and `sendNotification()` methods are never 
>>>>>>>>>>>>>> invoked.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Can someone please point me to a tutorial or give me some 
>>>>>>>>>>>>>> guidance?
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>> Immanuel
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> [1] https://v8.dev/docs/embed
>>>>>>>>>>>>>> [2] 
>>>>>>>>>>>>>> https://hyperandroid.com/2020/02/12/v8-inspector-from-an-embedder-standpoint/
>>>>>>>>>>>>>>
>>>>>>>>>>>>>

-- 
-- 
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.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/v8-users/7fead181-19b6-44e4-ace7-7bc4d1a76c29o%40googlegroups.com.

Reply via email to