[PATCH] libdebugger: Add a target break call to suspend all running threads
Chris Johns
chrisj at rtems.org
Mon Oct 17 20:58:46 UTC 2022
I have fixed the subject line as above in the commit to push :)
Chris
On 18/10/22 7:35 am, chrisj at rtems.org wrote:
> From: Chris Johns <chrisj at rtems.org>
>
> - Optionally wait if there is no remote debugger connected and break
> when the remote connects
>
> Closes #4740
> ---
> .../rtems/debugger/rtems-debugger-server.h | 1 +
> cpukit/include/rtems/rtems-debugger.h | 8 +++
> cpukit/libdebugger/rtems-debugger-server.c | 72 ++++++++++++++-----
> 3 files changed, 65 insertions(+), 16 deletions(-)
>
> diff --git a/cpukit/include/rtems/debugger/rtems-debugger-server.h b/cpukit/include/rtems/debugger/rtems-debugger-server.h
> index 2189aac873..4d0407a951 100644
> --- a/cpukit/include/rtems/debugger/rtems-debugger-server.h
> +++ b/cpukit/include/rtems/debugger/rtems-debugger-server.h
> @@ -103,6 +103,7 @@ extern "C" {
> #define RTEMS_DEBUGGER_FLAG_MULTIPROCESS (1 << 4)
> #define RTEMS_DEBUGGER_FLAG_VERBOSE_LOCK (1 << 5)
> #define RTEMS_DEBUGGER_FLAG_VERBOSE_CMDS (1 << 6)
> +#define RTEMS_DEBUGGER_FLAG_BREAK_WAITER (1 << 7)
>
> /**
> * Forward decl for the threads and targets.
> diff --git a/cpukit/include/rtems/rtems-debugger.h b/cpukit/include/rtems/rtems-debugger.h
> index 1fc8b3d522..7627e83382 100644
> --- a/cpukit/include/rtems/rtems-debugger.h
> +++ b/cpukit/include/rtems/rtems-debugger.h
> @@ -53,6 +53,14 @@ extern int rtems_debugger_start(const char* remote,
> rtems_task_priority priority,
> const rtems_printer* printer);
>
> +/**
> + * Suspend all running threads including the caller if not
> + * excluded. Returns when the debugger has connected and continued.
> + *
> + * If wait is true and there is no remote connected wait then break.
> + */
> +extern int rtems_debugger_break(bool wait);
> +
> /**
> * Stop the Debugger.
> */
> diff --git a/cpukit/libdebugger/rtems-debugger-server.c b/cpukit/libdebugger/rtems-debugger-server.c
> index 9de9421b6b..b7b9727d84 100644
> --- a/cpukit/libdebugger/rtems-debugger-server.c
> +++ b/cpukit/libdebugger/rtems-debugger-server.c
> @@ -1678,18 +1678,30 @@ rtems_debugger_events(rtems_task_argument arg)
>
> rtems_debugger_target_enable();
>
> - while (rtems_debugger_server_events_running()) {
> - rtems_debugger_server_events_wait();
> - if (rtems_debugger_verbose())
> - rtems_debugger_printf("rtems-db: event woken\n");
> - if (!rtems_debugger_server_events_running())
> - break;
> + if (rtems_debugger_server_flag(RTEMS_DEBUGGER_FLAG_BREAK_WAITER)) {
> + rtems_debugger->flags &= ~RTEMS_DEBUGGER_FLAG_BREAK_WAITER;
> r = rtems_debugger_thread_system_suspend();
> - if (r < 0)
> - break;
> - r = remote_stop_reason(NULL, 0);
> - if (r < 0)
> - break;
> + if (rtems_debugger_verbose())
> + rtems_debugger_printf("rtems-db: break waiter\n");
> + rtems_debugger_server_events_signal();
> + if (rtems_debugger_verbose())
> + rtems_debugger_printf("rtems-db: break waiter: signalled\n");
> + }
> +
> + if (r == 0) {
> + while (rtems_debugger_server_events_running()) {
> + rtems_debugger_server_events_wait();
> + if (rtems_debugger_verbose())
> + rtems_debugger_printf("rtems-db: event woken\n");
> + if (!rtems_debugger_server_events_running())
> + break;
> + r = rtems_debugger_thread_system_suspend();
> + if (r < 0)
> + break;
> + r = remote_stop_reason(NULL, 0);
> + if (r < 0)
> + break;
> + }
> }
>
> if (r < 0)
> @@ -1972,6 +1984,30 @@ rtems_debugger_server_crash(void)
> rtems_debugger->remote->end(rtems_debugger->remote);
> }
>
> +int
> +rtems_debugger_break(bool wait)
> +{
> + int r = 0;
> + if (!rtems_debugger_running()) {
> + errno = EIO;
> + r = -1;
> + } else {
> + rtems_debugger_lock();
> + if (rtems_debugger_server_events_running()) {
> + rtems_debugger_server_events_signal();
> + } else if (
> + wait && !rtems_debugger_server_flag(RTEMS_DEBUGGER_FLAG_BREAK_WAITER)) {
> + rtems_debugger->flags |= RTEMS_DEBUGGER_FLAG_BREAK_WAITER;
> + rtems_debugger_server_events_wait();
> + } else {
> + errno = EIO;
> + r = -1;
> + }
> + rtems_debugger_unlock();
> + }
> + return r;
> +}
> +
> int
> rtems_debugger_stop(void)
> {
> @@ -1998,10 +2034,14 @@ rtems_debugger_set_verbose(bool on)
> int
> rtems_debugger_remote_debug(bool state)
> {
> - rtems_debugger_lock();
> - rtems_debugger->remote_debug = state;
> - rtems_debugger_printf("rtems-db: remote-debug is %s\n",
> - rtems_debugger->remote_debug ? "on" : "off");
> - rtems_debugger_unlock();
> + if (rtems_debugger_running()) {
> + rtems_debugger_lock();
> + rtems_debugger->remote_debug = state;
> + rtems_debugger_printf("rtems-db: remote-debug is %s\n",
> + rtems_debugger->remote_debug ? "on" : "off");
> + rtems_debugger_unlock();
> + } else {
> + rtems_debugger_printf("rtems-db: debug server not running\n");
> + }
> return 0;
> }
More information about the devel
mailing list