This is the mail archive of the gdb-cvs@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]

[binutils-gdb] Fix PR 18208: update /proc/pid/coredump_filter by c code


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=422349a385c2ccfc1e66f5c65560e5bd5fc97953

commit 422349a385c2ccfc1e66f5c65560e5bd5fc97953
Author: Yao Qi <yao.qi@linaro.org>
Date:   Fri May 8 12:37:48 2015 +0100

    Fix PR 18208: update /proc/pid/coredump_filter by c code
    
    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.

Diff:
---
 gdb/testsuite/ChangeLog                    |  9 +++++++++
 gdb/testsuite/gdb.base/coredump-filter.c   | 16 ++++++++++++++++
 gdb/testsuite/gdb.base/coredump-filter.exp | 15 ++++++---------
 3 files changed, 31 insertions(+), 9 deletions(-)

diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 8284a49..0caddbd 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -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
diff --git a/gdb/testsuite/gdb.base/coredump-filter.c b/gdb/testsuite/gdb.base/coredump-filter.c
index 192c469..18b9d9c 100644
--- a/gdb/testsuite/gdb.base/coredump-filter.c
+++ b/gdb/testsuite/gdb.base/coredump-filter.c
@@ -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;
+}
diff --git a/gdb/testsuite/gdb.base/coredump-filter.exp b/gdb/testsuite/gdb.base/coredump-filter.exp
index 72f756a..8638ab0 100644
--- a/gdb/testsuite/gdb.base/coredump-filter.exp
+++ b/gdb/testsuite/gdb.base/coredump-filter.exp
@@ -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


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