63 std::shared_ptr<Task> task =
GetNext();
81 template <
typename Functor>
83 queue_.Enqueue(std::make_shared<Task>(ready_semaphore, task));
94 std::shared_ptr<Task> task;
95 if (
queue_.Dequeue(&task)) {
112template <
typename Functor>
117 ready_semaphore.
Wait();
124 std::unique_ptr<GdbServer> gdb_server(
new GdbServer());
128 gdb_server->thread_ = std::make_unique<GdbServerThread>(gdb_server.get());
129 if (!gdb_server->thread_->StartAndInitialize()) {
131 "Cannot initialize thread, GDB-remote debugging will be disabled.\n");
153 bool clear_module_list_changed_flag) {
155 std::vector<GdbServer::WasmModuleInfo> modules;
157 RunSyncTask([
this, &modules, clear_module_list_changed_flag]() {
160 uint32_t module_id = pair.first;
162 modules.push_back({module_id, module_debug.
GetModuleName()});
173 ScriptsMap::iterator scriptIterator =
scripts_.find(module_id);
174 if (scriptIterator !=
scripts_.end()) {
175 *wasm_module_debug = &scriptIterator->second;
178 wasm_module_debug =
nullptr;
183 uint8_t* buffer, uint32_t buffer_size,
190 frame_index, index, buffer,
197 uint8_t* buffer, uint32_t buffer_size,
204 frame_index, index, buffer,
211 uint8_t* buffer, uint32_t buffer_size,
218 frame_index, index, buffer,
225 uint8_t* buffer, uint32_t size) {
227 uint32_t bytes_read = 0;
240 uint8_t* buffer, uint32_t size) {
242 uint32_t bytes_read = 0;
257 uint32_t bytes_read = 0;
258 RunSyncTask([
this, &bytes_read, wasm_addr, buffer, size]() {
275 int breakpoint_id = 0;
290 BreakpointsMap::iterator it =
293 int breakpoint_id = it->second;
308 std::vector<wasm_addr_t>
result;
320 std::make_unique<DebugDelegate>(isolate,
this);
329 if (it->second.GetIsolate() == isolate) {
349 if (v8::debug::AllFramesOnStackAreBlackboxed(isolate)) {
392 :
isolate_(isolate), id_(id_s++), gdb_server_(gdb_server) {
405 isolate_->debug()->SetDebugDelegate(
nullptr);
410 bool has_compile_error) {
412 if (script->IsWasm()) {
414 gdb_server_->AddWasmModule(GetModuleId(script->Id()),
415 script.As<debug::WasmScript>());
422 const std::vector<debug::BreakpointId>& inspector_break_points_hit,
424 gdb_server_->GetTarget().OnProgramBreak(
426 gdb_server_->RunMessageLoopOnPause();
435 gdb_server_->GetTarget().OnException(
437 gdb_server_->RunMessageLoopOnPause();
void RequestInterrupt(InterruptCallback callback, void *data)
static v8::internal::Handle< To > OpenHandle(v8::Local< From > handle)
void SetCaptureStackTraceForUncaughtExceptions(bool capture, int frame_limit, StackTrace::StackTraceOptions options)
DebugDelegate(Isolate *isolate, GdbServer *gdb_server)
void ScriptCompiled(Local< debug::Script > script, bool is_live_edited, bool has_compile_error) override
bool IsFunctionBlackboxed(Local< debug::Script > script, const debug::Location &start, const debug::Location &end) override
static std::atomic< uint32_t > id_s
void ExceptionThrown(Local< v8::Context > paused_context, Local< Value > exception, Local< Value > promise, bool is_uncaught, debug::ExceptionType exception_type) override
void BreakProgramRequested(Local< v8::Context > paused_context, const std::vector< debug::BreakpointId > &inspector_break_points_hit, v8::debug::BreakReasons break_reasons) override
IsolateDebugDelegateMap isolate_delegates_
bool GetWasmLocal(uint32_t frame_index, uint32_t index, uint8_t *buffer, uint32_t buffer_size, uint32_t *size)
std::unique_ptr< TaskRunner > task_runner_
bool AddBreakpoint(uint32_t wasm_module_id, uint32_t offset)
std::unique_ptr< GdbServerThread > thread_
uint32_t GetWasmModuleBytes(wasm_addr_t address, uint8_t *buffer, uint32_t size)
uint32_t GetWasmData(uint32_t module_id, uint32_t offset, uint8_t *buffer, uint32_t size)
bool GetModuleDebugHandler(uint32_t module_id, WasmModuleDebug **wasm_module_debug)
std::vector< WasmModuleInfo > GetLoadedModules(bool clear_module_list_changed_flag=false)
std::atomic< bool > has_module_list_changed_
bool GetWasmStackValue(uint32_t frame_index, uint32_t index, uint8_t *buffer, uint32_t buffer_size, uint32_t *size)
std::vector< wasm_addr_t > GetWasmCallStack() const
auto RunSyncTask(Callback &&callback) const
void QuitMessageLoopOnPause()
void RemoveIsolate(Isolate *isolate)
uint32_t GetWasmMemory(uint32_t module_id, uint32_t offset, uint8_t *buffer, uint32_t size)
Target & GetTarget() const
bool GetWasmGlobal(uint32_t frame_index, uint32_t index, uint8_t *buffer, uint32_t buffer_size, uint32_t *size)
bool RemoveBreakpoint(uint32_t wasm_module_id, uint32_t offset)
static std::unique_ptr< GdbServer > Create()
BreakpointsMap breakpoints_
void RunMessageLoopOnPause()
void AddIsolate(Isolate *isolate)
void AddWasmModule(uint32_t module_id, Local< debug::WasmScript > wasm_script)
const std::vector< wasm_addr_t > GetCallStack() const
wasm_addr_t GetCurrentPc() const
Task(base::Semaphore *ready_semaphore, std::function< void()> func)
std::function< void()> func_
base::Semaphore * ready_semaphore_
v8::base::Semaphore process_queue_semaphore_
LockedQueue< std::shared_ptr< Task > > queue_
TaskRunner & operator=(const TaskRunner &)=delete
std::atomic< bool > is_terminated_
std::shared_ptr< Task > GetNext()
auto Append(base::Semaphore *ready_semaphore, Functor &&task)
TaskRunner(const TaskRunner &)=delete
static std::vector< wasm_addr_t > GetCallStack(uint32_t debug_context_id, Isolate *isolate)
std::string GetModuleName() const
static bool GetWasmStackValue(Isolate *isolate, uint32_t frame_index, uint32_t index, uint8_t *buffer, uint32_t buffer_size, uint32_t *size)
void RemoveBreakpoint(uint32_t offset, int breakpoint_id)
static bool GetWasmLocal(Isolate *isolate, uint32_t frame_index, uint32_t index, uint8_t *buffer, uint32_t buffer_size, uint32_t *size)
uint32_t GetWasmMemory(Isolate *isolate, uint32_t offset, uint8_t *buffer, uint32_t size)
uint32_t GetWasmModuleBytes(wasm_addr_t wasm_addr, uint8_t *buffer, uint32_t size)
uint32_t GetWasmData(Isolate *isolate, uint32_t offset, uint8_t *buffer, uint32_t size)
static bool GetWasmGlobal(Isolate *isolate, uint32_t frame_index, uint32_t index, uint8_t *buffer, uint32_t buffer_size, uint32_t *size)
bool AddBreakpoint(uint32_t offset, int *breakpoint_id)
uint32_t ModuleId() const
#define TRACE_GDB_REMOTE(...)
ZoneVector< RpoNumber > & result
void BreakRightNow(Isolate *v8_isolate, base::EnumSet< debug::BreakReason > break_reasons)
void SetBreakOnNextFunctionCall(Isolate *isolate)
void ChangeBreakOnException(Isolate *isolate, ExceptionBreakState type)
@ BreakOnUncaughtException
static const uint32_t kMaxWasmCallStack
typedef void(VECTORCALL PWasmOp)(const uint8_t *code
V8_EXPORT_PRIVATE FlagValues v8_flags
#define DCHECK(condition)
#define DCHECK_LT(v1, v2)
#define DCHECK_EQ(v1, v2)