Multithreaded debugging: strange thread switches

Vladimir Prus
2006-01-23T15:20:47Z

Hello,
I'm observing strange behaviour when debugging with gdb using a custom stub.
I have two threads. After connecting, I say "next" several times and that
steps in thread 1. Then I say "thread 2" and "next". Gdb then stops again in
thread 1, not in thread 2 as I'd expected.

In the remote protocol I see "Hc1" packet after last "next" though I'd expect
"Hc2", and in infrun.c, function prepare_to_proceed, I see this:

if (!ptid_equal (wait_ptid, minus_one_ptid)
&& !ptid_equal (inferior_ptid, wait_ptid))
{
/* Switched over from WAIT_PID. */
CORE_ADDR wait_pc = read_pc_pid (wait_ptid);

if (wait_pc != read_pc ())
{
/* Switch back to WAIT_PID thread. */
inferior_ptid = wait_ptid;

/* FIXME: This stuff came from switch_to_thread() in
thread.c (which should probably be a public function). */
flush_cached_frames ();
registers_changed ();
stop_pc = wait_pc;
select_frame (get_current_frame ());
}

Can somebody explain the reason for this explicit switch back to "wait_ptid"?

Thanks,
Volodya