inferior *inf = current_inferior ();
process_stratum_target *proc_target = inf->process_target ();
+ scoped_restore save_starting_up
+ = make_scoped_restore (&inf->starting_up, true);
+
ptid_t ptid = startup_inferior (proc_target, pid, num_traps, NULL, NULL);
/* Mark all threads non-executing. */
architecture/description. */
bool needs_setup = false;
+ /* True if the inferior is starting up (inside startup_inferior),
+ and we're nursing it along (through the shell) until it is ready
+ to execute its first instruction. Until that is done, we must
+ not access inferior memory or registers, as we haven't determined
+ the target architecture/description. */
+ bool starting_up = false;
+
/* True when we are reading the library list of the inferior during an
attach or handling a fork child. */
bool in_initial_library_scan = false;
if (!linux_target->low_status_is_event (lp->status))
return;
+ inferior *inf = find_inferior_ptid (linux_target, lp->ptid);
+ if (inf->starting_up)
+ return;
+
regcache = get_thread_regcache (linux_target, lp->ptid);
gdbarch = regcache->arch ();
#include "server.h"
#include "gdbsupport/job-control.h"
+#include "gdbsupport/scoped_restore.h"
#include "nat/fork-inferior.h"
#ifdef HAVE_SIGNAL_H
#include <signal.h>
atexit (restore_old_foreground_pgrp);
#endif
+ process_info *proc = find_process_pid (pid);
+ scoped_restore save_starting_up
+ = make_scoped_restore (&proc->starting_up, true);
+
startup_inferior (the_target, pid,
START_INFERIOR_TRAPS_EXPECTED,
&cs.last_status, &cs.last_ptid);
/* Flag to mark that the DLL list has changed. */
bool dlls_changed = false;
+
+ /* True if the inferior is starting up (inside startup_inferior),
+ and we're nursing it along (through the shell) until it is ready
+ to execute its first instruction. Until that is done, we must
+ not access inferior memory or registers, as we haven't determined
+ the target architecture/description. */
+ bool starting_up = false;
};
/* Get the pid of PROC. */
CORE_ADDR
linux_process_target::get_pc (lwp_info *lwp)
{
- struct regcache *regcache;
- CORE_ADDR pc;
+ process_info *proc = get_thread_process (get_lwp_thread (lwp));
+ gdb_assert (!proc->starting_up);
if (!low_supports_breakpoints ())
return 0;
scoped_restore_current_thread restore_thread;
switch_to_thread (get_lwp_thread (lwp));
- regcache = get_thread_regcache (current_thread, 1);
- pc = low_get_pc (regcache);
+ struct regcache *regcache = get_thread_regcache (current_thread, 1);
+ CORE_ADDR pc = low_get_pc (regcache);
threads_debug_printf ("pc is 0x%lx", (long) pc);
if (!low_supports_breakpoints ())
return false;
+ process_info *proc = get_thread_process (get_lwp_thread (lwp));
+ if (proc->starting_up)
+ {
+ /* Claim we have the stop PC so that the caller doesn't try to
+ fetch it itself. */
+ return true;
+ }
+
pc = get_pc (lwp);
sw_breakpoint_pc = pc - low_decr_pc_after_break ();