testsuite: Extend TLS core file testing with an OS-generated dump

Message ID f6250fa2-d10a-873d-52ab-7dc30807a141@redhat.com
State New, archived
Headers

Commit Message

Pedro Alves May 23, 2018, 2:48 p.m. UTC
  On 05/23/2018 01:42 PM, Maciej W. Rozycki wrote:
> On Wed, 23 May 2018, Pedro Alves wrote:
> 
>>> to gdbserver testing.  The latter is because we'd have to handle core 
>>> file copying from the remote system and then cleaning up with a possibly 
>>> variable name of the core file created.  This code has been based on 
>>> gdb.base/auxv.exp, which does not do it either.
>>
>> Hmm, that sounds like an outdated testcase to copy.  See
>> gdb.threads/corethreads.exp, for example, and the use of the core_find
>> procedure.  Can we use that procedure here too?
> 
>  Possibly.  The test case is skipped with all my testing, native or 
> native-gdbserver, due to the use of `![isnative]' (I have $build != 
> $host; the native compiler I have on the host machine is too old to 
> build GDB these days), so I didn't even notice it there.
> 
>> I also don't see why (gdbserver && !is_remote) testing can't work, such as
>> with --target=native-gdbserver and --target=native-extended-gdbserver boards.
>> It works for gdb.threads/corethreads.exp, for example.
> 
>  Acknowledged.  Given the current situation I cannot afford investing 
> any further work into this change, so let's ditch it (and a change to 
> gdb.base/auxv.exp to use `use_gdb_stub' I planned to submit next).  If I 
> find some time after all, then I can revisit the decision later on.
I understand.  Let me take it over then.  Below's a version using
core_find.

I also simplified the patch a bit:

- Removed the rlimit bits, since it seems that no other core-related test
  does that (so it seems to me that if needed, it would better be done
  separately and to several testcases at once).

- Removed the test message parameters from tls_core_test,
  and switched to using with_test_prefix instead

- Extended tls_core_test's description a bit to mention the
  SUPPORTED parameter.

This gives an all pass for me on native, native-gdbserver,
and native-extended-gdbserver (x86-64 GNU/Linux).

As a local hack, I flipped the logic in:
 set core_supported [expr {$corefile != ""}]
to make sure that the expected UNSUPPORTED messages come out.

Let me know what you think.

Thanks,
Pedro Alves

From 154986d31cc124486e28076e0902065f054dff12 Mon Sep 17 00:00:00 2001
From: "Maciej W. Rozycki" <macro@mips.com>
Date: Wed, 23 May 2018 15:33:55 +0100
Subject: [PATCH] testsuite: Extend TLS core file testing with an OS-generated
 dump

