debug-engine: allocate "tmpbuf" dynamically (#1423)

Some configurations (eg. esp32/nuttx) have limited space for BSS,
0x20000 byte buffer is huge on embedded systems, change to
allocate the buffer dynamically.
This commit is contained in:
YAMAMOTO Takashi 2022-08-26 20:49:57 +09:00 committed by GitHub
parent 3875c6649a
commit 04c1eb30cf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -11,18 +11,31 @@
#include "wasm_runtime.h" #include "wasm_runtime.h"
#define MAX_PACKET_SIZE (0x20000) #define MAX_PACKET_SIZE (0x20000)
static char tmpbuf[MAX_PACKET_SIZE]; static char *tmpbuf;
static korp_mutex tmpbuf_lock; static korp_mutex tmpbuf_lock;
int int
wasm_debug_handler_init() wasm_debug_handler_init()
{ {
return os_mutex_init(&tmpbuf_lock); int ret;
tmpbuf = wasm_runtime_malloc(MAX_PACKET_SIZE);
if (tmpbuf == NULL) {
LOG_ERROR("debug-engine: Packet buffer allocation failure");
return BHT_ERROR;
}
ret = os_mutex_init(&tmpbuf_lock);
if (ret != BHT_OK) {
wasm_runtime_free(tmpbuf);
tmpbuf = NULL;
}
return ret;
} }
void void
wasm_debug_handler_deinit() wasm_debug_handler_deinit()
{ {
wasm_runtime_free(tmpbuf);
tmpbuf = NULL;
os_mutex_destroy(&tmpbuf_lock); os_mutex_destroy(&tmpbuf_lock);
} }
@ -78,12 +91,12 @@ process_xfer(WASMGDBServer *server, const char *name, char *args)
char objname[128]; char objname[128];
wasm_debug_instance_get_current_object_name( wasm_debug_instance_get_current_object_name(
(WASMDebugInstance *)server->thread->debug_instance, objname, 128); (WASMDebugInstance *)server->thread->debug_instance, objname, 128);
snprintf(tmpbuf, sizeof(tmpbuf), snprintf(tmpbuf, MAX_PACKET_SIZE,
"l<library-list><library name=\"%s\"><section " "l<library-list><library name=\"%s\"><section "
"address=\"0x%" PRIx64 "\"/></library></library-list>", "address=\"0x%" PRIx64 "\"/></library></library-list>",
objname, addr); objname, addr);
#else #else
snprintf(tmpbuf, sizeof(tmpbuf), snprintf(tmpbuf, MAX_PACKET_SIZE,
"l<library-list><library name=\"%s\"><section " "l<library-list><library name=\"%s\"><section "
"address=\"0x%" PRIx64 "\"/></library></library-list>", "address=\"0x%" PRIx64 "\"/></library></library-list>",
"nobody.wasm", addr); "nobody.wasm", addr);
@ -103,7 +116,7 @@ process_wasm_local(WASMGDBServer *server, char *args)
bool ret; bool ret;
os_mutex_lock(&tmpbuf_lock); os_mutex_lock(&tmpbuf_lock);
snprintf(tmpbuf, sizeof(tmpbuf), "E01"); snprintf(tmpbuf, MAX_PACKET_SIZE, "E01");
if (sscanf(args, "%" PRId32 ";%" PRId32, &frame_index, &local_index) == 2) { if (sscanf(args, "%" PRId32 ";%" PRId32, &frame_index, &local_index) == 2) {
ret = wasm_debug_instance_get_local( ret = wasm_debug_instance_get_local(
(WASMDebugInstance *)server->thread->debug_instance, frame_index, (WASMDebugInstance *)server->thread->debug_instance, frame_index,
@ -126,7 +139,7 @@ process_wasm_global(WASMGDBServer *server, char *args)
bool ret; bool ret;
os_mutex_lock(&tmpbuf_lock); os_mutex_lock(&tmpbuf_lock);
snprintf(tmpbuf, sizeof(tmpbuf), "E01"); snprintf(tmpbuf, MAX_PACKET_SIZE, "E01");
if (sscanf(args, "%" PRId32 ";%" PRId32, &frame_index, &global_index) if (sscanf(args, "%" PRId32 ";%" PRId32, &frame_index, &global_index)
== 2) { == 2) {
ret = wasm_debug_instance_get_global( ret = wasm_debug_instance_get_global(
@ -161,14 +174,14 @@ handle_general_query(WASMGDBServer *server, char *payload)
(WASMDebugInstance *)server->thread->debug_instance); (WASMDebugInstance *)server->thread->debug_instance);
os_mutex_lock(&tmpbuf_lock); os_mutex_lock(&tmpbuf_lock);
snprintf(tmpbuf, sizeof(tmpbuf), "QCp%" PRIx64 ".%" PRIx64 "", pid, snprintf(tmpbuf, MAX_PACKET_SIZE, "QCp%" PRIx64 ".%" PRIx64 "", pid,
tid); tid);
write_packet(server, tmpbuf); write_packet(server, tmpbuf);
os_mutex_unlock(&tmpbuf_lock); os_mutex_unlock(&tmpbuf_lock);
} }
if (!strcmp(name, "Supported")) { if (!strcmp(name, "Supported")) {
os_mutex_lock(&tmpbuf_lock); os_mutex_lock(&tmpbuf_lock);
snprintf(tmpbuf, sizeof(tmpbuf), snprintf(tmpbuf, MAX_PACKET_SIZE,
"qXfer:libraries:read+;PacketSize=%" PRIx32 ";", "qXfer:libraries:read+;PacketSize=%" PRIx32 ";",
MAX_PACKET_SIZE); MAX_PACKET_SIZE);
write_packet(server, tmpbuf); write_packet(server, tmpbuf);
@ -196,7 +209,7 @@ handle_general_query(WASMGDBServer *server, char *payload)
strlen("wasm32-wamr-wasi-wasm")); strlen("wasm32-wamr-wasi-wasm"));
os_mutex_lock(&tmpbuf_lock); os_mutex_lock(&tmpbuf_lock);
snprintf(tmpbuf, sizeof(tmpbuf), snprintf(tmpbuf, MAX_PACKET_SIZE,
"vendor:wamr;ostype:wasi;arch:wasm32;" "vendor:wamr;ostype:wasi;arch:wasm32;"
"triple:%s;endian:little;ptrsize:4;", "triple:%s;endian:little;ptrsize:4;",
triple); triple);
@ -227,7 +240,7 @@ handle_general_query(WASMGDBServer *server, char *payload)
strlen("wasm32-wamr-wasi-wasm")); strlen("wasm32-wamr-wasi-wasm"));
os_mutex_lock(&tmpbuf_lock); os_mutex_lock(&tmpbuf_lock);
snprintf(tmpbuf, sizeof(tmpbuf), snprintf(tmpbuf, MAX_PACKET_SIZE,
"pid:%" PRIx64 ";parent-pid:%" PRIx64 "pid:%" PRIx64 ";parent-pid:%" PRIx64
";vendor:wamr;ostype:wasi;arch:wasm32;" ";vendor:wamr;ostype:wasi;arch:wasm32;"
"triple:%s;endian:little;ptrsize:4;", "triple:%s;endian:little;ptrsize:4;",
@ -238,7 +251,7 @@ handle_general_query(WASMGDBServer *server, char *payload)
if (!strcmp(name, "RegisterInfo0")) { if (!strcmp(name, "RegisterInfo0")) {
os_mutex_lock(&tmpbuf_lock); os_mutex_lock(&tmpbuf_lock);
snprintf( snprintf(
tmpbuf, sizeof(tmpbuf), tmpbuf, MAX_PACKET_SIZE,
"name:pc;alt-name:pc;bitsize:64;offset:0;encoding:uint;format:hex;" "name:pc;alt-name:pc;bitsize:64;offset:0;encoding:uint;format:hex;"
"set:General Purpose Registers;gcc:16;dwarf:16;generic:pc;"); "set:General Purpose Registers;gcc:16;dwarf:16;generic:pc;");
write_packet(server, tmpbuf); write_packet(server, tmpbuf);
@ -260,7 +273,7 @@ handle_general_query(WASMGDBServer *server, char *payload)
mem2hex(mem_info->name, name_buf, strlen(mem_info->name)); mem2hex(mem_info->name, name_buf, strlen(mem_info->name));
os_mutex_lock(&tmpbuf_lock); os_mutex_lock(&tmpbuf_lock);
snprintf(tmpbuf, sizeof(tmpbuf), snprintf(tmpbuf, MAX_PACKET_SIZE,
"start:%" PRIx64 ";size:%" PRIx64 "start:%" PRIx64 ";size:%" PRIx64
";permissions:%s;name:%s;", ";permissions:%s;name:%s;",
(uint64)mem_info->start, mem_info->size, (uint64)mem_info->start, mem_info->size,
@ -339,7 +352,7 @@ send_thread_stop_status(WASMGDBServer *server, uint32 status, korp_tid tid)
if (status == 0) { if (status == 0) {
os_mutex_lock(&tmpbuf_lock); os_mutex_lock(&tmpbuf_lock);
snprintf(tmpbuf, sizeof(tmpbuf), "W%02x", status); snprintf(tmpbuf, MAX_PACKET_SIZE, "W%02x", status);
write_packet(server, tmpbuf); write_packet(server, tmpbuf);
os_mutex_unlock(&tmpbuf_lock); os_mutex_unlock(&tmpbuf_lock);
return; return;
@ -355,16 +368,16 @@ send_thread_stop_status(WASMGDBServer *server, uint32 status, korp_tid tid)
os_mutex_lock(&tmpbuf_lock); os_mutex_lock(&tmpbuf_lock);
// TODO: how name a wasm thread? // TODO: how name a wasm thread?
len += snprintf(tmpbuf, sizeof(tmpbuf), "T%02xthread:%" PRIx64 ";name:%s;", len += snprintf(tmpbuf, MAX_PACKET_SIZE, "T%02xthread:%" PRIx64 ";name:%s;",
gdb_status, (uint64)(uintptr_t)tid, "nobody"); gdb_status, (uint64)(uintptr_t)tid, "nobody");
if (tids_count > 0) { if (tids_count > 0) {
len += snprintf(tmpbuf + len, sizeof(tmpbuf) - len, "threads:"); len += snprintf(tmpbuf + len, MAX_PACKET_SIZE - len, "threads:");
while (i < tids_count) { while (i < tids_count) {
if (i == tids_count - 1) if (i == tids_count - 1)
len += snprintf(tmpbuf + len, sizeof(tmpbuf) - len, len += snprintf(tmpbuf + len, MAX_PACKET_SIZE - len,
"%" PRIx64 ";", (uint64)(uintptr_t)tids[i]); "%" PRIx64 ";", (uint64)(uintptr_t)tids[i]);
else else
len += snprintf(tmpbuf + len, sizeof(tmpbuf) - len, len += snprintf(tmpbuf + len, MAX_PACKET_SIZE - len,
"%" PRIx64 ",", (uint64)(uintptr_t)tids[i]); "%" PRIx64 ",", (uint64)(uintptr_t)tids[i]);
i++; i++;
} }
@ -383,29 +396,29 @@ send_thread_stop_status(WASMGDBServer *server, uint32 status, korp_tid tid)
* correctly processed by LLDB */ * correctly processed by LLDB */
uint32 exception_len = strlen(exception); uint32 exception_len = strlen(exception);
len += len +=
snprintf(tmpbuf + len, sizeof(tmpbuf) - len, snprintf(tmpbuf + len, MAX_PACKET_SIZE - len,
"thread-pcs:%" PRIx64 ";00:%s;reason:%s;description:", pc, "thread-pcs:%" PRIx64 ";00:%s;reason:%s;description:", pc,
pc_string, "exception"); pc_string, "exception");
/* The description should be encoded as HEX */ /* The description should be encoded as HEX */
for (i = 0; i < exception_len; i++) { for (i = 0; i < exception_len; i++) {
len += snprintf(tmpbuf + len, sizeof(tmpbuf) - len, "%02x", len += snprintf(tmpbuf + len, MAX_PACKET_SIZE - len, "%02x",
exception[i]); exception[i]);
} }
len += snprintf(tmpbuf + len, sizeof(tmpbuf) - len, ";"); len += snprintf(tmpbuf + len, MAX_PACKET_SIZE - len, ";");
} }
else { else {
if (status == WAMR_SIG_TRAP) { if (status == WAMR_SIG_TRAP) {
len += snprintf(tmpbuf + len, sizeof(tmpbuf) - len, len += snprintf(tmpbuf + len, MAX_PACKET_SIZE - len,
"thread-pcs:%" PRIx64 ";00:%s;reason:%s;", pc, "thread-pcs:%" PRIx64 ";00:%s;reason:%s;", pc,
pc_string, "breakpoint"); pc_string, "breakpoint");
} }
else if (status == WAMR_SIG_SINGSTEP) { else if (status == WAMR_SIG_SINGSTEP) {
len += snprintf(tmpbuf + len, sizeof(tmpbuf) - len, len += snprintf(tmpbuf + len, MAX_PACKET_SIZE - len,
"thread-pcs:%" PRIx64 ";00:%s;reason:%s;", pc, "thread-pcs:%" PRIx64 ";00:%s;reason:%s;", pc,
pc_string, "trace"); pc_string, "trace");
} }
else if (status > 0) { else if (status > 0) {
len += snprintf(tmpbuf + len, sizeof(tmpbuf) - len, len += snprintf(tmpbuf + len, MAX_PACKET_SIZE - len,
"thread-pcs:%" PRIx64 ";00:%s;reason:%s;", pc, "thread-pcs:%" PRIx64 ";00:%s;reason:%s;", pc,
pc_string, "signal"); pc_string, "signal");
} }
@ -551,7 +564,7 @@ handle_get_read_memory(WASMGDBServer *server, char *payload)
bool ret; bool ret;
os_mutex_lock(&tmpbuf_lock); os_mutex_lock(&tmpbuf_lock);
snprintf(tmpbuf, sizeof(tmpbuf), "%s", ""); snprintf(tmpbuf, MAX_PACKET_SIZE, "%s", "");
if (sscanf(payload, "%" SCNx64 ",%" SCNx64, &maddr, &mlen) == 2) { if (sscanf(payload, "%" SCNx64 ",%" SCNx64, &maddr, &mlen) == 2) {
char *buff; char *buff;
@ -585,7 +598,7 @@ handle_get_write_memory(WASMGDBServer *server, char *payload)
bool ret; bool ret;
os_mutex_lock(&tmpbuf_lock); os_mutex_lock(&tmpbuf_lock);
snprintf(tmpbuf, sizeof(tmpbuf), "%s", ""); snprintf(tmpbuf, MAX_PACKET_SIZE, "%s", "");
if (sscanf(payload, "%" SCNx64 ",%" SCNx64 ":%n", &maddr, &mlen, &offset) if (sscanf(payload, "%" SCNx64 ",%" SCNx64 ":%n", &maddr, &mlen, &offset)
== 2) { == 2) {
payload += offset; payload += offset;
@ -599,7 +612,7 @@ handle_get_write_memory(WASMGDBServer *server, char *payload)
(WASMDebugInstance *)server->thread->debug_instance, maddr, (WASMDebugInstance *)server->thread->debug_instance, maddr,
buff, &mlen); buff, &mlen);
if (ret) { if (ret) {
snprintf(tmpbuf, sizeof(tmpbuf), "%s", "OK"); snprintf(tmpbuf, MAX_PACKET_SIZE, "%s", "OK");
} }
wasm_runtime_free(buff); wasm_runtime_free(buff);
} }
@ -681,7 +694,7 @@ handle_malloc(WASMGDBServer *server, char *payload)
} }
os_mutex_lock(&tmpbuf_lock); os_mutex_lock(&tmpbuf_lock);
snprintf(tmpbuf, sizeof(tmpbuf), "%s", "E03"); snprintf(tmpbuf, MAX_PACKET_SIZE, "%s", "E03");
size = strtoll(payload, NULL, 16); size = strtoll(payload, NULL, 16);
if (size > 0) { if (size > 0) {
@ -701,7 +714,7 @@ handle_malloc(WASMGDBServer *server, char *payload)
(WASMDebugInstance *)server->thread->debug_instance, size, (WASMDebugInstance *)server->thread->debug_instance, size,
map_prot); map_prot);
if (addr) { if (addr) {
snprintf(tmpbuf, sizeof(tmpbuf), "%" PRIx64, addr); snprintf(tmpbuf, MAX_PACKET_SIZE, "%" PRIx64, addr);
} }
} }
write_packet(server, tmpbuf); write_packet(server, tmpbuf);
@ -715,13 +728,13 @@ handle_free(WASMGDBServer *server, char *payload)
bool ret; bool ret;
os_mutex_lock(&tmpbuf_lock); os_mutex_lock(&tmpbuf_lock);
snprintf(tmpbuf, sizeof(tmpbuf), "%s", "E03"); snprintf(tmpbuf, MAX_PACKET_SIZE, "%s", "E03");
addr = strtoll(payload, NULL, 16); addr = strtoll(payload, NULL, 16);
ret = wasm_debug_instance_ummap( ret = wasm_debug_instance_ummap(
(WASMDebugInstance *)server->thread->debug_instance, addr); (WASMDebugInstance *)server->thread->debug_instance, addr);
if (ret) { if (ret) {
snprintf(tmpbuf, sizeof(tmpbuf), "%s", "OK"); snprintf(tmpbuf, MAX_PACKET_SIZE, "%s", "OK");
} }
write_packet(server, tmpbuf); write_packet(server, tmpbuf);