This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Running testsuite with /proc/sys/kernel/core_uses_pid set, avoiding leaving core dump files behind


I run the testsuite with /proc/sys/kernel/core_uses_pid set,
so that if I get gdb dumping core more than once in a testrun,
I still get a core file per crash (the Linux kernel dumps
core files named core.PID instead).  Unfortunately, this
means I always get a few extra core dump files left behind
on each test run (4 to be precise).

There are a couple of annotations tests that let the tested
program dump core, and then look for a file named "core" -- if the
file exists, it gets deleted.  This of course fails to find
the core file if /proc/sys/kernel/core_uses_pid is set.

I'm fixing this by making the tests look for core.PID as well.
While at it, use the remote_file commands instead of running
`ls' directly.  And do it on the host, where gdb and the
program runs (these tests are native only), not on the build,
for remote host testing without a shared filesystem.

The valgrind-db-attach.exp test runs a program under valgrind
that double-frees, and has valgrind setup to have gdb auto-attach to
the valgrind process when the double-free is detected.  Since gdb is
attached (instead of having spawned the process), "(gdb) quit" detaches
(instead of killing), and that ends up with the inferior
aborting / dumping core, always leaving a core file behind.
The solution is to do an explicit "kill" before leaving.

I now only end up with a single unexpected core dump after a
testrun, generated by the typeddwarf binary of typeddwarf.exp
(a SIGSEGV).  I'm not sure what's going on here.  Looking at
the .c file, there doesn't seem to be anything that should crash.
But just running the typeddwarf binary directly always dumps
core.  What I find strange is that the typeddwarf-amd64.S
file claims to be generated by

  "gcc -S -g -O2 typeddwarf.c -o typeddwarf-amd64.S"

but typeddwarf-amd64.S doesn't contain a main label, it
has a _start label instead, so it looks like it got hand
massaged a bit.  Indeed, if I compile typeddwarf.c
directly, I get a binary that does not crash.

Anyway, I don't supposed there are any objections to this
patch?

-- 
Pedro Alves

2011-09-07  Pedro Alves  <pedro@codesourcery.com>

	gdb/testsuite/
	* gdb.base/annota1.exp, gdb.base/annota3.exp: Extract the
	inferior's pid and look for a core dump named core.$pid.  Use
	`remote_file' commands on the host instead of hand coding shell
	commands on the build.
	* gdb.base/valgrind-db-attach.exp: Kill the program before
	finishing the test.

---
 gdb/testsuite/gdb.base/annota1.exp            |   29 ++++++++++++++++----------
 gdb/testsuite/gdb.base/annota3.exp            |   28 ++++++++++++++++---------
 gdb/testsuite/gdb.base/valgrind-db-attach.exp |    3 ++
 3 files changed, 39 insertions(+), 21 deletions(-)

Index: src/gdb/testsuite/gdb.base/annota1.exp
===================================================================
--- src.orig/gdb/testsuite/gdb.base/annota1.exp	2011-04-27 18:53:19.000000000 +0100
+++ src/gdb/testsuite/gdb.base/annota1.exp	2011-09-07 15:49:38.314338788 +0100
@@ -392,6 +392,17 @@ gdb_test_multiple "next" "breakpoint ign
     }
 }
 
+# Get the inferior's PID for later.
+
+set test "get inferior pid"
+set pid -1
+gdb_test_multiple "info inferior 1" "$test" {
+    -re "process (\[-\]*\[0-9\]*).*$gdb_prompt$" {
+	set pid $expect_out(1,string)
+	pass "$test"
+    }
+}
+
 #
 # Send a signal that is not handled; test:
 # annotate-signalled
@@ -422,21 +433,17 @@ if [target_info exists gdb,nosignals] {
     }
 }
 
-
 # Check for production of a core file and remove it!
 
-set exec_output [remote_exec build "ls core"]
-
 set test "cleanup core file"
-if [ regexp "core not found" $exec_output]  {
-    pass "$test (not dumped)"
+if { [remote_file host exists core] } {
+    remote_file host delete core
+    pass "$test (removed)"
+} elseif { $pid != -1 && [remote_file host exists core.$pid] } {
+    remote_file host delete core.$pid
+    pass "$test (removed)"
 } else {
-    if [ regexp "No such file or directory" $exec_output] {
-	pass "$test (not dumped)"
-    } else {
-	remote_exec build "rm -f core"
-	pass "$test (removed)"
-    }
+    pass "$test (not dumped)"
 }
 
 proc thread_test {} {
Index: src/gdb/testsuite/gdb.base/annota3.exp
===================================================================
--- src.orig/gdb/testsuite/gdb.base/annota3.exp	2011-01-13 15:07:59.000000000 +0000
+++ src/gdb/testsuite/gdb.base/annota3.exp	2011-09-07 15:52:04.534338814 +0100
@@ -365,6 +365,17 @@ gdb_expect_list "breakpoint ignore count
     "\r\n\032\032stopped\r\n"
 }
 
+# Get the inferior's PID for later.
+
+set test "get inferior pid"
+set pid -1
+gdb_test_multiple "info inferior 1" "$test" {
+    -re "process (\[-\]*\[0-9\]*).*$gdb_prompt$" {
+	set pid $expect_out(1,string)
+	pass "$test"
+    }
+}
+
 #
 # Send a signal that is not handled
 #
@@ -396,18 +407,15 @@ if [target_info exists gdb,nosignals] {
 
 # Check for production of a core file and remove it!
 
-set exec_output [remote_exec build "ls core"]
-
 set test "cleanup core file"
-if [ regexp "core not found" $exec_output]  {
-    pass "$test (not dumped)"
+if { [remote_file host exists core] } {
+    remote_file host delete core
+    pass "$test (removed)"
+} elseif { $pid != -1 && [remote_file host exists core.$pid] } {
+    remote_file host delete core.$pid
+    pass "$test (removed)"
 } else {
-    if [ regexp "No such file or directory" $exec_output] {
-	pass "$test (not dumped)"
-    } else {
-	remote_exec build "rm -f core"
-	pass "$test (removed)"
-    }
+    pass "$test (not dumped)"
 }
 
 # restore the original prompt for the rest of the testsuite
Index: src/gdb/testsuite/gdb.base/valgrind-db-attach.exp
===================================================================
--- src.orig/gdb/testsuite/gdb.base/valgrind-db-attach.exp	2011-01-13 15:08:03.000000000 +0000
+++ src/gdb/testsuite/gdb.base/valgrind-db-attach.exp	2011-09-07 16:16:35.794339071 +0100
@@ -83,3 +83,6 @@ gdb_test_no_output "set height 0"
 gdb_test_no_output "set width 0"
 
 gdb_test "bt" "in main \\(.*\\) at .*${srcfile}:$double_free"
+
+# Explicitly kill the program so it doesn't dump core when we quit->detach.
+gdb_test "kill" "" "kill program" "Kill the program being debugged.*y or n. $" "y"


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]