From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 3568 invoked by alias); 6 Mar 2012 18:37:11 -0000 Received: (qmail 3348 invoked by uid 22791); 6 Mar 2012 18:37:09 -0000 X-SWARE-Spam-Status: No, hits=-6.2 required=5.0 tests=AWL,BAYES_00,KAM_STOCKGEN,RCVD_IN_DNSWL_HI,SPF_HELO_PASS,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 06 Mar 2012 18:36:50 +0000 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q26IaoOx021999 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 6 Mar 2012 13:36:50 -0500 Received: from barimba (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q26IanPo014211 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Tue, 6 Mar 2012 13:36:49 -0500 From: Tom Tromey To: gdb-patches@sourceware.org Subject: RFC: proc-service -vs- multi-inferior Date: Tue, 06 Mar 2012 18:37:00 -0000 Message-ID: <87vcmhtw3i.fsf@fleche.redhat.com> MIME-Version: 1.0 Content-Type: text/plain Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2012-03/txt/msg00198.txt.bz2 I'd appreciate comments on this patch. I have been trying multi-inferior debugging quite a bit lately. I've noticed this message a few times from gdb: Cannot find new threads: capability not available Today I tracked this down. The problem is that we can end up in thread_db_find_new_threads_2 with a PTID argument that is not the same as current_inferior. Then, libthread_db calls our ps_pglobal_lookup, which tries to look up a symbol against the wrong inferior. This fixes the problem by setting the current program space before calling lookup_minimal_symbol. I have no idea how to construct a test case for this. I could reproduce it reasonably reliably by 'gdb /bin/sh', putting gdb into multi-inferior mode, and then running dejagnu on part of our test suite. Tom 2012-03-06 Tom Tromey * proc-service.c (ps_pglobal_lookup): Set the current program space. diff --git a/gdb/proc-service.c b/gdb/proc-service.c index e317414..a1f90a8 100644 --- a/gdb/proc-service.c +++ b/gdb/proc-service.c @@ -201,14 +201,24 @@ ps_pglobal_lookup (gdb_ps_prochandle_t ph, const char *obj, const char *name, psaddr_t *sym_addr) { struct minimal_symbol *ms; + struct cleanup *old_chain = save_current_program_space (); + struct inferior *inf = find_inferior_pid (ptid_get_pid (ph->ptid)); + ps_err_e result; + + set_current_program_space (inf->pspace); /* FIXME: kettenis/2000-09-03: What should we do with OBJ? */ ms = lookup_minimal_symbol (name, NULL, NULL); if (ms == NULL) - return PS_NOSYM; + result = PS_NOSYM; + else + { + *sym_addr = core_addr_to_ps_addr (SYMBOL_VALUE_ADDRESS (ms)); + result = PS_OK; + } - *sym_addr = core_addr_to_ps_addr (SYMBOL_VALUE_ADDRESS (ms)); - return PS_OK; + do_cleanups (old_chain); + return result; } /* Read SIZE bytes from the target process PH at address ADDR and copy