Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[wasm][debugger] Fixing race condition #64394

Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 4 additions & 8 deletions src/mono/mono/component/mini-wasm-debugger.c
Original file line number Diff line number Diff line change
Expand Up @@ -361,9 +361,7 @@ EMSCRIPTEN_KEEPALIVE gboolean
mono_wasm_send_dbg_command_with_parms (int id, MdbgProtCommandSet command_set, int command, guint8* data, unsigned int size, int valtype, char* newvalue)
{
if (!debugger_enabled) {
EM_ASM ({
MONO.mono_wasm_add_dbg_command_received ($0, $1, $2, $3);
}, 0, id, 0, 0);
mono_wasm_add_dbg_command_received (0, id, 0, 0);
return TRUE;
}
MdbgProtBuffer bufWithParms;
Expand All @@ -382,9 +380,7 @@ EMSCRIPTEN_KEEPALIVE gboolean
mono_wasm_send_dbg_command (int id, MdbgProtCommandSet command_set, int command, guint8* data, unsigned int size)
{
if (!debugger_enabled) {
EM_ASM ({
MONO.mono_wasm_add_dbg_command_received ($0, $1, $2, $3);
}, 0, id, 0, 0);
mono_wasm_add_dbg_command_received(0, id, 0, 0);
return TRUE;
}
ss_calculate_framecount (NULL, NULL, TRUE, NULL, NULL);
Expand All @@ -403,7 +399,7 @@ mono_wasm_send_dbg_command (int id, MdbgProtCommandSet command_set, int command,
else
error = mono_process_dbg_packet (id, command_set, command, &no_reply, data, data + size, &buf);

mono_wasm_add_dbg_command_received(error == MDBGPROT_ERR_NONE, id, buf.buf, buf.p-buf.buf);
mono_wasm_add_dbg_command_received (error == MDBGPROT_ERR_NONE, id, buf.buf, buf.p-buf.buf);

buffer_free (&buf);
return TRUE;
Expand All @@ -412,7 +408,7 @@ mono_wasm_send_dbg_command (int id, MdbgProtCommandSet command_set, int command,
static gboolean
receive_debugger_agent_message (void *data, int len)
{
mono_wasm_add_dbg_command_received(1, -1, data, len);
mono_wasm_add_dbg_command_received(1, 0, data, len);
mono_wasm_save_thread_context();
mono_wasm_fire_debugger_agent_message ();
return FALSE;
Expand Down
18 changes: 11 additions & 7 deletions src/mono/wasm/debugger/BrowserDebugProxy/MonoSDBHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -700,8 +700,8 @@ public PointerValue(long address, int typeId, string varName)
internal class MonoSDBHelper
{
private static int debuggerObjectId;
private static int cmdId;
private static int GetId() {return cmdId++;}
private static int cmdId = 1; //cmdId == 0 is used by events which come from runtime
private static int GetNewId() {return cmdId++;}
private static int MINOR_VERSION = 61;
private static int MAJOR_VERSION = 2;

Expand Down Expand Up @@ -862,7 +862,7 @@ public async Task<bool> EnableReceiveRequests(EventKind eventKind, CancellationT
}

internal async Task<MonoBinaryReader> SendDebuggerAgentCommand<T>(T command, MonoBinaryWriter arguments, CancellationToken token) =>
MonoBinaryReader.From (await proxy.SendMonoCommand(sessionId, MonoCommands.SendDebuggerAgentCommand(proxy.RuntimeId, GetId(), (int)GetCommandSetForCommand(command), (int)(object)command, arguments?.ToBase64().data ?? string.Empty), token));
MonoBinaryReader.From (await proxy.SendMonoCommand(sessionId, MonoCommands.SendDebuggerAgentCommand(proxy.RuntimeId, GetNewId(), (int)GetCommandSetForCommand(command), (int)(object)command, arguments?.ToBase64().data ?? string.Empty), token));

internal CommandSet GetCommandSetForCommand<T>(T command) =>
command switch {
Expand All @@ -885,7 +885,7 @@ internal CommandSet GetCommandSetForCommand<T>(T command) =>
};

internal async Task<MonoBinaryReader> SendDebuggerAgentCommandWithParms<T>(T command, (string data, int length) encoded, int type, string extraParm, CancellationToken token) =>
MonoBinaryReader.From(await proxy.SendMonoCommand(sessionId, MonoCommands.SendDebuggerAgentCommandWithParms(proxy.RuntimeId, GetId(), (int)GetCommandSetForCommand(command), (int)(object)command, encoded.data, encoded.length, type, extraParm), token));
MonoBinaryReader.From(await proxy.SendMonoCommand(sessionId, MonoCommands.SendDebuggerAgentCommandWithParms(proxy.RuntimeId, GetNewId(), (int)GetCommandSetForCommand(command), (int)(object)command, encoded.data, encoded.length, type, extraParm), token));

public async Task<int> CreateString(string value, CancellationToken token)
{
Expand Down Expand Up @@ -2180,6 +2180,7 @@ public async Task<JArray> GetValueTypeProxy(int valueTypeId, CancellationToken t
command = CmdVM.InvokeMethod,
buffer = data,
length = length,
id = GetNewId()
}),
name = propertyNameStr
}));
Expand Down Expand Up @@ -2505,7 +2506,8 @@ async Task<JArray> GetFieldsValues(List<FieldTypeClass> fields, bool isOwn, bool
command = CmdObject.RefSetValues,
buffer = data,
valtype,
length = length
length,
id = GetNewId()
}));
}
if (!isRootHidden)
Expand Down Expand Up @@ -2636,7 +2638,8 @@ public async Task<JArray> GetObjectProxy(int objectId, CancellationToken token)
command = CmdVM.InvokeMethod,
buffer = data,
valtype = attr["set"]["valtype"],
length = length
length,
id = GetNewId()
});
}
continue;
Expand All @@ -2655,7 +2658,8 @@ public async Task<JArray> GetObjectProxy(int objectId, CancellationToken token)
commandSet = CommandSet.Vm,
command = CmdVM.InvokeMethod,
buffer = data,
length = length
length = length,
id = GetNewId()
}),
name = propertyNameStr
}));
Expand Down
21 changes: 13 additions & 8 deletions src/mono/wasm/runtime/debug.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ import { toBase64StringImpl } from "./base64";
import cwraps from "./cwraps";
import { VoidPtr, CharPtr } from "./types/emscripten";

