aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.base
diff options
context:
space:
mode:
authorPedro Alves <pedro@palves.net>2022-06-23 13:48:17 +0100
committerPedro Alves <pedro@palves.net>2022-06-24 14:14:45 +0100
commitc715d0732a4b580382b70aa32536fa02fff64d3e (patch)
treea2924acfefcb6aa6e3533dd324f87656adfaffae /gdb/testsuite/gdb.base
parenta32c1a92d5d5a8ed32cb30b161daedb1aca72cb4 (diff)
downloadgdb-c715d0732a4b580382b70aa32536fa02fff64d3e.zip
gdb-c715d0732a4b580382b70aa32536fa02fff64d3e.tar.gz
gdb-c715d0732a4b580382b70aa32536fa02fff64d3e.tar.bz2
Improve core file path detection & put cores in output dir
After a testrun, I noticed that I have some kernel-produced cores for testcase programs, under build/gdb/testsuite/, which shouldn't be there: $ ls -1 testsuite/core.* testsuite/core.annota1.1274351.nelson.1656004407 testsuite/core.annota3.1288474.nelson.1656004414 testsuite/core.exitsignal.1240674.nelson.1656004391 I have my core pattern setup like this: $ cat /proc/sys/kernel/core_pattern core.%e.%p.%h.%t That's: %e: executable filename %p: pid %h: hostname %t: UNIX time of dump so it's easy to tell which program produced the core from the core file name. From above, we can tell that the corresponding testcases are gdb.base/annota1.exp, gdb.base/annota3.exp and gdb.base/exitsignal.exp. At least gdb.base/annota1.exp and gdb.base/annota3.exp have code in them to delete the core file. However, that isn't working for me, because said code only looks for cores named exactly either "core" or "core.PID", and my core_pattern doesn't match that. Another issue I noticed, is that I have not been running gdb.base/bigcore.exp, for a similar reason. I get: Program terminated with signal SIGABRT, Aborted. The program no longer exists. (gdb) PASS: gdb.base/bigcore.exp: signal SIGABRT UNTESTED: gdb.base/bigcore.exp: can't generate a core file But I actually have a core file under the testcase's output dir: $ find . -name "core.*" ./testsuite/outputs/gdb.base/bigcore/core.bigcore.2306705.nelson.1656005213 $ This commit fixes these things, by adding a find_core_file routine that searches core files in a way that works with my core pattern as well. This then also adds a convenience remove_core routine as a wrapper around find_core_file that removes the found core file. In addition, it changes some testcases that expect to have their program dump core, to switch the inferior's cwd to the testcase's output dir, so that the core is dumped there instead of in build/gdb/testsuite/. Some testcases were already doing that, but not all. The idea is that any core file dumped in build/gdb/testsuite/ is an unexpected core file. The next patch will add a count of such unexpected core files to gdb.sum. Another change is that the directory changing is now done with "set cwd" instead of with "cd". "set cwd" only affects the inferior cwd, while "cd" affects GDB's cwd too. By using "set cwd" instead of "cd", if GDB dumps core in these testcases, the GDB core dump will still end up in build/gdb/testsuite/, and can thus be detected as an unexpected core. Change-Id: I45068f21ffd4814350aaa8a3cc65cad5e3107607
Diffstat (limited to 'gdb/testsuite/gdb.base')
-rw-r--r--gdb/testsuite/gdb.base/annota1.exp18
-rw-r--r--gdb/testsuite/gdb.base/annota3.exp18
-rw-r--r--gdb/testsuite/gdb.base/bigcore.exp38
-rw-r--r--gdb/testsuite/gdb.base/exitsignal.exp11
4 files changed, 32 insertions, 53 deletions
diff --git a/gdb/testsuite/gdb.base/annota1.exp b/gdb/testsuite/gdb.base/annota1.exp
index ac6ad64..42a261e 100644
--- a/gdb/testsuite/gdb.base/annota1.exp
+++ b/gdb/testsuite/gdb.base/annota1.exp
@@ -385,6 +385,12 @@ gdb_test_multiple "display value" "set up display" {
}
}
+# Get the core into the output directory.
+if {![is_remote host]} {
+ gdb_test -prompt "$gdb_prompt$" \
+ "set cwd [file dirname $binfile]" "" \
+ "set inferior cwd to test directory"
+}
# should ask query. Test annotate-query.
# we don't care about anything else here, only the query.
@@ -479,17 +485,7 @@ if [target_info exists gdb,nosignals] {
}
# Check for production of a core file and remove it!
-
-set test "cleanup core file"
-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 {
- pass "$test (not dumped)"
-}
+remove_core $pid
proc thread_test {} {
global subdir srcdir testfile srcfile binfile
diff --git a/gdb/testsuite/gdb.base/annota3.exp b/gdb/testsuite/gdb.base/annota3.exp
index b747e03..4fae6f0 100644
--- a/gdb/testsuite/gdb.base/annota3.exp
+++ b/gdb/testsuite/gdb.base/annota3.exp
@@ -273,6 +273,12 @@ gdb_expect_list "set up display" "$gdb_prompt$" {
"1: value = 7\r\n"
}
+# Get the core into the output directory.
+if {![is_remote host]} {
+ gdb_test -prompt "$gdb_prompt$" \
+ "set cwd [file dirname $binfile]" "" \
+ "set inferior cwd to test directory"
+}
# should ask query. Test annotate-query.
# we don't care about anything else here, only the query.
@@ -379,17 +385,7 @@ if [target_info exists gdb,nosignals] {
# Check for production of a core file and remove it!
-
-set test "cleanup core file"
-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 {
- pass "$test (not dumped)"
-}
+remove_core $pid
# restore the original prompt for the rest of the testsuite
diff --git a/gdb/testsuite/gdb.base/bigcore.exp b/gdb/testsuite/gdb.base/bigcore.exp
index a03a30e..13b70f7 100644
--- a/gdb/testsuite/gdb.base/bigcore.exp
+++ b/gdb/testsuite/gdb.base/bigcore.exp
@@ -53,10 +53,7 @@ gdb_test_no_output "set print sevenbit-strings"
gdb_test_no_output "set width 0"
# Get the core into the output directory.
-if {![is_remote host]} {
- gdb_test "cd [file dirname $corefile]" "Working directory .*" \
- "cd to test directory"
-}
+set_inferior_cwd_to_output_dir
if ![runto_main] then {
return 0
@@ -116,17 +113,7 @@ gdb_test_no_output "set \$bytes_allocated = bytes_allocated" "save heap size"
# May 2003) create cores named "core.PID".
# Save the process ID. Some systems dump the core into core.PID.
-set test "grab pid"
-gdb_test_multiple "info program" $test {
- -re "child process (\[0-9\]+).*$gdb_prompt $" {
- set inferior_pid $expect_out(1,string)
- pass $test
- }
- -re "$gdb_prompt $" {
- set inferior_pid unknown
- pass $test
- }
-}
+set inferior_pid [get_inferior_pid]
# Dump core using SIGABRT
set oldtimeout $timeout
@@ -134,18 +121,11 @@ set timeout 600
gdb_test "signal SIGABRT" "Program terminated with signal SIGABRT, .*"
set timeout $oldtimeout
-# Find the corefile
-set file ""
-foreach pat [list core.${inferior_pid} ${testfile}.core core] {
- set names [glob -nocomplain [standard_output_file $pat]]
- if {[llength $names] == 1} {
- set file [lindex $names 0]
- remote_exec build "mv $file $corefile"
- break
- }
-}
-
-if { $file == "" } {
+# Find the corefile.
+set file [find_core_file $inferior_pid]
+if { $file != "" } {
+ remote_exec build "mv $file $corefile"
+} else {
untested "can't generate a core file"
return 0
}
@@ -186,9 +166,7 @@ if {! $core_ok} {
# Now load up that core file
set test "load corefile"
-# We use [file tail] because gdb is still "cd"d to the
-# output directory.
-gdb_test_multiple "core [file tail $corefile]" "$test" {
+gdb_test_multiple "core $corefile" "$test" {
-re "A program is being debugged already. Kill it. .y or n. " {
send_gdb "y\n"
exp_continue
diff --git a/gdb/testsuite/gdb.base/exitsignal.exp b/gdb/testsuite/gdb.base/exitsignal.exp
index 27eb6c5..b139bac 100644
--- a/gdb/testsuite/gdb.base/exitsignal.exp
+++ b/gdb/testsuite/gdb.base/exitsignal.exp
@@ -32,11 +32,17 @@ if { [prepare_for_testing "failed to prepare" ${testfile} ${srcfile}] } {
return -1
}
-# Run to main
+# Run to main. But, before, change cwd to get the core into the
+# output directory.
+set_inferior_cwd_to_output_dir
+
if { ![runto_main] } {
return -1
}
+# Get the inferior's PID for later.
+set pid [get_inferior_pid]
+
# Print $_exitsignal. It should be void now, because nothing
# happened.
gdb_test "print \$_exitsignal" " = void" \
@@ -53,6 +59,9 @@ gdb_test "continue" "Program received signal SIGSEGV.*" "trigger SIGSEGV"
gdb_test "continue" "Program terminated with signal SIGSEGV.*" \
"program terminated with SIGSEGV"
+# We don't need the core file, remove it.
+remove_core $pid
+
# Now, print $_exitsignal again. It should be 11 (SIGSEGV).
gdb_test "print \$_exitsignal" " = 11" \
"\$_exitsignal is 11 (SIGSEGV) after SIGSEGV."