SendResponse(id, resp, token);
return true;
}
+ try
+ {
+ string bpid = resp.Value["breakpointId"]?.ToString();
+ IEnumerable<object> locations = resp.Value["locations"]?.Values<object>();
+ var request = BreakpointRequest.Parse(bpid, args);
- string bpid = resp.Value["breakpointId"]?.ToString();
- IEnumerable<object> locations = resp.Value["locations"]?.Values<object>();
- var request = BreakpointRequest.Parse(bpid, args);
+ // is the store done loading?
+ bool loaded = context.Source.Task.IsCompleted;
+ if (!loaded)
+ {
+ // Send and empty response immediately if not
+ // and register the breakpoint for resolution
+ context.BreakpointRequests[bpid] = request;
+ SendResponse(id, resp, token);
+ }
- // is the store done loading?
- bool loaded = context.Source.Task.IsCompleted;
- if (!loaded)
- {
- // Send and empty response immediately if not
- // and register the breakpoint for resolution
- context.BreakpointRequests[bpid] = request;
- SendResponse(id, resp, token);
- }
+ if (await IsRuntimeAlreadyReadyAlready(id, token))
+ {
+ DebugStore store = await RuntimeReady(id, token);
- if (await IsRuntimeAlreadyReadyAlready(id, token))
- {
- DebugStore store = await RuntimeReady(id, token);
+ Log("verbose", $"BP req {args}");
+ await SetBreakpoint(id, store, request, !loaded, false, token);
+ }
- Log("verbose", $"BP req {args}");
- await SetBreakpoint(id, store, request, !loaded, false, token);
- }
+ if (loaded)
+ {
+ // we were already loaded so we should send a response
+ // with the locations included and register the request
+ context.BreakpointRequests[bpid] = request;
+ var result = Result.OkFromObject(request.AsSetBreakpointByUrlResponse(locations));
+ SendResponse(id, result, token);
- if (loaded)
+ }
+ }
+ catch (Exception e)
{
- // we were already loaded so we should send a response
- // with the locations included and register the request
- context.BreakpointRequests[bpid] = request;
- var result = Result.OkFromObject(request.AsSetBreakpointByUrlResponse(locations));
- SendResponse(id, result, token);
-
+ logger.LogDebug($"Debugger.setBreakpointByUrl - {args} - failed with exception: {e}");
+ SendResponse(id, Result.Err($"Debugger.setBreakpointByUrl - {args} - failed with exception: {e}"), token);
}
return true;
}
var assembly_id = await context.SdbAgent.GetAssemblyId(asm_name, token);
var methodId = await context.SdbAgent.GetMethodIdByToken(assembly_id, method_token, token);
- var breakpoint_id = await context.SdbAgent.SetBreakpoint(methodId, il_offset, token);
+ //the breakpoint can be invalid because a race condition between the changes already applied on runtime and not applied yet on debugger side
+ var breakpoint_id = await context.SdbAgent.SetBreakpointNoThrow(methodId, il_offset, token);
if (breakpoint_id > 0)
{
if (!ret)
return false;
- var breakpointId = await context.SdbAgent.SetBreakpoint(scope.Method.DebugId, ilOffset.Offset, token);
+ var breakpointId = await context.SdbAgent.SetBreakpointNoThrow(scope.Method.DebugId, ilOffset.Offset, token);
+ if (breakpointId == -1)
+ return false;
+
context.TempBreakpointForSetNextIP = breakpointId;
await SendResume(sessionId, token);
return true;
return parameters;
}
- public async Task<int> SetBreakpoint(int methodId, long il_offset, CancellationToken token)
+ public async Task<int> SetBreakpointNoThrow(int methodId, long il_offset, CancellationToken token)
{
using var commandParamsWriter = new MonoBinaryWriter();
commandParamsWriter.Write((byte)EventKind.Breakpoint);
commandParamsWriter.Write((byte)ModifierKind.LocationOnly);
commandParamsWriter.Write(methodId);
commandParamsWriter.Write(il_offset);
- using var retDebuggerCmdReader = await SendDebuggerAgentCommand(CmdEventRequest.Set, commandParamsWriter, token);
+ using var retDebuggerCmdReader = await SendDebuggerAgentCommand(CmdEventRequest.Set, commandParamsWriter, token, throwOnError: false);
+ if (retDebuggerCmdReader.HasError)
+ return -1;
return retDebuggerCmdReader.ReadInt32();
}