gdb: additional debug output in infrun.c and linux-nat.c

While working on some of the recent patches relating to vfork handling
I found this debug output very helpful, I'd like to propose adding
this into GDB.

With debug turned off there should be no user visible changes after
this commit.
This commit is contained in:
Andrew Burgess
2023-06-18 20:31:48 +01:00
parent d3a2163ee2
commit b26b06dd42
2 changed files with 43 additions and 8 deletions

View File

@ -435,6 +435,11 @@ show_follow_fork_mode_string (struct ui_file *file, int from_tty,
static bool static bool
follow_fork_inferior (bool follow_child, bool detach_fork) follow_fork_inferior (bool follow_child, bool detach_fork)
{ {
INFRUN_SCOPED_DEBUG_ENTER_EXIT;
infrun_debug_printf ("follow_child = %d, detach_fork = %d",
follow_child, detach_fork);
target_waitkind fork_kind = inferior_thread ()->pending_follow.kind (); target_waitkind fork_kind = inferior_thread ()->pending_follow.kind ();
gdb_assert (fork_kind == TARGET_WAITKIND_FORKED gdb_assert (fork_kind == TARGET_WAITKIND_FORKED
|| fork_kind == TARGET_WAITKIND_VFORKED); || fork_kind == TARGET_WAITKIND_VFORKED);
@ -543,6 +548,13 @@ holding the child stopped. Try \"set detach-on-fork\" or \
parent_inf->thread_waiting_for_vfork_done parent_inf->thread_waiting_for_vfork_done
= detach_fork ? inferior_thread () : nullptr; = detach_fork ? inferior_thread () : nullptr;
parent_inf->pspace->breakpoints_not_allowed = detach_fork; parent_inf->pspace->breakpoints_not_allowed = detach_fork;
infrun_debug_printf
("parent_inf->thread_waiting_for_vfork_done == %s",
(parent_inf->thread_waiting_for_vfork_done == nullptr
? "nullptr"
: (parent_inf->thread_waiting_for_vfork_done
->ptid.to_string ().c_str ())));
} }
} }
else else
@ -727,6 +739,8 @@ set_last_target_status_stopped (thread_info *tp)
static bool static bool
follow_fork () follow_fork ()
{ {
INFRUN_SCOPED_DEBUG_ENTER_EXIT;
bool follow_child = (follow_fork_mode_string == follow_fork_mode_child); bool follow_child = (follow_fork_mode_string == follow_fork_mode_child);
bool should_resume = true; bool should_resume = true;
@ -996,6 +1010,8 @@ proceed_after_vfork_done (thread_info *thread)
static void static void
handle_vfork_child_exec_or_exit (int exec) handle_vfork_child_exec_or_exit (int exec)
{ {
INFRUN_SCOPED_DEBUG_ENTER_EXIT;
struct inferior *inf = current_inferior (); struct inferior *inf = current_inferior ();
if (inf->vfork_parent) if (inf->vfork_parent)
@ -1127,6 +1143,8 @@ handle_vfork_child_exec_or_exit (int exec)
static void static void
handle_vfork_done (thread_info *event_thread) handle_vfork_done (thread_info *event_thread)
{ {
INFRUN_SCOPED_DEBUG_ENTER_EXIT;
/* We only care about this event if inferior::thread_waiting_for_vfork_done is /* We only care about this event if inferior::thread_waiting_for_vfork_done is
set, that is if we are waiting for a vfork child not under our control set, that is if we are waiting for a vfork child not under our control
(because we detached it) to exec or exit. (because we detached it) to exec or exit.
@ -1142,8 +1160,6 @@ handle_vfork_done (thread_info *event_thread)
return; return;
} }
INFRUN_SCOPED_DEBUG_ENTER_EXIT;
/* We stopped all threads (other than the vforking thread) of the inferior in /* We stopped all threads (other than the vforking thread) of the inferior in
follow_fork and kept them stopped until now. It should therefore not be follow_fork and kept them stopped until now. It should therefore not be
possible for another thread to have reported a vfork during that window. possible for another thread to have reported a vfork during that window.
@ -3407,6 +3423,8 @@ proceed (CORE_ADDR addr, enum gdb_signal siggnal)
thread_info *cur_thr = inferior_thread (); thread_info *cur_thr = inferior_thread ();
infrun_debug_printf ("cur_thr = %s", cur_thr->ptid.to_string ().c_str ());
/* Fill in with reasonable starting values. */ /* Fill in with reasonable starting values. */
init_thread_stepping_state (cur_thr); init_thread_stepping_state (cur_thr);
@ -3463,8 +3481,10 @@ proceed (CORE_ADDR addr, enum gdb_signal siggnal)
if (!cur_thr->control.in_infcall) if (!cur_thr->control.in_infcall)
set_running (resume_target, resume_ptid, true); set_running (resume_target, resume_ptid, true);
infrun_debug_printf ("addr=%s, signal=%s", paddress (gdbarch, addr), infrun_debug_printf ("addr=%s, signal=%s, resume_ptid=%s",
gdb_signal_to_symbol_string (siggnal)); paddress (gdbarch, addr),
gdb_signal_to_symbol_string (siggnal),
resume_ptid.to_string ().c_str ());
annotate_starting (); annotate_starting ();

View File

@ -1293,6 +1293,11 @@ get_detach_signal (struct lwp_info *lp)
static void static void
detach_one_lwp (struct lwp_info *lp, int *signo_p) detach_one_lwp (struct lwp_info *lp, int *signo_p)
{ {
LINUX_NAT_SCOPED_DEBUG_ENTER_EXIT;
linux_nat_debug_printf ("lwp %s (stopped = %d)",
lp->ptid.to_string ().c_str (), lp->stopped);
int lwpid = lp->ptid.lwp (); int lwpid = lp->ptid.lwp ();
int signo; int signo;
@ -1363,6 +1368,10 @@ detach_one_lwp (struct lwp_info *lp, int *signo_p)
else else
signo = *signo_p; signo = *signo_p;
linux_nat_debug_printf ("preparing to resume lwp %s (stopped = %d)",
lp->ptid.to_string ().c_str (),
lp->stopped);
/* Preparing to resume may try to write registers, and fail if the /* Preparing to resume may try to write registers, and fail if the
lwp is zombie. If that happens, ignore the error. We'll handle lwp is zombie. If that happens, ignore the error. We'll handle
it below, when detach fails with ESRCH. */ it below, when detach fails with ESRCH. */
@ -1395,6 +1404,8 @@ detach_callback (struct lwp_info *lp)
void void
linux_nat_target::detach (inferior *inf, int from_tty) linux_nat_target::detach (inferior *inf, int from_tty)
{ {
LINUX_NAT_SCOPED_DEBUG_ENTER_EXIT;
struct lwp_info *main_lwp; struct lwp_info *main_lwp;
int pid = inf->pid; int pid = inf->pid;
@ -3122,13 +3133,13 @@ static ptid_t
linux_nat_wait_1 (ptid_t ptid, struct target_waitstatus *ourstatus, linux_nat_wait_1 (ptid_t ptid, struct target_waitstatus *ourstatus,
target_wait_flags target_options) target_wait_flags target_options)
{ {
LINUX_NAT_SCOPED_DEBUG_ENTER_EXIT;
sigset_t prev_mask; sigset_t prev_mask;
enum resume_kind last_resume_kind; enum resume_kind last_resume_kind;
struct lwp_info *lp; struct lwp_info *lp;
int status; int status;
linux_nat_debug_printf ("enter");
/* The first time we get here after starting a new inferior, we may /* The first time we get here after starting a new inferior, we may
not have added it to the LWP list yet - this is the earliest not have added it to the LWP list yet - this is the earliest
moment at which we know its PID. */ moment at which we know its PID. */
@ -3228,7 +3239,7 @@ linux_nat_wait_1 (ptid_t ptid, struct target_waitstatus *ourstatus,
if (target_options & TARGET_WNOHANG) if (target_options & TARGET_WNOHANG)
{ {
linux_nat_debug_printf ("exit (ignore)"); linux_nat_debug_printf ("no interesting events found");
ourstatus->set_ignore (); ourstatus->set_ignore ();
restore_child_signals_mask (&prev_mask); restore_child_signals_mask (&prev_mask);
@ -3314,7 +3325,7 @@ linux_nat_wait_1 (ptid_t ptid, struct target_waitstatus *ourstatus,
else else
*ourstatus = host_status_to_waitstatus (status); *ourstatus = host_status_to_waitstatus (status);
linux_nat_debug_printf ("exit"); linux_nat_debug_printf ("event found");
restore_child_signals_mask (&prev_mask); restore_child_signals_mask (&prev_mask);
@ -3410,6 +3421,8 @@ ptid_t
linux_nat_target::wait (ptid_t ptid, struct target_waitstatus *ourstatus, linux_nat_target::wait (ptid_t ptid, struct target_waitstatus *ourstatus,
target_wait_flags target_options) target_wait_flags target_options)
{ {
LINUX_NAT_SCOPED_DEBUG_ENTER_EXIT;
ptid_t event_ptid; ptid_t event_ptid;
linux_nat_debug_printf ("[%s], [%s]", ptid.to_string ().c_str (), linux_nat_debug_printf ("[%s], [%s]", ptid.to_string ().c_str (),
@ -3589,6 +3602,8 @@ linux_nat_target::kill ()
void void
linux_nat_target::mourn_inferior () linux_nat_target::mourn_inferior ()
{ {
LINUX_NAT_SCOPED_DEBUG_ENTER_EXIT;
int pid = inferior_ptid.pid (); int pid = inferior_ptid.pid ();
purge_lwp_list (pid); purge_lwp_list (pid);