This is the mail archive of the
gdb@sources.redhat.com
mailing list for the GDB project.
Re: SIG32/SIGTRAP issues
- From: Daniel Jacobowitz <drow at mvista dot com>
- To: Paul Mundt <paul dot mundt at timesys dot com>
- Cc: gdb at sources dot redhat dot com
- Date: Tue, 3 Dec 2002 18:24:57 -0500
- Subject: Re: SIG32/SIGTRAP issues
- References: <1038959780.11721.54.camel@Origin>
On Tue, Dec 03, 2002 at 06:56:20PM -0500, Paul Mundt wrote:
> Hi,
>
> I seem to be running into a bit of an odd problem. When I have a
> threaded application thats shared, everything works fine .. in the event
> that the application is statically linked however, gdb gets a SIG32 at
> pthread_create() time and doesn't track the threads properly.
Funny, no one reports this for months and this is the third report I've
seen in a week... At the bottom of this message is a workaround. I'm
not proposing it be committed, since it's obviously pretty gross. The
real issue is the concept of thread_stratum and core_stratum as
separate from process_stratum. I don't think it's appropriate - if we
are debugging a core and process at the same time this isn't how it
should work. This ties in to all the make-targets-a-real-stack thing -
I'm not entirely convinced on that score either.
--
Daniel Jacobowitz
MontaVista Software Debian GNU/Linux Developer
Not yet submitted upstream. This requires some serious thinking about.
If the target stack worked in any logical way, this wouldn't be necessary...
ending up with roughly:
thread_stratum: thread-db (silent reference to lin-lwp)
core_stratum: corelow
exec_stratum: exec
dummy_stratum: dummy
just makes no sense.
This patch fixes debugging threaded applications which are statically linked
without breaking debugging threaded core files. It also fixes the PIDs in
generate-core-file'd corefiles. Mostly.
diff -x '*~' -ur o/gdb-5.2.debian90.cvs20021120/gdb/corelow.c gdb-5.2.debian90.cvs20021120/gdb/corelow.c
--- o/gdb-5.2.debian90.cvs20021120/gdb/corelow.c 2002-09-18 13:23:15.000000000 -0400
+++ gdb-5.2.debian90.cvs20021120/gdb/corelow.c 2002-12-03 14:03:32.000000000 -0500
@@ -350,7 +350,7 @@
bfd_map_over_sections (core_bfd, add_to_thread_list,
bfd_get_section_by_name (core_bfd, ".reg"));
- if (ontop)
+ if (ontop || 1)
{
/* Fetch all registers from core file. */
target_fetch_registers (-1);
diff -x '*~' -ur o/gdb-5.2.debian90.cvs20021120/gdb/linux-proc.c gdb-5.2.debian90.cvs20021120/gdb/linux-proc.c
--- o/gdb-5.2.debian90.cvs20021120/gdb/linux-proc.c 2002-12-03 14:13:52.000000000 -0500
+++ gdb-5.2.debian90.cvs20021120/gdb/linux-proc.c 2002-12-03 13:56:34.000000000 -0500
@@ -177,7 +177,7 @@
#ifdef FILL_FPXREGSET
gdb_fpxregset_t fpxregs;
#endif
- unsigned long merged_pid = ptid_get_tid (ptid) << 16 | ptid_get_pid (ptid);
+ unsigned long merged_pid = ptid_get_tid (ptid) << 16; /* | ptid_get_pid (ptid); */
fill_gregset (&gregs, -1);
note_data = (char *) elfcore_write_prstatus (obfd,
diff -x '*~' -ur o/gdb-5.2.debian90.cvs20021120/gdb/target.c gdb-5.2.debian90.cvs20021120/gdb/target.c
--- o/gdb-5.2.debian90.cvs20021120/gdb/target.c 2002-09-18 13:23:22.000000000 -0400
+++ gdb-5.2.debian90.cvs20021120/gdb/target.c 2002-12-03 14:06:07.000000000 -0500
@@ -1589,6 +1589,7 @@
dummy_target.to_find_memory_regions = dummy_find_memory_regions;
dummy_target.to_make_corefile_notes = dummy_make_corefile_notes;
dummy_target.to_magic = OPS_MAGIC;
+ cleanup_target (&dummy_target);
}
diff -x '*~' -ur o/gdb-5.2.debian90.cvs20021120/gdb/thread-db.c gdb-5.2.debian90.cvs20021120/gdb/thread-db.c
--- o/gdb-5.2.debian90.cvs20021120/gdb/thread-db.c 2002-12-03 14:13:50.000000000 -0500
+++ gdb-5.2.debian90.cvs20021120/gdb/thread-db.c 2002-12-03 13:39:54.000000000 -0500
@@ -57,6 +57,31 @@
/* Non-zero if we're using this module's target vector. */
static int using_thread_db;
+/* Macros to pass an event to the next target if we should not be handling it
+ here in the thread_stratum. */
+#define FIND_NEXT_TARGET(METHOD_NAME) \
+ struct target_ops *next_target = &thread_db_ops; \
+ while (1) \
+ { \
+ next_target = find_target_beneath (next_target); \
+ if (next_target->METHOD_NAME != NULL) \
+ break; \
+ }
+
+#define MAYBE_HAND_DOWN(METHOD_NAME,ARGS) \
+ if (proc_handle.pid == 0) \
+ { \
+ FIND_NEXT_TARGET (METHOD_NAME); \
+ (*next_target->METHOD_NAME) ARGS; \
+ return; \
+ }
+#define MAYBE_HAND_DOWN_RETURN(METHOD_NAME,ARGS) \
+ if (proc_handle.pid == 0) \
+ { \
+ FIND_NEXT_TARGET (METHOD_NAME); \
+ return (*next_target->METHOD_NAME) ARGS; \
+ }
+
/* Non-zero if we have to keep this module's target vector active
across re-runs. */
static int keep_thread_db;
@@ -489,9 +514,7 @@
{
td_err_e err;
- /* Don't attempt to use thread_db on targets which can not run
- (core files). */
- if (objfile == NULL || !target_has_execution)
+ if (objfile == NULL)
{
/* All symbols have been discarded. If the thread_db target is
active, deactivate it now. */
@@ -515,7 +538,10 @@
/* Initialize the structure that identifies the child process. Note
that at this point there is no guarantee that we actually have a
child process. */
- proc_handle.pid = GET_PID (inferior_ptid);
+ if (target_has_execution)
+ proc_handle.pid = GET_PID (inferior_ptid);
+ else
+ proc_handle.pid = 0;
/* Now attempt to open a connection to the thread library. */
err = td_ta_new_p (&proc_handle, &thread_agent);
@@ -758,6 +784,9 @@
struct cleanup *old_chain = save_inferior_ptid ();
int xfer;
+ MAYBE_HAND_DOWN_RETURN (to_xfer_memory, (memaddr, myaddr, len, write,
+ attrib, target));
+
if (is_thread (inferior_ptid))
{
/* FIXME: This seems to be necessary to make sure breakpoints
@@ -782,6 +811,8 @@
gdb_prfpregset_t fpregset;
td_err_e err;
+ MAYBE_HAND_DOWN (to_fetch_registers, (regno));
+
if (!is_thread (inferior_ptid))
{
/* Pass the request to the target beneath us. */
@@ -819,6 +850,8 @@
gdb_prfpregset_t fpregset;
td_err_e err;
+ MAYBE_HAND_DOWN (to_store_registers, (regno));
+
if (!is_thread (inferior_ptid))
{
/* Pass the request to the target beneath us. */
@@ -908,6 +941,8 @@
td_thrinfo_t ti;
td_err_e err;
+ MAYBE_HAND_DOWN_RETURN (to_thread_alive, (ptid));
+
if (is_thread (ptid))
{
err = td_ta_map_id2thr_p (thread_agent, GET_THREAD (ptid), &th);
@@ -961,6 +996,8 @@
{
td_err_e err;
+ MAYBE_HAND_DOWN (to_find_new_threads, ());
+
/* Iterate over all user-space threads to discover new threads. */
err = td_ta_thr_iter_p (thread_agent, find_new_threads_callback, NULL,
TD_THR_ANY_STATE, TD_THR_LOWEST_PRIORITY,
@@ -972,6 +1009,8 @@
static char *
thread_db_pid_to_str (ptid_t ptid)
{
+ MAYBE_HAND_DOWN_RETURN (to_pid_to_str, (ptid));
+
if (is_thread (ptid))
{
static char buf[64];