27 : gdb_server_(gdb_server),
31 debugger_initial_suspension_(true),
33 current_isolate_(nullptr) {
40 "PacketSize=1000;vContSupported-;qXfer:libraries:read+;wasm+;";
46 "name:pc;alt-name:pc;bitsize:64;offset:0;encoding:uint;format:hex;set:"
47 "General Purpose Registers;gcc:16;dwarf:16;generic:pc;";
52 "pid:1;ppid:1;uid:1;gid:1;euid:1;egid:1;name:6c6c6462;triple:" +
53 Mem2Hex(
"wasm32-unknown-unknown-wasm") +
";ptrsize:4;";
58 snprintf(buff,
sizeof(buff),
"QC%x",
kThreadId);
68 const std::vector<wasm_addr_t>& call_frames) {
72 const std::vector<wasm_addr_t>& call_frames) {
76 const std::vector<wasm_addr_t>& call_frames) {
82 if (isWaitingForSuspension) {
319 uint32_t length =
static_cast<uint32_t
>(len);
390 uint64_t breakpoint_type;
391 uint64_t breakpoint_address;
392 uint64_t breakpoint_kind;
394 if (!pkt_in->
GetNumberSep(&breakpoint_type, 0) || breakpoint_type != 0 ||
401 wasm_addr_t wasm_breakpoint_addr(breakpoint_address);
403 wasm_breakpoint_addr.
Offset())) {
417 uint64_t breakpoint_type;
418 uint64_t breakpoint_address;
419 uint64_t breakpoint_kind;
420 if (!pkt_in->
GetNumberSep(&breakpoint_type, 0) || breakpoint_type != 0 ||
427 wasm_addr_t wasm_breakpoint_addr(breakpoint_address);
429 wasm_breakpoint_addr.
Offset())) {
448 pkt_out->
AddWord8(
static_cast<uint8_t
>(err));
464 if (!strcmp(str,
"fThreadInfo") || !strcmp(str,
"sThreadInfo")) {
486 std::string tmp =
"Xfer:libraries:read";
487 if (!strncmp(str, tmp.data(), tmp.length())) {
488 std::vector<GdbServer::WasmModuleInfo> modules =
490 std::string
result(
"l<library-list>");
491 for (
const auto& module : modules) {
493 char address_string[32];
494 snprintf(address_string,
sizeof(address_string),
"%" PRIu64,
495 static_cast<uint64_t
>(address));
496 result +=
"<library name=\"";
497 result +=
module.module_name;
498 result +=
"\"><section address=\"";
500 result +=
"\"/></library>";
502 result +=
"</library-list>";
511 std::vector<std::string> toks =
StringSplit(str,
":;");
512 if (toks[0] ==
"WasmCallStack") {
514 std::vector<uint64_t> buffer;
516 buffer.push_back(
pc);
519 static_cast<uint32_t
>(
sizeof(uint64_t) * buffer.size()));
526 if (toks[0] ==
"WasmGlobal") {
527 if (toks.size() == 3) {
528 uint32_t frame_index =
529 static_cast<uint32_t
>(strtol(toks[1].
data(),
nullptr, 10));
531 static_cast<uint32_t
>(strtol(toks[2].
data(),
nullptr, 10));
547 if (toks[0] ==
"WasmLocal") {
548 if (toks.size() == 3) {
549 uint32_t frame_index =
550 static_cast<uint32_t
>(strtol(toks[1].
data(),
nullptr, 10));
552 static_cast<uint32_t
>(strtol(toks[2].
data(),
nullptr, 10));
568 if (toks[0] ==
"WasmStackValue") {
569 if (toks.size() == 3) {
570 uint32_t frame_index =
571 static_cast<uint32_t
>(strtol(toks[1].
data(),
nullptr, 10));
573 static_cast<uint32_t
>(strtol(toks[2].
data(),
nullptr, 10));
589 if (toks[0] ==
"WasmMem") {
590 if (toks.size() == 4) {
591 uint32_t module_id = strtoul(toks[1].
data(),
nullptr, 10);
592 uint32_t address = strtoul(toks[2].
data(),
nullptr, 16);
593 uint32_t length = strtoul(toks[3].
data(),
nullptr, 16);
613 if (toks[0] ==
"WasmData") {
614 if (toks.size() == 4) {
615 uint32_t module_id = strtoul(toks[1].
data(),
nullptr, 10);
616 uint32_t address = strtoul(toks[2].
data(),
nullptr, 16);
617 uint32_t length = strtoul(toks[3].
data(),
nullptr, 16);
657 snprintf(buff,
sizeof(buff),
"thread-pcs:%" PRIx64
";",
671 std::vector<wasm_addr_t> call_frames,
Isolate* isolate) {
675 call_frames.size() > 0 && isolate !=
nullptr) ||
677 call_frames.size() == 0 && isolate ==
nullptr));
union v8::internal::@341::BuiltinMetadata::KindSpecificData data
bool WaitFor(const TimeDelta &rel_time) V8_WARN_UNUSED_RESULT
static constexpr TimeDelta FromMilliseconds(int64_t milliseconds)
bool GetWasmLocal(uint32_t frame_index, uint32_t index, uint8_t *buffer, uint32_t buffer_size, uint32_t *size)
bool AddBreakpoint(uint32_t wasm_module_id, uint32_t offset)
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 HasModuleListChanged() const
std::vector< WasmModuleInfo > GetLoadedModules(bool clear_module_list_changed_flag=false)
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
void QuitMessageLoopOnPause()
uint32_t GetWasmMemory(uint32_t module_id, uint32_t offset, uint8_t *buffer, uint32_t size)
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)
bool GetRawChar(char *ch)
const char * GetPayload() const
bool GetSequence(int32_t *seq) const
void AddWord8(uint8_t val)
void AddNumberSep(uint64_t val, char sep)
void AddBlock(const void *ptr, uint32_t len)
bool GetNumberSep(uint64_t *val, char *sep)
void AddString(const char *str)
void SetSequence(int32_t seq)
bool SendPacket(Packet *packet, bool expect_ack=true)
void WaitForDebugStubEvent()
bool GetPacket(Packet *packet)
std::vector< wasm_addr_t > call_frames_
const std::vector< wasm_addr_t > GetCallStack() const
Target(GdbServer *gdb_server)
void OnSuspended(Isolate *isolate, int signal, const std::vector< wasm_addr_t > &call_frames)
QueryPropertyMap query_properties_
ErrorCode ProcessQueryPacket(const Packet *pkt_in, Packet *pkt_out)
void SetStatus(Status status, int8_t signal=0, std::vector< wasm_addr_t > call_frames_={}, Isolate *isolate=nullptr)
ProcessPacketResult ProcessPacket(Packet *pkt_in, Packet *pkt_out)
v8::base::Semaphore semaphore_
void SetStopReply(Packet *pkt_out) const
void OnException(Isolate *isolate, const std::vector< wasm_addr_t > &call_frames)
bool IsTerminated() const
void InitQueryPropertyMap()
Isolate * current_isolate_
wasm_addr_t GetCurrentPc() const
bool debugger_initial_suspension_
std::atomic< int8_t > cur_signal_
std::atomic< Status > status_
void OnProgramBreak(Isolate *isolate, const std::vector< wasm_addr_t > &call_frames)
static const int kBufSize
uint32_t ModuleId() const
#define TRACE_GDB_REMOTE(...)
ZoneVector< RpoNumber > & result
std::string Mem2Hex(const uint8_t *mem, size_t count)
static const int kThreadId
static const int kSigTrace
std::vector< std::string > StringSplit(const string &instr, const char *delim)
static const int kSigSegv
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)