Complementing commit 280ca31f4d60 ("Add test for fetching TLS from
core file") extend gdb.threads/tls-core.exp with an OS-generated dump
where supported.

This verifies not only that our core dump interpreter is consistent
with our producer, but that it matches the OS verified as well,
avoiding a possible case where our interpreter would be bug-compatible
with our producer but not the OS and it would go unnoticed in testing.
This adds:

 PASS: gdb.threads/tls-core.exp: set cwd to temporary directory for core dumps
 PASS: gdb.threads/tls-core.exp: continue to signal
 PASS: gdb.threads/tls-core.exp: continue to termination
 PASS: gdb.threads/tls-core.exp: generate native core dump
 PASS: gdb.threads/tls-core.exp: load native corefile
 PASS: gdb.threads/tls-core.exp: print thread-local storage variable from native corefile

to local testing and:

 UNSUPPORTED: gdb.threads/tls-core.exp: generate native core dump
 UNSUPPORTED: gdb.threads/tls-core.exp: load native corefile
 UNSUPPORTED: gdb.threads/tls-core.exp: print thread-local storage variable from native corefile

to remote testing, or for testing on ports that don't supports cores.

gdb/testsuite/ChangeLog:
2018-05-23  Maciej W. Rozycki  <macro@mips.com>
	    Pedro Alves  <palves@redhat.com>

	* gdb.threads/tls-core.c: Include <stdlib.h>
	(thread_proc): Call `abort'.
	* gdb.threads/tls-core.exp: Generate a core with core_find too.
	(tls_core_test): New procedure, bits factored out from ...
	(top level): ... here.  Test both native cores and gcore cores.
---
 gdb/testsuite/gdb.threads/tls-core.c   |  2 ++
 gdb/testsuite/gdb.threads/tls-core.exp | 63 ++++++++++++++++++++++------------
 2 files changed, 44 insertions(+), 21 deletions(-)
  

Comments

Maciej W. Rozycki May 23, 2018, 9:46 p.m. UTC | #1
Hi Pedro,

> >  Acknowledged.  Given the current situation I cannot afford investing 
> > any further work into this change, so let's ditch it (and a change to 
> > gdb.base/auxv.exp to use `use_gdb_stub' I planned to submit next).  If I 
> > find some time after all, then I can revisit the decision later on.
> I understand.  Let me take it over then.  Below's a version using
> core_find.
> 
> I also simplified the patch a bit:
> 
> - Removed the rlimit bits, since it seems that no other core-related test
>   does that (so it seems to me that if needed, it would better be done
>   separately and to several testcases at once).

 Well, I took them from gdb.base/auxv.c, so clearly there's at least one 
test that has them.  Perhaps you could modernise gdb.base/auxv.exp too?

> As a local hack, I flipped the logic in:
>  set core_supported [expr {$corefile != ""}]
> to make sure that the expected UNSUPPORTED messages come out.
> 
> Let me know what you think.

 I'd keep that:

rename tls_core_test ""

command that I added at the end though, so as not to clutter the procedure 
space.  Otherwise it'll stay there thoughout the rest of a test suite run 
(we have some leftover clutter in the testsuite already, which sometimes 
makes different .exp scripts interact with each other).

 I ran it native and gdbserver-native, and remote, with correct results.  
Messages in the commit description need to be updated though, as below:

> This adds:
> 
>  PASS: gdb.threads/tls-core.exp: set cwd to temporary directory for core dumps
>  PASS: gdb.threads/tls-core.exp: continue to signal
>  PASS: gdb.threads/tls-core.exp: continue to termination
>  PASS: gdb.threads/tls-core.exp: generate native core dump
>  PASS: gdb.threads/tls-core.exp: load native corefile
>  PASS: gdb.threads/tls-core.exp: print thread-local storage variable from native corefile

PASS: gdb.threads/tls-core.exp: native: load core file
PASS: gdb.threads/tls-core.exp: native: print thread-local storage variable

here, and:

> to local testing and:
> 
>  UNSUPPORTED: gdb.threads/tls-core.exp: generate native core dump
>  UNSUPPORTED: gdb.threads/tls-core.exp: load native corefile
>  UNSUPPORTED: gdb.threads/tls-core.exp: print thread-local storage variable from native corefile

WARNING: can't generate a core file - core tests suppressed - check ulimit -c
UNSUPPORTED: gdb.threads/tls-core.exp: native: load core file
UNSUPPORTED: gdb.threads/tls-core.exp: native: print thread-local storage variable

here.  Will you handle all this or shall I?

 Many thanks for taking care of this.  Your updated test script actually 
helped me greatly with a test case for the next change I am going to push 
(another MIPS/Linux core file mishandling -- we live in a reality separate 
from the kernel's as it turns out).

  Maciej
  

Patch

diff --git a/gdb/testsuite/gdb.threads/tls-core.c b/gdb/testsuite/gdb.threads/tls-core.c
index 6089ba116ea..33dd43fb49a 100644
--- a/gdb/testsuite/gdb.threads/tls-core.c
+++ b/gdb/testsuite/gdb.threads/tls-core.c
@@ -16,12 +16,14 @@ 
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include <pthread.h>
+#include <stdlib.h>
 
 int __thread foo = 0xdeadbeef;
 
 static void *
 thread_proc (void *arg)
 {
+  abort ();
   return arg;
 }
 
diff --git a/gdb/testsuite/gdb.threads/tls-core.exp b/gdb/testsuite/gdb.threads/tls-core.exp
index 730016d3bcf..4d2aaeb2989 100644
--- a/gdb/testsuite/gdb.threads/tls-core.exp
+++ b/gdb/testsuite/gdb.threads/tls-core.exp
@@ -20,37 +20,58 @@  if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" \
     return -1
 }
 
+# Generate a native core file.
+
+set corefile [core_find $binfile]
+set core_supported [expr {$corefile != ""}]
+
+# Generate a core file with "gcore".
 
 clean_restart ${binfile}
 
 runto thread_proc
 
-#
-# Generate corefile.
-#
-set corefile [standard_output_file gcore.test]
-set core_supported [gdb_gcore_cmd "$corefile" "save a corefile"]
-if {!$core_supported} {
-    return 0
-}
+set gcorefile [standard_output_file gcore.test]
+set gcore_supported [gdb_gcore_cmd "$gcorefile" "gcore"]
 
+# Restart gdb and load COREFILE as a core file.  SUPPORTED is true iff
+# the core was generated successfully; otherwise, the tests are marked
+# unsupported.
 #
-# Restart gdb and load generated corefile.
-#
-clean_restart ${binfile}
+proc tls_core_test {supported corefile} {
+    upvar target_triplet target_triplet
+    upvar host_triplet host_triplet
+    upvar binfile binfile
+
+    clean_restart ${binfile}
+
+    set test "load core file"
+    if {$supported} {
+	set core_loaded [gdb_core_cmd $corefile $test]
+    } else {
+	set core_loaded 0
+	unsupported $test
+    }
+
+    set test "print thread-local storage variable"
+    if { $core_loaded == 1 } {
+	# This fails in cross-debugging due to the use of native
+	# `libthread_db'.
+	if {![string match $host_triplet $target_triplet]} {
+	    setup_kfail "threads/22381" "*-*-*"
+	}
+	gdb_test "p/x foo" "\\$\[0-9]+ = 0xdeadbeef" $test
+    } else {
+	unsupported $test
+    }
+}
 
-set core_loaded [gdb_core_cmd "$corefile" "load generated corefile"]
-if { $core_loaded != 1 } {
-    # No use proceeding from here.
-    return 0
+with_test_prefix "native" {
+    tls_core_test $core_supported $corefile
 }
 
-# This fails in cross-debugging due to the use of native `libthread_db'.
-if {![string match $host_triplet $target_triplet]} {
-    setup_kfail "threads/22381" "*-*-*"
+with_test_prefix "gcore" {
+    tls_core_test $gcore_supported $gcorefile
 }
-gdb_test "p/x foo" \
-	"\\$\[0-9]+ = 0xdeadbeef" \
-	"print thread-local storage variable"
 
 gdb_exit