From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 30858 invoked by alias); 3 Dec 2002 23:24:29 -0000 Mailing-List: contact gdb-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-owner@sources.redhat.com Received: (qmail 30744 invoked from network); 3 Dec 2002 23:24:28 -0000 Received: from unknown (HELO crack.them.org) (65.125.64.184) by sources.redhat.com with SMTP; 3 Dec 2002 23:24:28 -0000 Received: from nevyn.them.org ([66.93.61.169] ident=mail) by crack.them.org with asmtp (Exim 3.12 #1 (Debian)) id 18JOHV-0006GB-00; Tue, 03 Dec 2002 19:24:53 -0600 Received: from drow by nevyn.them.org with local (Exim 3.36 #1 (Debian)) id 18JMPR-0001b1-00; Tue, 03 Dec 2002 18:24:57 -0500 Date: Tue, 03 Dec 2002 15:24:00 -0000 From: Daniel Jacobowitz To: Paul Mundt Cc: gdb@sources.redhat.com Subject: Re: SIG32/SIGTRAP issues Message-ID: <20021203232457.GA5980@nevyn.them.org> Mail-Followup-To: Paul Mundt , gdb@sources.redhat.com References: <1038959780.11721.54.camel@Origin> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1038959780.11721.54.camel@Origin> User-Agent: Mutt/1.5.1i X-SW-Source: 2002-12/txt/msg00057.txt.bz2 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];