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
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 ();
gdb_assert (fork_kind == TARGET_WAITKIND_FORKED
|| 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
= detach_fork ? inferior_thread () : nullptr;
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
@ -727,6 +739,8 @@ set_last_target_status_stopped (thread_info *tp)
static bool
follow_fork ()
{
INFRUN_SCOPED_DEBUG_ENTER_EXIT;
bool follow_child = (follow_fork_mode_string == follow_fork_mode_child);
bool should_resume = true;
@ -996,6 +1010,8 @@ proceed_after_vfork_done (thread_info *thread)
static void
handle_vfork_child_exec_or_exit (int exec)
{
INFRUN_SCOPED_DEBUG_ENTER_EXIT;
struct inferior *inf = current_inferior ();
if (inf->vfork_parent)
@ -1127,6 +1143,8 @@ handle_vfork_child_exec_or_exit (int exec)
static void
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
set, that is if we are waiting for a vfork child not under our control
(because we detached it) to exec or exit.
@ -1142,8 +1160,6 @@ handle_vfork_done (thread_info *event_thread)
return;
}
INFRUN_SCOPED_DEBUG_ENTER_EXIT;
/* 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
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 ();
infrun_debug_printf ("cur_thr = %s", cur_thr->ptid.to_string ().c_str ());
/* Fill in with reasonable starting values. */
init_thread_stepping_state (cur_thr);
@ -3463,8 +3481,10 @@ proceed (CORE_ADDR addr, enum gdb_signal siggnal)
if (!cur_thr->control.in_infcall)
set_running (resume_target, resume_ptid, true);
infrun_debug_printf ("addr=%s, signal=%s", paddress (gdbarch, addr),
gdb_signal_to_symbol_string (siggnal));
infrun_debug_printf ("addr=%s, signal=%s, resume_ptid=%s",
paddress (gdbarch, addr),
gdb_signal_to_symbol_string (siggnal),
resume_ptid.to_string ().c_str ());
annotate_starting ();

View file

@ -1293,6 +1293,11 @@ get_detach_signal (struct lwp_info *lp)
static void
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 signo;
@ -1363,6 +1368,10 @@ detach_one_lwp (struct lwp_info *lp, int *signo_p)
else
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
lwp is zombie. If that happens, ignore the error. We'll handle
it below, when detach fails with ESRCH. */
@ -1395,6 +1404,8 @@ detach_callback (struct lwp_info *lp)
void
linux_nat_target::detach (inferior *inf, int from_tty)
{
LINUX_NAT_SCOPED_DEBUG_ENTER_EXIT;
struct lwp_info *main_lwp;
int pid = inf->pid;
@ -3122,13 +3133,13 @@ static ptid_t
linux_nat_wait_1 (ptid_t ptid, struct target_waitstatus *ourstatus,
target_wait_flags target_options)
{
LINUX_NAT_SCOPED_DEBUG_ENTER_EXIT;
sigset_t prev_mask;
enum resume_kind last_resume_kind;
struct lwp_info *lp;
int status;
linux_nat_debug_printf ("enter");
/* 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
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)
{
linux_nat_debug_printf ("exit (ignore)");
linux_nat_debug_printf ("no interesting events found");
ourstatus->set_ignore ();
restore_child_signals_mask (&prev_mask);
@ -3314,7 +3325,7 @@ linux_nat_wait_1 (ptid_t ptid, struct target_waitstatus *ourstatus,
else
*ourstatus = host_status_to_waitstatus (status);
linux_nat_debug_printf ("exit");
linux_nat_debug_printf ("event found");
restore_child_signals_mask (&prev_mask);
@ -3410,6 +3421,8 @@ ptid_t
linux_nat_target::wait (ptid_t ptid, struct target_waitstatus *ourstatus,
target_wait_flags target_options)
{
LINUX_NAT_SCOPED_DEBUG_ENTER_EXIT;
ptid_t event_ptid;
linux_nat_debug_printf ("[%s], [%s]", ptid.to_string ().c_str (),
@ -3589,6 +3602,8 @@ linux_nat_target::kill ()
void
linux_nat_target::mourn_inferior ()
{
LINUX_NAT_SCOPED_DEBUG_ENTER_EXIT;
int pid = inferior_ptid.pid ();
purge_lwp_list (pid);