mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-02-23 13:21:43 +08:00
attach + target always in non-stop mode: stop all threads
When running with "maint set target-non-stop on", and in all-stop mode, nothing is stopping all threads after attaching. vAttach in non-stop can leave all threads running and GDB has to explicitly pause them. This is not visible with the native target, as in that case, attach always stops all threads (the core re-resumes them in case of "attach&"). In addition, it's not defined which thread manages to report the initial attach stop, so always pick the lowest one (otherwise multi-attach.exp regresses). gdb/ChangeLog: 2015-11-30 Pedro Alves <palves@redhat.com> * infcmd.c (attach_post_wait): If the target is always in non-stop mode, and the UI is in all-stop mode, stop all threads and pick the one with lowest number as current.
This commit is contained in:
parent
6efcd9a8b3
commit
066f6b6edc
@ -1,3 +1,9 @@
|
||||
2015-11-30 Pedro Alves <palves@redhat.com>
|
||||
|
||||
* infcmd.c (attach_post_wait): If the target is always in non-stop
|
||||
mode, and the UI is in all-stop mode, stop all threads and pick
|
||||
the one with lowest number as current.
|
||||
|
||||
2015-11-30 Pedro Alves <palves@redhat.com>
|
||||
|
||||
* gdbthread.h (switch_to_thread_no_regs): Declare.
|
||||
|
25
gdb/infcmd.c
25
gdb/infcmd.c
@ -2697,8 +2697,31 @@ attach_post_wait (char *args, int from_tty, enum attach_post_wait_mode mode)
|
||||
selected thread is stopped, others may still be executing.
|
||||
Be sure to explicitly stop all threads of the process. This
|
||||
should have no effect on already stopped threads. */
|
||||
if (target_is_non_stop_p ())
|
||||
if (non_stop)
|
||||
target_stop (pid_to_ptid (inferior->pid));
|
||||
else if (target_is_non_stop_p ())
|
||||
{
|
||||
struct thread_info *thread;
|
||||
struct thread_info *lowest = inferior_thread ();
|
||||
int pid = current_inferior ()->pid;
|
||||
|
||||
stop_all_threads ();
|
||||
|
||||
/* It's not defined which thread will report the attach
|
||||
stop. For consistency, always select the thread with
|
||||
lowest GDB number, which should be the main thread, if it
|
||||
still exists. */
|
||||
ALL_NON_EXITED_THREADS (thread)
|
||||
{
|
||||
if (ptid_get_pid (thread->ptid) == pid)
|
||||
{
|
||||
if (thread->num < lowest->num)
|
||||
lowest = thread;
|
||||
}
|
||||
}
|
||||
|
||||
switch_to_thread (lowest->ptid);
|
||||
}
|
||||
|
||||
/* Tell the user/frontend where we're stopped. */
|
||||
normal_stop ();
|
||||
|
Loading…
Reference in New Issue
Block a user