Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Yao Qi <yao@codesourcery.com>
To: Jan Kratochvil <jan.kratochvil@redhat.com>, <gdb-patches@sourceware.org>
Subject: Re: [patch] Fix TLS access for -static -pthread
Date: Thu, 05 Jun 2014 07:17:00 -0000	[thread overview]
Message-ID: <539018F9.5060307@codesourcery.com> (raw)
In-Reply-To: <20140410115204.GB16411@host2.jankratochvil.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


  parent reply	other threads:[~2014-06-05  7:17 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-04-10 11:52 Jan Kratochvil
2014-04-11 11:03 ` Jan Kratochvil
2014-05-20 15:10   ` Tom Tromey
2014-05-20 15:18     ` Jan Kratochvil
2014-05-20 15:10 ` Tom Tromey
2014-05-21 12:17   ` Jan Kratochvil
2014-05-21 14:14     ` Tom Tromey
2014-05-21 14:28       ` [commit] " Jan Kratochvil
2014-06-05  7:17 ` Yao Qi [this message]
2014-06-05  8:06   ` Jan Kratochvil
2014-06-05  9:32     ` Yao Qi
2014-06-05  9:39       ` Jan Kratochvil
2014-06-05 14:20         ` Yao Qi
2014-06-05 15:23           ` Pedro Alves
2014-06-06  2:26             ` Yao Qi
2014-06-05 15:18     ` Pedro Alves
2014-06-06 15:03       ` Jan Kratochvil
2014-06-06  2:36     ` Yao Qi
2014-06-06  6:16       ` Yao Qi
2014-06-06 14:20         ` Jan Kratochvil
2014-06-06  5:34     ` Sergio Durigan Junior
2014-06-06 14:21       ` Jan Kratochvil

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=539018F9.5060307@codesourcery.com \
    --to=yao@codesourcery.com \
    --cc=gdb-patches@sourceware.org \
    --cc=jan.kratochvil@redhat.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