This repository has been archived on 2023-11-05. You can view files and clone it, but cannot push or open issues or pull requests.
wasm-micro-runtime/core/iwasm/libraries/debug-engine/packets.c
Xu Jun 3fe191b0df
[debugger enhance] don't block gdbserver thread while executing (#989)
Allow to set break point again when all break points are removed and
wasm app starts running.
2022-02-16 17:35:35 +08:00

92 lines
2.2 KiB
C

/*
* Copyright (C) 2021 Ant Group. All rights reserved.
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
*/
#include "bh_platform.h"
#include "packets.h"
#include "gdbserver.h"
void
write_data_raw(WASMGDBServer *gdbserver, const uint8 *data, ssize_t len)
{
ssize_t nwritten;
nwritten = os_socket_send(gdbserver->socket_fd, data, len);
if (nwritten < 0) {
LOG_ERROR("Write error\n");
exit(-2);
}
}
void
write_hex(WASMGDBServer *gdbserver, unsigned long hex)
{
char buf[32];
size_t len;
len = snprintf(buf, sizeof(buf) - 1, "%02lx", hex);
write_data_raw(gdbserver, (uint8 *)buf, len);
}
void
write_packet_bytes(WASMGDBServer *gdbserver, const uint8 *data,
size_t num_bytes)
{
uint8 checksum;
size_t i;
write_data_raw(gdbserver, (uint8 *)"$", 1);
for (i = 0, checksum = 0; i < num_bytes; ++i)
checksum += data[i];
write_data_raw(gdbserver, (uint8 *)data, num_bytes);
write_data_raw(gdbserver, (uint8 *)"#", 1);
write_hex(gdbserver, checksum);
}
void
write_packet(WASMGDBServer *gdbserver, const char *data)
{
LOG_VERBOSE("send replay:%s", data);
write_packet_bytes(gdbserver, (const uint8 *)data, strlen(data));
}
void
write_binary_packet(WASMGDBServer *gdbserver, const char *pfx,
const uint8 *data, ssize_t num_bytes)
{
uint8 *buf;
ssize_t pfx_num_chars = strlen(pfx);
ssize_t buf_num_bytes = 0, total_size;
int32 i;
total_size = 2 * num_bytes + pfx_num_chars;
buf = wasm_runtime_malloc(total_size);
if (!buf) {
LOG_ERROR("Failed to allocate memory for binary packet");
return;
}
memset(buf, 0, total_size);
memcpy(buf, pfx, pfx_num_chars);
buf_num_bytes += pfx_num_chars;
for (i = 0; i < num_bytes; ++i) {
uint8 b = data[i];
switch (b) {
case '#':
case '$':
case '}':
case '*':
buf[buf_num_bytes++] = '}';
buf[buf_num_bytes++] = b ^ 0x20;
break;
default:
buf[buf_num_bytes++] = b;
break;
}
}
write_packet_bytes(gdbserver, buf, buf_num_bytes);
wasm_runtime_free(buf);
}