From: PAUL GILLIAM <pgilliam@us.ibm.com>
To: gdb@sources.redhat.com
Cc: sjmunroe@us.ibm.com
Subject: breaks at thread create and delete fail on PPC64/Linux
Date: Mon, 28 Aug 2006 23:19:00 -0000 [thread overview]
Message-ID: <1156806903.5898.29.camel@dufur.beaverton.ibm.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 2675 bytes --]
Here is an example:
> gdb example64
(gdb) start
Breakpoint 1 at 0x10000734: file example.c, line 10.
Starting program: /home/pgilliam/example64
[Thread debugging using libthread_db enabled]
[New Thread 4398046665456 (LWP 9443)]
Warning:
Cannot insert breakpoint -2.
Error accessing memory address 0x9ce0: Input/output error.
Cannot insert breakpoint -3.
Error accessing memory address 0x9cf0: Input/output error.
(gdb)
Here is the problem:
1) In linux-thread-db.c: enable_thread_event(), The routine
"td_ta_event_addr" in the library "thread_db" gets called and
returns a function descriptor for the address at which to set
the breakpoints for the "create" and "delete" thread events
in the "pthread" library.
2) These address point at PLT entries in the '.opd' section.
3) 'dereferencing' the function descriptor should give the
actual address at which to set a breakpoint, but gives instead
the offset within the "pthread" library where the breakpoint
should be placed.
The attached patch 'fixes' the problem by looking up the load address of the
"pthread" library and adding that to the address from the PLT. This seems to
do the trick, but THIS HAS ONLY BEEN TESTED WITH A 64-BIT GDB AND A 64-BIT
TARGET. And it's a real HACK!!!
But it does illustrate the problem.
So, should I try to change GDB so that enable_thread_event() gets called after
the dynamic loader has has a chance to relocate the .opd?
or
Find a better place way to do the relocation for just these two things?
-=# Paul Gilliam #=-
--- /home/pgilliam/linux-thread-db.c 2006-08-17 02:27:05.000000000 -0700
+++ hacked.linux-thread-db.c 2006-08-17 02:29:16.000000000 -0700
@@ -497,6 +497,7 @@
static td_err_e
enable_thread_event (td_thragent_t *thread_agent, int event, CORE_ADDR *bp)
{
+ static CORE_ADDR thread_lib_reloc = 0;
td_notify_t notify;
td_err_e err;
@@ -514,7 +515,24 @@
? (CORE_ADDR) (intptr_t) notify.u.bptaddr
: (CORE_ADDR) (uintptr_t) notify.u.bptaddr),
¤t_target));
- create_thread_event_breakpoint ((*bp));
+ if (! thread_lib_reloc) {
+ char tbuf[1024];
+ FILE *pmf;
+
+ sprintf (tbuf, "/proc/%d/maps", proc_handle.pid);
+ pmf = fopen (tbuf, "r");
+ if (pmf) {
+ while (fgets( tbuf, sizeof(tbuf), pmf)) {
+ char *cp = rindex (tbuf, '/');
+ if (cp && strncmp (cp+1, "libpthread", 10) == 0) {
+ thread_lib_reloc = (CORE_ADDR) strtol (tbuf, 0, 16);
+ break;
+ }
+ }
+ fclose (pmf);
+ }
+ }
+ create_thread_event_breakpoint ((*bp) + thread_lib_reloc);
return TD_OK;
}
[-- Attachment #2: hack.patch --]
[-- Type: text/x-patch, Size: 1039 bytes --]
--- /home/pgilliam/linux-thread-db.c 2006-08-17 02:27:05.000000000 -0700
+++ hacked.linux-thread-db.c 2006-08-17 02:29:16.000000000 -0700
@@ -497,6 +497,7 @@
static td_err_e
enable_thread_event (td_thragent_t *thread_agent, int event, CORE_ADDR *bp)
{
+ static CORE_ADDR thread_lib_reloc = 0;
td_notify_t notify;
td_err_e err;
@@ -514,7 +515,24 @@
? (CORE_ADDR) (intptr_t) notify.u.bptaddr
: (CORE_ADDR) (uintptr_t) notify.u.bptaddr),
¤t_target));
- create_thread_event_breakpoint ((*bp));
+ if (! thread_lib_reloc) {
+ char tbuf[1024];
+ FILE *pmf;
+
+ sprintf (tbuf, "/proc/%d/maps", proc_handle.pid);
+ pmf = fopen (tbuf, "r");
+ if (pmf) {
+ while (fgets( tbuf, sizeof(tbuf), pmf)) {
+ char *cp = rindex (tbuf, '/');
+ if (cp && strncmp (cp+1, "libpthread", 10) == 0) {
+ thread_lib_reloc = (CORE_ADDR) strtol (tbuf, 0, 16);
+ break;
+ }
+ }
+ fclose (pmf);
+ }
+ }
+ create_thread_event_breakpoint ((*bp) + thread_lib_reloc);
return TD_OK;
}
next reply other threads:[~2006-08-28 23:19 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-08-28 23:19 PAUL GILLIAM [this message]
2006-08-28 23:22 ` Daniel Jacobowitz
2006-08-28 23:31 ` PAUL GILLIAM
2006-08-29 19:04 ` Mark Kettenis
2006-08-29 19:08 ` Daniel Jacobowitz
2006-09-20 15:49 ` Daniel Jacobowitz
2006-09-20 17:41 ` John Reiser
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1156806903.5898.29.camel@dufur.beaverton.ibm.com \
--to=pgilliam@us.ibm.com \
--cc=gdb@sources.redhat.com \
--cc=sjmunroe@us.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox