This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [patch] Fix TLS access for -static -pthread
- From: Yao Qi <yao at codesourcery dot com>
- To: Jan Kratochvil <jan dot kratochvil at redhat dot com>, <gdb-patches at sourceware dot org>
- Date: Thu, 5 Jun 2014 15:15:05 +0800
- Subject: Re: [patch] Fix TLS access for -static -pthread
- Authentication-results: sourceware.org; auth=none
- References: <20140410115204 dot GB16411 at host2 dot jankratochvil dot net>
On 04/10/2014 07:52 PM, Jan Kratochvil wrote:
> +if { "$have_tls" != "" } {
> + if ![runto_main] {
> + return -1
> + }
> + gdb_breakpoint [gdb_get_line_number "tlsvar-is-set"]
> + gdb_continue_to_breakpoint "tlsvar-is-set" ".* tlsvar-is-set .*"
> + gdb_test "p tlsvar" " = 2" "tlsvar in thread"
> + gdb_test "thread 1" ".*"
> + # Unwind from pthread_join.
> + gdb_test "up 10" " in main .*"
This is racy. When child thread hits breakpoint, the main thread may
not go into pthread_join yet and may not be unwind to main.
On target arm-none-linux-gnueabi, I see
thread 1^M
[Switching to thread 1 (Thread 5784)]^M
#0 clone () at ../ports/sysdeps/unix/sysv/linux/arm/nptl/../clone.S:62^M
62 cmp r0, #0^M
(gdb) PASS: gdb.threads/staticthreads.exp: thread 1
up 10^M
#2 0xbe8ea7e4 in ?? ()^M
(gdb) FAIL: gdb.threads/staticthreads.exp: up 10
p tlsvar^M
$2 = 1^M
(gdb) PASS: gdb.threads/staticthreads.exp: tlsvar in main
This patch is to set another breakpoint at the end of main, so that
main thread will hit it, and we can check the value of tlsvar then.
It is safe and we don't have to worry about whether gdb is able to
unwind from pthread library to main function or not.
Is it good to you? b.t.w, this case is UNSUPPORTED on FC 20, because
staticthreads.c can't be compiled. I guess this case requires
some recent version of glibc.
--
Yao (éå)
Subject: [PATCH] Fix the race in gdb.threads/staticthreads.exp
The code in gdb.threads/staticthreads.exp about checking the value of
tlsvar in main thread is racy, because when child thread hits
breakpoint, the main thread may not go into pthread_join yet, and
may not be unwind to main.
This patch is to set another breakpoint at the end of main, so that
main thread will hit it, and we can check the value of tlsvar then.
gdb/testsuite:
2014-06-05 Yao Qi <yao@codesourcery.com>
* gdb.threads/staticthreads.c (main): Add one line of comment
as a marker to set breakpoint.
* gdb.threads/staticthreads.exp: Don't unwind in main thread.
Instead, set breakpoint on the marker and continue the main
thread.
---
gdb/testsuite/gdb.threads/staticthreads.c | 2 +-
gdb/testsuite/gdb.threads/staticthreads.exp | 5 +++--
2 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/gdb/testsuite/gdb.threads/staticthreads.c b/gdb/testsuite/gdb.threads/staticthreads.c
index 5c8eabe..a11359c 100644
--- a/gdb/testsuite/gdb.threads/staticthreads.c
+++ b/gdb/testsuite/gdb.threads/staticthreads.c
@@ -76,6 +76,6 @@ main (int argc, char **argv)
pthread_join (thread, NULL);
}
- pthread_attr_destroy (&attr);
+ pthread_attr_destroy (&attr); /* tlsvar-is-read */
return 0;
}
diff --git a/gdb/testsuite/gdb.threads/staticthreads.exp b/gdb/testsuite/gdb.threads/staticthreads.exp
index 9fa625a..3e23b5b 100644
--- a/gdb/testsuite/gdb.threads/staticthreads.exp
+++ b/gdb/testsuite/gdb.threads/staticthreads.exp
@@ -104,8 +104,9 @@ if { "$have_tls" != "" } {
gdb_breakpoint [gdb_get_line_number "tlsvar-is-set"]
gdb_continue_to_breakpoint "tlsvar-is-set" ".* tlsvar-is-set .*"
gdb_test "p tlsvar" " = 2" "tlsvar in thread"
+
gdb_test "thread 1" ".*"
- # Unwind from pthread_join.
- gdb_test "up 10" " in main .*"
+ gdb_breakpoint ${srcfile}:[gdb_get_line_number "tlsvar-is-read"]
+ gdb_continue_to_breakpoint "tlsvar-is-read" ".* tlsvar-is-read .*"
gdb_test "p tlsvar" " = 1" "tlsvar in main"
}
--
1.9.0