#elif defined BSD
ptrace(PT_TRACE_ME, 0, nullptr, 0);
#else
-# error "ptrace not declared on this platform"
+# error "no ptrace equivalent coded for this platform"
#endif
if(errno != 0 || raise(SIGSTOP) != 0)
xbt_die("Could not wait for the model-checker");
setup_ignore();
+#ifdef __linux__
ptrace(PTRACE_SETOPTIONS, pid, nullptr, PTRACE_O_TRACEEXIT);
ptrace(PTRACE_CONT, pid, 0, 0);
+#elif defined BSD
+ ptrace(PT_CONTINUE, pid, (caddr_t)1, 0);
+#else
+# error "no ptrace equivalent coded for this platform"
+#endif
}
static const std::pair<const char*, const char*> ignored_local_variables[] = {
if (pid == this->process().pid()) {
// From PTRACE_O_TRACEEXIT:
+#ifdef __linux__
if (status>>8 == (SIGTRAP | (PTRACE_EVENT_EXIT<<8))) {
if (ptrace(PTRACE_GETEVENTMSG, this->process().pid(), 0, &status) == -1)
xbt_die("Could not get exit status");
mc_model_checker->exit(SIMGRID_MC_EXIT_PROGRAM_CRASH);
}
}
+#endif
// We don't care about signals, just reinject them:
if (WIFSTOPPED(status)) {
XBT_DEBUG("Stopped with signal %i", (int) WSTOPSIG(status));
- if (ptrace(PTRACE_CONT, this->process().pid(), 0, WSTOPSIG(status)) == -1)
+ errno = 0;
+#ifdef __linux__
+ ptrace(PTRACE_CONT, this->process().pid(), 0, WSTOPSIG(status));
+#elif defined BSD
+ ptrace(PT_CONTINUE, this->process().pid(), nullptr, WSTOPSIG(status));
+#endif
+ if (errno != 0)
xbt_die("Could not PTRACE_CONT");
}