Filing this so I don't forget it.
interp_exec has this:
interp_exec (struct interp *interp, const char *command_str)
struct gdb_exception ex;
struct interp *save_command_interp;
gdb_assert (interp->procs->exec_proc != NULL);
/* See `command_interp' for why we do this. */
save_command_interp = command_interpreter;
command_interpreter = interp;
ex = interp->procs->exec_proc (interp->data, command_str);
command_interpreter = save_command_interp;
so it's assuming interp->procs->exec_proc won't throw an exception.
But MI's version calls bpstat_do_actions outside of any TRY/CATCH.
I don't see any guarantees that bpstat_do_actions won't throw an exception.
This is fixed now:
= make_scoped_restore (&ui_interp->command_interpreter, interp);