Test 'set exec-file-mismatch ask|warn|off'.
authorPhilippe Waroquiers <philippe.waroquiers@skynet.be>
Sat, 21 Dec 2019 13:19:40 +0000 (14:19 +0100)
committerPhilippe Waroquiers <philippe.waroquiers@skynet.be>
Sat, 25 Jan 2020 10:08:24 +0000 (11:08 +0100)
Modify gdb.base/attach.exp to test the behaviour of the option
exec-file-mismatch.  Note that this test can also be run using/
  make check RUNTESTFLAGS="--target_board=native-extended-gdbserver" TESTS=gdb.base/attach.exp

to test the behaviour of attaching to running program using a gdb server.

Note: when running the test with a gdbserver, the tests in
test_command_line_attach_run fail because the command "run" is not supported.
I tried to extend the condition
    if ![isnative] then {
unsupported "commandline attach run test"
return 0
    }
but unclear to me how to best do that.  The below trials all failed
to work properly:
    if { ![isnative] || [target_is_gdbserver] } then {
    if { ![isnative] || [use_gdb_stub] } then {
    if { ![isnative] || [is_remote target] } then {
  => could never obtain a condition that was true with gdbserver.

2020-01-25  Philippe Waroquiers  <philippe.waroquiers@skynet.be>

* gdb.base/attach.exp: Test 'set exec-file-mismatch'.

gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/attach.c
gdb/testsuite/gdb.base/attach.exp
gdb/testsuite/gdb.base/attach2.c

index d56c26daafc3bce21d3542ad48fbad02cb7b500b..70cbb75848f6be8938f13c64bc5cf2e6f1e9e267 100644 (file)
@@ -1,3 +1,7 @@
+2020-01-25  Philippe Waroquiers  <philippe.waroquiers@skynet.be>
+
+       * gdb.base/attach.exp: Test 'set exec-file-mismatch'.
+
 2020-01-24  Andrew Burgess  <andrew.burgess@embecosm.com>
 
        * gdb.dwarf2/dw2-inline-many-frames.c: New file.
index 91b180c73c30dbcbb40c1ab3b9a92ef84c4c43e9..2e87f9b7104aea4975b4b9d85c91dcbe0b037258 100644 (file)
@@ -7,6 +7,7 @@
 #include <stdio.h>
 #include <unistd.h>
 
+int  bidule = 0;
 int  should_exit = 0;
 
 int main ()
index 52a8995a304dd6be9a79297ef8ceea9473508f1b..5a1d7a84736d46d74299fe1cf331d2fe5b1b6f6d 100644 (file)
@@ -474,7 +474,12 @@ proc test_command_line_attach_run {} {
     global gdb_prompt
     global binfile
 
-    if ![isnative] then {
+    # Skip test if we cannot attach on the command line and use the run command.
+    # ??? Unclear what condition to use to return here when using gdbserver.
+    # ??? None of the below works.
+    #    ![isnative] || [target_is_gdbserver]
+    #    ![isnative] || [use_gdb_stub]
+    if { ![isnative] || [is_remote target] } then {
        unsupported "commandline attach run test"
        return 0
     }
@@ -513,14 +518,91 @@ proc test_command_line_attach_run {} {
     }
 }
 
+
+# This is a test of 'set exec-file-mismatch' handling.
+
+proc_with_prefix do_attach_exec_mismatch_handling_tests {} {
+    global gdb_prompt
+    global binfile
+    global binfile2
+
+    clean_restart $binfile
+
+    # Start two programs that can be attached to.
+    # The first program contains a 'int bidule' variable, the second a 'float bidule'.
+
+    set test_spawn_id [spawn_wait_for_attach $binfile]
+    set testpid [spawn_id_get_pid $test_spawn_id]
+    set test_spawn_id2 [spawn_wait_for_attach $binfile2]
+    set testpid2 [spawn_id_get_pid $test_spawn_id2]
+
+
+    # Test with the default value of 'set exec-file-mismatch load".
+    set test "mismatch load"
+    gdb_test "attach $testpid" "Attaching to program.*" "$test attach1"
+    # Verify that we can "see" the variable "bidule" in the
+    # program, and that it is an integer.
+    gdb_test "ptype bidule" " = int" "$test after attach1, bidule is int"
+    # Detach the process.
+    gdb_test "detach" "Detaching from program: .* detached\\\]" "$test detach1"
+    gdb_test_multiple "attach $testpid2" "$test attach2" {
+       -re "Attaching to program.*exec-file-mismatch handling is currently \"ask\".*Load new symbol table from .*attach2\".*\(y or n\)" {
+           pass "$test attach2"
+       }
+    }
+    gdb_test "y" "Reading symbols from .*attach2.*" "$test load attach2"
+    # Verify that we can "see" the variable "bidule" in the
+    # program, and that it is a float.
+    gdb_test "ptype bidule" " = float" "$test after attach2 and load, bidule is float"
+    # Detach the process.
+    gdb_test "detach" "Detaching from program: .* detached\\\]" "$test detach attach2"
+
+
+    # Test with 'set exec-file-mismatch warn".
+    set test "mismatch warn"
+    gdb_test_no_output "set exec-file-mismatch warn"
+    gdb_test_multiple "attach $testpid" "$test attach" {
+       -re "Attaching to program.*exec-file-mismatch handling is currently \"warn\".*$gdb_prompt" {
+           pass "$test attach"
+       }
+    }
+    # Verify that we still (wrongly) "see" the variable "bidule" as a float,
+    # as we have not loaded the correct exec-file.
+    gdb_test "ptype bidule" " = float" "$test after attach and warn, bidule is float"
+    # Detach the process.
+    gdb_test "detach" "Detaching from program: .* detached\\\]" "$test detach attach"
+
+
+    # Same test but with 'set exec-file-mismatch off".
+    set test "mismatch off"
+    gdb_test_no_output "set exec-file-mismatch off"
+    gdb_test_multiple "attach $testpid" "$test attach" {
+       -re "Attaching to program.*$gdb_prompt" {
+           pass "$test attach"
+       }
+    }
+    # Verify that we still (wrongly) "see" the variable "bidule" as a float,
+    # as we have not warned the user and not loaded the correct exec-file
+    gdb_test "ptype bidule" " = float" "$test after attach and warn, bidule is float"
+    # Detach the process.
+    gdb_test "detach" "Detaching from program: .* detached\\\]" "$test detach attach"
+
+
+    # Don't leave a process around
+    kill_wait_spawned_process $test_spawn_id
+    kill_wait_spawned_process $test_spawn_id2
+}
+
 do_attach_tests
 do_attach_failure_tests
 do_call_attach_tests
+do_attach_exec_mismatch_handling_tests
 
 # Test "gdb --pid"
 
 do_command_attach_tests
 
+
 test_command_line_attach_run
 
 return 0
index a78037ed387aca7de5036ff0891e6a50de045f83..44d37258fbc8d78647d7290bcb21bbb7e2a3cd00 100644 (file)
@@ -8,6 +8,7 @@
 #include <stdlib.h>
 #include <unistd.h>
 
+float  bidule = 0.0;
 int  should_exit = 0;
 
 int main ()