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@redhat.com>
+2014-01-04 Mark Wielaard <mjw@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@redhat.com>
* backtrace-subr.sh (check_native_core): Skip, exit 77, the test
assert_perror (errno);
assert (l == 0);
raise (SIGUSR1);
- assert (0);
+ return 0;
default:
break;
}
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)
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)
{
assert (WIFSTOPPED (status));
assert (WSTOPSIG (status) == SIGABRT);
- ptrace_detach_stopped (pid);
-
Dwfl *dwfl = pid_to_dwfl (pid);
dwfl_getthreads (dwfl, thread_callback, NULL);
#include <unistd.h>
#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)
{
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)
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);