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/d7cebed6-0122-45e7-a1a3-f7ef76b82893o%40googlegroups.com.

Reply via email to