I think I am close! The embedded V8 is connected to CDT. However, I can't 
see the executed Wasm code. I use Binaryen to generate Wasm code and write 
its binary representation into a byte array. Then I create a new 
`ArrayBuffer` from that byte array and pass it to the `WebAssembly.Module` 
constructor to create a Wasm module object. Last, I call 
`WebAssembly.Instance(module, imports)` to instantiate the just created 
Wasm module with the given imports.  Then I call one of the exported 
functions of the module instance.  This is the point where I want to start 
debugging!  However, calling into the function directly executes it 
entirely. (Setting break points didn't help.) I also tried making the 
function globally accessible so I could call it from the JS shell, but no 
success in doing so.

I saw from your example that you implemented `V8InspectorListener` to 
provide the source map to CDT. How can I provide the source of my Wasm code 
to CDT? There is no source file and no source map. There is only the 
in-memory representation of Binaryen and the binary format in the byte 
array. I could, however, emit the textual representation of the Wasm code. 
No clue how to provide that to CDT, though.

Please help :)

Am Dienstag, 8. September 2020 10:30:26 UTC+2 schrieb Immanuel Haffner:
>
> I somehow thought that the WebSocket connections needs to be in a separate 
> thread, so the communication with CDT can happen concurrently.  After 
> reinspecting your code I found that this is not the case. (I don't know why 
> I had that idea.) The threading was causing my quite some headache. The 
> execution of my Wasm would proceed without waiting for the inspector. 
> Anyways, now I'm having problems how to debug my Wasm code.
>
> Without the inspector, I'd execute my Wasm code as follows:
>     /* 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();
>
> However, with the inspector, I don't know how to "schedule" the call to 
> `run` for debugging. Do I have to invoke this function from the CDT 
> console? I tried to register `run` in `Global` to call it, but I'm failing 
> to do so. Further, I cannot see the source of the Wasm module in CDT. Any 
> clues?
>
> Regards
>
>
> Am Montag, 7. September 2020 14:40:02 UTC+2 schrieb Immanuel Haffner:
>>
>> Hi Elmi,
>>
>> sorry 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/a16f6d47-7b84-4bf1-96a0-741ffd106732o%40googlegroups.com.

Reply via email to