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/2c71f836-ff5a-41a2-8f11-cf72dfa271c6o%40googlegroups.com.