[PATCH 4/5] tests: Don't use ptrace detach stopped trick. Raise can return.

Mark Wielaard mjw at redhat.com
Sun Jan 5 21:02:19 UTC 2014


On older kernels the ptrace detach stop trick doesn't work reliably.
Just keep the child processes attached and stopped during the tests,
dwfl_linux_proc_attach will handle that fine now. Also on older kernels
raise would sometimes return anyway and cause a spurious assert. Just
ignore it.

Signed-off-by: Mark Wielaard <mjw at redhat.com>
---
 tests/ChangeLog         | 12 ++++++++++++
 tests/backtrace-data.c  |  2 +-
 tests/backtrace-dwarf.c | 13 +------------
 tests/backtrace.c       | 13 +------------
 4 files changed, 15 insertions(+), 25 deletions(-)

diff --git a/tests/ChangeLog b/tests/ChangeLog
index 0c112cf..63b7bed 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -1,5 +1,17 @@
 2014-01-04  Mark Wielaard  <mjw at redhat.com>
 
+	* backtrace-data.c (main): Don't assert if raise returns.
+	* backtrace-dwarf.c (report_pid): Call dwfl_linux_proc_attach with
+	assume_ptrace_attached true.
+	(ptrace_detach_stopped): Removed function.
+	(main): Don't call ptrace_detach_stopped.
+	* backtrace.c (ptrace_detach_stopped): Removed function.
+	(report_pid): Call dwfl_linux_proc_attach with assume_ptrace_attached
+	true.
+	(exec_dump): Don't call ptrace_detach_stopped.
+
+2014-01-04  Mark Wielaard  <mjw at redhat.com>
+
 	* backtrace-subr.sh (check_native_core): Skip, exit 77, the test
 	if we cannot adjust core ulimit.
 
diff --git a/tests/backtrace-data.c b/tests/backtrace-data.c
index 9fa3c4a..dd74160 100644
--- a/tests/backtrace-data.c
+++ b/tests/backtrace-data.c
@@ -278,7 +278,7 @@ main (int argc __attribute__ ((unused)), char **argv __attribute__ ((unused)))
       assert_perror (errno);
       assert (l == 0);
       raise (SIGUSR1);
-      assert (0);
+      return 0;
     default:
       break;
   }
diff --git a/tests/backtrace-dwarf.c b/tests/backtrace-dwarf.c
index 3a3e763..f75e120 100644
--- a/tests/backtrace-dwarf.c
+++ b/tests/backtrace-dwarf.c
@@ -42,7 +42,7 @@ report_pid (Dwfl *dwfl, pid_t pid)
   if (dwfl_report_end (dwfl, NULL, NULL) != 0)
     error (2, 0, "dwfl_report_end: %s", dwfl_errmsg (-1));
 
-  result = dwfl_linux_proc_attach (dwfl, pid, false);
+  result = dwfl_linux_proc_attach (dwfl, pid, true);
   if (result < 0)
     error (2, 0, "dwfl_linux_proc_attach: %s", dwfl_errmsg (-1));
   else if (result > 0)
@@ -106,15 +106,6 @@ thread_callback (Dwfl_Thread *thread, void *thread_arg)
   error (1, 0, "dwfl_thread_getframes: %s", dwfl_errmsg (-1));
 }
 
-static void
-ptrace_detach_stopped (pid_t pid)
-{
-  errno = 0;
-  long l = ptrace (PTRACE_DETACH, pid, NULL, (void *) (intptr_t) SIGSTOP);
-  assert_perror (errno);
-  assert (l == 0);
-}
-
 int
 main (int argc __attribute__ ((unused)), char **argv)
 {
@@ -151,8 +142,6 @@ main (int argc __attribute__ ((unused)), char **argv)
   assert (WIFSTOPPED (status));
   assert (WSTOPSIG (status) == SIGABRT);
 
-  ptrace_detach_stopped (pid);
-
   Dwfl *dwfl = pid_to_dwfl (pid);
   dwfl_getthreads (dwfl, thread_callback, NULL);
 
diff --git a/tests/backtrace.c b/tests/backtrace.c
index 64f90c4..758dfed 100644
--- a/tests/backtrace.c
+++ b/tests/backtrace.c
@@ -260,15 +260,6 @@ prepare_thread (pid_t pid2 __attribute__ ((unused)),
 #define tgkill(pid, tid, sig) syscall (__NR_tgkill, (pid), (tid), (sig))
 
 static void
-ptrace_detach_stopped (pid_t pid)
-{
-  errno = 0;
-  long l = ptrace (PTRACE_DETACH, pid, NULL, (void *) (intptr_t) SIGSTOP);
-  assert_perror (errno);
-  assert (l == 0);
-}
-
-static void
 report_pid (Dwfl *dwfl, pid_t pid)
 {
   int result = dwfl_linux_proc_report (dwfl, pid);
@@ -280,7 +271,7 @@ report_pid (Dwfl *dwfl, pid_t pid)
   if (dwfl_report_end (dwfl, NULL, NULL) != 0)
     error (2, 0, "dwfl_report_end: %s", dwfl_errmsg (-1));
 
-  result = dwfl_linux_proc_attach (dwfl, pid, false);
+  result = dwfl_linux_proc_attach (dwfl, pid, true);
   if (result < 0)
     error (2, 0, "dwfl_linux_proc_attach: %s", dwfl_errmsg (-1));
   else if (result > 0)
@@ -397,8 +388,6 @@ exec_dump (const char *exec)
       prepare_thread (pid2, jmp);
     }
   dwfl_end (dwfl);
-  ptrace_detach_stopped (pid);
-  ptrace_detach_stopped (pid2);
   check_tid = pid2;
   dwfl = pid_to_dwfl (pid);
   dump (dwfl);
-- 
1.8.4.2



More information about the elfutils-devel mailing list