Fix PR 18208: update /proc/pid/coredump_filter by c code
authorYao Qi <yao.qi@linaro.org>
Fri, 8 May 2015 11:37:48 +0000 (12:37 +0100)
committerYao Qi <yao.qi@linaro.org>
Fri, 8 May 2015 11:37:48 +0000 (12:37 +0100)
Hi,
We see some fails in gdb.base/coredump-filter.exp when we do remote
gdbserver testing, like what I did for arm/aarch64 linux testing or
run it with board file remote-gdbserver-on-localhost

 $ make check RUNTESTFLAGS='--target_board=remote-gdbserver-on-localhost coredump-filter.exp'

we find that this line in the test doesn't work as expected,

 remote_exec target "sh -c \"echo $filter_flag > /proc/$ipid/coredump_filter\""

although such pattern has been used in gdb testsuite somewhere else,
but the special thing here is that we redirect the output to
/proc/$ipid/coredump_filter on the remote target.  DejaGNU will
redirect the output from the remote target to local, and looks tcl
gets confused by these two redirection.

After trying pass different parameters to remote_exec and hacking
remote_exec/rsh_exec/local_exec, I got no success, I decide
to give up, and try to update /proc/$ipid/coredump_filter by the c
code directly.

This patch adds a c function set_coredump_filter to update
coredump_filter, and GDB calls it.

gdb/testsuite:

2015-05-08  Yao Qi  <yao.qi@linaro.org>

PR gdb/18208
* gdb.base/coredump-filter.c (set_coredump_filter): New function.
* gdb.base/coredump-filter.exp (do_save_core): Call inferior
function set_coredump_filter, and remove remote_exec call.
Remove argument ipid.  Callers update.
(top level): Don't get inferior's PID.

gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/coredump-filter.c
gdb/testsuite/gdb.base/coredump-filter.exp

index 8284a496a6934ab06d3cb2c82e29dafb87192f7a..0caddbd0a0bb6e75246d729b3756e2e68497f932 100644 (file)
@@ -1,3 +1,12 @@
+2015-05-08  Yao Qi  <yao.qi@linaro.org>
+
+       PR gdb/18208
+       * gdb.base/coredump-filter.c (set_coredump_filter): New function.
+       * gdb.base/coredump-filter.exp (do_save_core): Call inferior
+       function set_coredump_filter, and remove remote_exec call.
+       Remove argument ipid.  Callers update.
+       (top level): Don't get inferior's PID.
+
 2015-05-08  Andreas Arnez  <arnez@linux.vnet.ibm.com>
 
        * gdb.base/watch_thread_num.exp: Skip test on targets without
index 192c46975c925eac750a6370a55cde0c9d2c0672..18b9d9cc33319acf0e911380e98d0fcbd6c2bb59 100644 (file)
@@ -59,3 +59,19 @@ main (int argc, char *argv[])
 
   return 0; /* break-here */
 }
+
+/* Write V to /proc/self/coredump_filter.  Return 0 on success.  */
+
+int
+set_coredump_filter (int v)
+{
+  FILE *f = fopen("/proc/self/coredump_filter", "r+");
+
+  if (f == NULL)
+    return 1;
+
+  fprintf(f, "%#x", v);
+
+  fclose (f);
+  return 0;
+}
index 72f756a782592ff824f553bc4b1141b9f1eeb3ee..8638ab02c871d3f23cf45f633fbf384a917452da 100644 (file)
@@ -34,10 +34,10 @@ if { ![runto_main] } {
 gdb_breakpoint [gdb_get_line_number "break-here"]
 gdb_continue_to_breakpoint "break-here" ".* break-here .*"
 
-proc do_save_core { filter_flag core ipid } {
-    verbose -log "writing $filter_flag to /proc/$ipid/coredump_filter"
+proc do_save_core { filter_flag core } {
+    verbose -log "writing $filter_flag to /proc/<inferior pid>/coredump_filter"
 
-    remote_exec target "sh -c \"echo $filter_flag > /proc/$ipid/coredump_filter\""
+    gdb_test "p set_coredump_filter ($filter_flag)" " = 0"
 
     # Generate a corefile.
     gdb_gcore_cmd "$core" "save corefile"
@@ -146,11 +146,8 @@ if { !$core_supported } {
     return -1
 }
 
-# Get the inferior's PID.
-set infpid ""
 gdb_test_multiple "info inferiors" "getting inferior pid" {
-    -re "process \($decimal\).*\r\n$gdb_prompt $" {
-       set infpid $expect_out(1,string)
+    -re "process $decimal.*\r\n$gdb_prompt $" {
     }
     -re "Remote target.*$gdb_prompt $" {
        # If the target does not provide PID information (like usermode QEMU),
@@ -185,12 +182,12 @@ foreach item $all_anon_corefiles {
 # Generate corefiles for the "anon" case.
 foreach item $all_anon_corefiles {
     with_test_prefix "saving corefile for [lindex $item 0]" {
-       do_save_core [lindex $item 1] [subst [lindex $item 2]] $infpid
+       do_save_core [lindex $item 1] [subst [lindex $item 2]]
     }
 }
 
 with_test_prefix "saving corefile for non-Private-Shared-Anon-File" {
-    do_save_core "0x60" $non_private_shared_anon_file_core $infpid
+    do_save_core "0x60" $non_private_shared_anon_file_core
 }
 
 clean_restart $testfile