Include both application threads and "raw" LWPs in GDB's list of
threads. This is useful for a variety of things, including examing the internal state of the thread library when things are going wrong there. Currently only works on core files; both ptrace and gdb will need a bit more work before this will be useful on live processes. Inspired by the similar behavior of the Solaris thread module.
This commit is contained in:
parent
2b294580b8
commit
99922845b9
62
gnu/dist/toolchain/gdb/nbsd-thread.c
vendored
62
gnu/dist/toolchain/gdb/nbsd-thread.c
vendored
@ -325,8 +325,11 @@ nbsd_thread_fetch_registers (regno)
|
||||
struct reg gregs;
|
||||
struct fpreg fpregs;
|
||||
int val;
|
||||
struct cleanup *old_chain;
|
||||
|
||||
if (nbsd_thread_active)
|
||||
old_chain = save_inferior_pid ();
|
||||
|
||||
if (nbsd_thread_active && IS_THREAD (inferior_pid))
|
||||
{
|
||||
if ((val = td_map_id2thr (main_ta, GET_THREAD (inferior_pid), &thread)) != 0)
|
||||
error ("nbsd_thread_fetch_registers: td_map_id2thr: %s\n",
|
||||
@ -342,11 +345,16 @@ nbsd_thread_fetch_registers (regno)
|
||||
}
|
||||
else
|
||||
{
|
||||
if (nbsd_thread_active)
|
||||
inferior_pid = BUILD_LWP (GET_LWP (inferior_pid),
|
||||
GET_PROCESS (inferior_pid));
|
||||
if (target_has_execution)
|
||||
child_ops.to_fetch_registers (regno);
|
||||
else
|
||||
orig_core_ops.to_fetch_registers (regno);
|
||||
}
|
||||
|
||||
do_cleanups (old_chain);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -357,8 +365,11 @@ nbsd_thread_store_registers (regno)
|
||||
struct reg gregs;
|
||||
struct fpreg fpregs;
|
||||
int val;
|
||||
struct cleanup *old_chain;
|
||||
|
||||
if (nbsd_thread_active)
|
||||
old_chain = save_inferior_pid ();
|
||||
|
||||
if (nbsd_thread_active && IS_THREAD (inferior_pid))
|
||||
{
|
||||
val = td_map_id2thr (main_ta, GET_THREAD (inferior_pid), &thread);
|
||||
if (val != 0)
|
||||
@ -379,11 +390,16 @@ nbsd_thread_store_registers (regno)
|
||||
}
|
||||
else
|
||||
{
|
||||
if (target_has_execution)
|
||||
child_ops.to_store_registers (regno);
|
||||
else
|
||||
orig_core_ops.to_store_registers (regno);
|
||||
if (nbsd_thread_active)
|
||||
inferior_pid = BUILD_LWP (GET_LWP (inferior_pid),
|
||||
GET_PROCESS (inferior_pid));
|
||||
if (target_has_execution)
|
||||
child_ops.to_store_registers (regno);
|
||||
else
|
||||
orig_core_ops.to_store_registers (regno);
|
||||
}
|
||||
|
||||
do_cleanups (old_chain);
|
||||
}
|
||||
|
||||
|
||||
@ -479,7 +495,10 @@ nbsd_pid_to_str (pid)
|
||||
{
|
||||
static char buf[100];
|
||||
|
||||
sprintf (buf, "Thread %d", GET_THREAD (pid));
|
||||
if (IS_THREAD (pid))
|
||||
sprintf (buf, "Thread %d", GET_THREAD (pid));
|
||||
else
|
||||
sprintf (buf, "LWP %d", GET_LWP (pid));
|
||||
|
||||
return buf;
|
||||
}
|
||||
@ -545,25 +564,34 @@ nbsd_thread_alive (pid)
|
||||
{
|
||||
td_thread_t *th;
|
||||
td_thread_info_t ti;
|
||||
int val;
|
||||
int retval;
|
||||
struct cleanup *old_chain;
|
||||
|
||||
if (IS_THREAD (pid))
|
||||
old_chain = save_inferior_pid ();
|
||||
|
||||
if (nbsd_thread_active && IS_THREAD (pid))
|
||||
{
|
||||
retval = 0;
|
||||
if (td_map_id2thr (main_ta, GET_THREAD (pid), &th) == 0)
|
||||
{
|
||||
/* Thread found */
|
||||
if (td_thr_info (th, &ti) == 0)
|
||||
return 1;
|
||||
retval = 1;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (nbsd_thread_active)
|
||||
inferior_pid = BUILD_LWP (GET_LWP (inferior_pid),
|
||||
GET_PROCESS (inferior_pid));
|
||||
if (target_has_execution)
|
||||
return child_ops.to_thread_alive (GET_PROCESS (pid));
|
||||
retval = child_ops.to_thread_alive (GET_PROCESS (pid));
|
||||
else
|
||||
return orig_core_ops.to_thread_alive (GET_PROCESS (pid));
|
||||
retval = orig_core_ops.to_thread_alive (GET_PROCESS (pid));
|
||||
}
|
||||
|
||||
do_cleanups (old_chain);
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
||||
@ -957,7 +985,7 @@ nbsd_add_to_thread_list (abfd, asect, reg_sect_arg)
|
||||
asection *asect;
|
||||
PTR reg_sect_arg;
|
||||
{
|
||||
int thread_id;
|
||||
int regval;
|
||||
td_thread_t *dummy;
|
||||
|
||||
asection *reg_sect = (asection *) reg_sect_arg;
|
||||
@ -965,9 +993,11 @@ nbsd_add_to_thread_list (abfd, asect, reg_sect_arg)
|
||||
if (strncmp (bfd_section_name (abfd, asect), ".reg/", 5) != 0)
|
||||
return;
|
||||
|
||||
thread_id = atoi (bfd_section_name (abfd, asect) + 5);
|
||||
regval = atoi (bfd_section_name (abfd, asect) + 5);
|
||||
|
||||
td_map_lwp2thr (main_ta, thread_id >> 16, &dummy);
|
||||
td_map_lwp2thr (main_ta, regval >> 16, &dummy);
|
||||
|
||||
add_thread (BUILD_LWP(regval >> 16, main_pid));
|
||||
}
|
||||
|
||||
static void
|
||||
|
Loading…
Reference in New Issue
Block a user