From: Pedro Alves <pedro@codesourcery.com>
To: gdb-patches@sourceware.org, Eli Zaretskii <eliz@gnu.org>
Subject: Re: [RFC] 09/10 Add "continue --all"
Date: Fri, 09 May 2008 02:35:00 -0000 [thread overview]
Message-ID: <200805090236.09903.pedro@codesourcery.com> (raw)
In-Reply-To: <u1w4dnhs4.fsf@gnu.org>
[-- Attachment #1: Type: text/plain, Size: 1158 bytes --]
A Thursday 08 May 2008 12:42:51, Eli Zaretskii wrote:
> > From: Pedro Alves <pedro@codesourcery.com>
> > Date: Tue, 6 May 2008 16:49:50 +0100
> >
> > + if (args != NULL)
> > + {
> > + if (strncmp (args, "--all", 5) == 0)
>
> Can we please void literal constants like 5 here? sizeof should be
>
> our friend, and you actually use it 3 lines below this:
> > + {
> > + all_threads = 1;
> > + args += sizeof ("--all") - 1;
> > + if (*args == '\0')
> > + args = NULL;
> > + }
Oooops!
And after a bit, it hit me that we use /opt most everywhere
else, so "continue /a" makes more sense?
(gdb) help continue
Continue program being debugged, after signal or breakpoint.
If proceeding from breakpoint, a number N may be used as an argument,
which means to set the ignore count of that breakpoint to N - 1 (so that
the breakpoint won't break until the Nth time it is reached).
If non-stop mode is enabled, continue only the current thread,
otherwise all the threads in the program are continued. To
continue all stopped threads in non-stop mode, use the /a option.
Specifying /a and an ignore count simultaneously is an error.
--
Pedro Alves
[-- Attachment #2: 009-continue_all.diff --]
[-- Type: text/x-diff, Size: 4337 bytes --]
2008-05-09 Pedro Alves <pedro@codesourcery.com>
Add "continue /a" option for non-stop mode.
* infcmd.c (proceed_thread_callback, do_context_switch_to): New.
(continue_command): Add "/a" option.
---
gdb/infcmd.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++---------
1 file changed, 69 insertions(+), 11 deletions(-)
Index: src/gdb/infcmd.c
===================================================================
--- src.orig/gdb/infcmd.c 2008-05-08 14:23:26.000000000 +0100
+++ src/gdb/infcmd.c 2008-05-08 18:34:53.000000000 +0100
@@ -607,16 +607,36 @@ start_command (char *args, int from_tty)
run_command_1 (args, from_tty, 1);
}
+static int
+proceed_thread_callback (struct thread_info *thread, void *arg)
+{
+ if (is_running (thread->ptid))
+ return 0;
+
+ context_switch_to (thread->ptid);
+ clear_proceed_status ();
+ proceed ((CORE_ADDR) -1, TARGET_SIGNAL_DEFAULT, 0);
+ return 0;
+}
+
+static void
+do_context_switch_to (void *arg)
+{
+ ptid_t *ptid = arg;
+ context_switch_to (*ptid);
+}
+
+/* continue [/a] [proceed-count] [&] */
void
-continue_command (char *proc_count_exp, int from_tty)
+continue_command (char *args, int from_tty)
{
int async_exec = 0;
+ int all_threads = 0;
ERROR_NO_INFERIOR;
- ensure_not_running ();
/* Find out whether we must run in the background. */
- if (proc_count_exp != NULL)
- async_exec = strip_bg_char (&proc_count_exp);
+ if (args != NULL)
+ async_exec = strip_bg_char (&args);
/* If we must run in the background, but the target can't do it,
error out. */
@@ -631,9 +651,27 @@ continue_command (char *proc_count_exp,
async_disable_stdin ();
}
- /* If have argument (besides '&'), set proceed count of breakpoint
- we stopped at. */
- if (proc_count_exp != NULL)
+ if (args != NULL)
+ {
+ if (strncmp (args, "/a", sizeof ("/a") - 1) == 0)
+ {
+ all_threads = 1;
+ args += sizeof ("/a") - 1;
+ if (*args == '\0')
+ args = NULL;
+ }
+ }
+
+ if (!non_stop && all_threads)
+ error (_("/a is meaningless in all-stop mode."));
+
+ if (args != NULL && all_threads)
+ error (_("\
+Can't resume all threads and specify proceed count simultaneously."));
+
+ /* If we have an argument left, set proceed count of breakpoint we
+ stopped at. */
+ if (args != NULL)
{
bpstat bs = stop_bpstat;
int num, stat;
@@ -643,7 +681,7 @@ continue_command (char *proc_count_exp,
if (stat > 0)
{
set_ignore_count (num,
- parse_and_eval_long (proc_count_exp) - 1,
+ parse_and_eval_long (args) - 1,
from_tty);
/* set_ignore_count prints a message ending with a period.
So print two spaces before "Continuing.". */
@@ -662,9 +700,24 @@ continue_command (char *proc_count_exp,
if (from_tty)
printf_filtered (_("Continuing.\n"));
- clear_proceed_status ();
+ if (non_stop && all_threads)
+ {
+ /* Don't error out current thread is running, because there may
+ be other stopped threads. */
- proceed ((CORE_ADDR) -1, TARGET_SIGNAL_DEFAULT, 0);
+ ptid_t current_ptid = inferior_ptid;
+ struct cleanup *old_chain
+ = make_cleanup (do_context_switch_to, ¤t_ptid);
+ iterate_over_threads (proceed_thread_callback, NULL);
+ /* Restore selected ptid. */
+ do_cleanups (old_chain);
+ }
+ else
+ {
+ ensure_not_running ();
+ clear_proceed_status ();
+ proceed ((CORE_ADDR) -1, TARGET_SIGNAL_DEFAULT, 0);
+ }
}
\f
/* Step until outside of current statement. */
@@ -2332,7 +2385,12 @@ This command is a combination of tbreak
Continue program being debugged, after signal or breakpoint.\n\
If proceeding from breakpoint, a number N may be used as an argument,\n\
which means to set the ignore count of that breakpoint to N - 1 (so that\n\
-the breakpoint won't break until the Nth time it is reached)."));
+the breakpoint won't break until the Nth time it is reached).\n\
+\n\
+If non-stop mode is enabled, continue only the current thread,\n\
+otherwise all the threads in the program are continued. To \n\
+continue all stopped threads in non-stop mode, use the /a option.\n\
+Specifying /a and an ignore count simultaneously is an error."));
add_com_alias ("c", "cont", class_run, 1);
add_com_alias ("fg", "cont", class_run, 1);
next prev parent reply other threads:[~2008-05-09 1:36 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-05-06 18:12 Pedro Alves
2008-05-07 11:58 ` Pierre Muller
2008-05-07 19:36 ` Pedro Alves
2008-05-08 18:29 ` Eli Zaretskii
2008-05-09 2:35 ` Pedro Alves [this message]
2008-05-09 3:08 ` Daniel Jacobowitz
2008-05-09 3:54 ` Pedro Alves
2008-05-09 17:07 ` Pedro Alves
2008-05-09 19:08 ` Daniel Jacobowitz
2008-05-09 19:20 ` Andrew STUBBS
2008-05-11 20:34 ` Joel Brobecker
2008-05-19 17:07 ` Pedro Alves
2008-05-19 21:29 ` Michael Snyder
2008-05-19 21:55 ` Daniel Jacobowitz
2008-05-19 22:46 ` Andreas Schwab
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200805090236.09903.pedro@codesourcery.com \
--to=pedro@codesourcery.com \
--cc=eliz@gnu.org \
--cc=gdb-patches@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox