GP-2177: schema fix for missing registers

GP-2177(SQRB): fire threadCreated
GP-2177_SQRB: spare the VM on E_NOINTERFACE
GP-2177_SQRB: check id plus pid/tid
GP-2177_SQRB: init for dbgmodel RegisterBanks plus bandaid for recorder
GP-2177_SQRB: filter nulls from traceToTarget
GP-2177: extraneous cleanup
GP-2177: clear bpts on process death
GP-2968: fixes from review
GP-2177: not directly related, but...
GP-2177: CACHE needs to be cleared and must follow actual native delete
GP-2177: first pass at bpt errors
This commit is contained in:
d-millar 2023-01-23 15:46:11 -05:00
parent ba0b42dc82
commit dee3de5672
19 changed files with 171 additions and 57 deletions

View file

@ -52,6 +52,8 @@ public class DebuggerPlaceBreakpointDialog extends DialogComponentProvider {
private JTextField fieldLength;
private JComboBox<String> fieldKinds;
private JTextField fieldName;
private PluginTool tool;
private String statusText = null;
public DebuggerPlaceBreakpointDialog() {
super(AbstractSetBreakpointAction.NAME, true, true, true, false);
@ -150,10 +152,12 @@ public class DebuggerPlaceBreakpointDialog extends DialogComponentProvider {
this.fieldLength.setText(Long.toUnsignedString(length));
this.fieldKinds.setSelectedItem(TraceBreakpointKindSet.encode(kinds));
this.fieldName.setText("");
this.tool = tool;
validateAddress();
setTitle(title);
statusText = null;
tool.showDialog(this);
}
@ -181,13 +185,20 @@ public class DebuggerPlaceBreakpointDialog extends DialogComponentProvider {
name = fieldName.getText();
ProgramLocation loc = new ProgramLocation(program, address);
service.placeBreakpointAt(loc, length, kinds, name).thenAccept(__ -> {
close();
}).exceptionally(ex -> {
service.placeBreakpointAt(loc, length, kinds, name).exceptionally(ex -> {
ex = AsyncUtils.unwrapThrowable(ex);
setStatusText(ex.getMessage(), MessageType.ERROR, true);
statusText = ex.getMessage(); // will be set when dialog is shown later
tool.showDialog(this);
return null;
});
close();
}
@Override
protected void dialogShown() {
if (statusText != null) {
setStatusText(statusText, MessageType.ERROR, true);
}
}
/* testing */

View file

@ -164,15 +164,17 @@ public class DefaultThreadRecorder implements ManagedThreadRecorder {
if (regMapper == null) {
throw new IllegalStateException("Have not found register descriptions for " + thread);
}
if (!regMapper.getRegistersOnTarget().containsAll(registers)) {
throw new IllegalArgumentException(
"All given registers must be recognized by the target");
List<TargetRegister> tRegs = registers.stream()
.map(regMapper::traceToTarget)
.filter(Objects::nonNull)
.collect(Collectors.toList());
if (tRegs.size() < registers.size()) {
Msg.warn(this,
"All requested registers must be recognized by the model as registers");
}
if (registers.isEmpty()) {
return CompletableFuture.completedFuture(Map.of());
}
List<TargetRegister> tRegs =
registers.stream().map(regMapper::traceToTarget).collect(Collectors.toList());
Set<TargetRegisterBank> banks = getTargetRegisterBank(thread, frameLevel);
if (banks == null) {