From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 16422 invoked by alias); 7 Sep 2011 16:19:06 -0000 Received: (qmail 16381 invoked by uid 22791); 7 Sep 2011 16:18:55 -0000 X-SWARE-Spam-Status: No, hits=1.6 required=5.0 tests=AWL,BAYES_00,BOTNET,FROM_12LTRDOM,RDNS_NONE,TO_NO_BRKTS_NORDNS X-Spam-Check-By: sourceware.org Received: from Unknown (HELO mail.codesourcery.com) (38.113.113.100) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 07 Sep 2011 16:18:41 +0000 Received: (qmail 29372 invoked from network); 7 Sep 2011 16:18:40 -0000 Received: from unknown (HELO scottsdale.localnet) (pedro@127.0.0.2) by mail.codesourcery.com with ESMTPA; 7 Sep 2011 16:18:40 -0000 From: Pedro Alves To: gdb-patches@sourceware.org Subject: Running testsuite with /proc/sys/kernel/core_uses_pid set, avoiding leaving core dump files behind Date: Wed, 07 Sep 2011 16:28:00 -0000 User-Agent: KMail/1.13.6 (Linux/2.6.38-11-generic; KDE/4.7.0; x86_64; ; ) MIME-Version: 1.0 Content-Type: Text/Plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Message-Id: <201109071718.38581.pedro@codesourcery.com> X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2011-09/txt/msg00125.txt.bz2 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 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"