let commands_received: CommandResponse;
const commands_received : any = new Map<number, CommandResponse>();
commands_received.remove = function (key: number) : CommandResponse { const value = this.get(key); this.delete(key); return value;};
let _call_function_res_cache: any = {};
let _next_call_function_res_id = 0;
let _debugger_buffer_len = -1;
Expand Down Expand Up @@ -43,7 +44,9 @@ export function mono_wasm_add_dbg_command_received(res_ok: boolean, id: number,
value: base64String
}
};
commands_received = buffer_obj;
if (commands_received.has(id))
console.warn("Addind an id that already exists in commands_received");
commands_received.set(id, buffer_obj);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Check if there is an existing entry for id.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And if there is, should I print a warning?

}

function mono_wasm_malloc_and_set_debug_buffer(command_parameters: string) {
Expand All @@ -63,7 +66,7 @@ export function mono_wasm_send_dbg_command_with_parms(id: number, command_set: n
mono_wasm_malloc_and_set_debug_buffer(command_parameters);
cwraps.mono_wasm_send_dbg_command_with_parms(id, command_set, command, _debugger_buffer, length, valtype, newvalue.toString());

const { res_ok, res } = commands_received;
const { res_ok, res } = commands_received.remove(id);
if (!res_ok)
throw new Error("Failed on mono_wasm_invoke_method_debugger_agent_with_parms");
return res;
Expand All @@ -73,15 +76,17 @@ export function mono_wasm_send_dbg_command(id: number, command_set: number, comm
mono_wasm_malloc_and_set_debug_buffer(command_parameters);
cwraps.mono_wasm_send_dbg_command(id, command_set, command, _debugger_buffer, command_parameters.length);

const { res_ok, res } = commands_received;
const { res_ok, res } = commands_received.remove(id);

if (!res_ok)
throw new Error("Failed on mono_wasm_send_dbg_command");
return res;

}

export function mono_wasm_get_dbg_command_info(): CommandResponseResult {
const { res_ok, res } = commands_received;
const { res_ok, res } = commands_received.remove(0);

if (!res_ok)
throw new Error("Failed on mono_wasm_get_dbg_command_info");
return res;
Expand Down Expand Up @@ -134,10 +139,10 @@ function _create_proxy_from_object_id(objectId: string, details: any) {
prop.name,
{
get() {
return mono_wasm_send_dbg_command(-1, prop.get.commandSet, prop.get.command, prop.get.buffer);
return mono_wasm_send_dbg_command(prop.get.id, prop.get.commandSet, prop.get.command, prop.get.buffer);
},
set: function (newValue) {
mono_wasm_send_dbg_command_with_parms(-1, prop.set.commandSet, prop.set.command, prop.set.buffer, prop.set.length, prop.set.valtype, newValue); return commands_received.res_ok;
mono_wasm_send_dbg_command_with_parms(prop.set.id, prop.set.commandSet, prop.set.command, prop.set.buffer, prop.set.length, prop.set.valtype, newValue); return true;
}
}
);
Expand All @@ -149,7 +154,7 @@ function _create_proxy_from_object_id(objectId: string, details: any) {
return prop.value;
},
set: function (newValue) {
mono_wasm_send_dbg_command_with_parms(-1, prop.set.commandSet, prop.set.command, prop.set.buffer, prop.set.length, prop.set.valtype, newValue); return commands_received.res_ok;
mono_wasm_send_dbg_command_with_parms(prop.set.id, prop.set.commandSet, prop.set.command, prop.set.buffer, prop.set.length, prop.set.valtype, newValue); return true;
}
}
);
Expand Down