#ifdef HAVE_PRCTL
# include <sys/prctl.h>
#endif
+#include <asm/unistd.h>
+#include "scno.h"
#include "ptrace.h"
#include "printsiginfo.h"
bool stack_trace_enabled = false;
#endif
-#if defined __NR_tkill
-# define my_tkill(tid, sig) syscall(__NR_tkill, (tid), (sig))
-#else
- /* kill() may choose arbitrarily the target task of the process group
- while we later wait on a that specific TID. PID process waits become
- TID task specific waits for a process under ptrace(2). */
-# warning "tkill(2) not available, risk of strace hangs!"
-# define my_tkill(tid, sig) kill((tid), (sig))
-#endif
+#define my_tkill(tid, sig) syscall(__NR_tkill, (tid), (sig))
/* Glue for systems without a MMU that cannot provide fork() */
#if !defined(HAVE_FORK)
#endif /* HAVE_STERRROR */
+static void
+print_version(void)
+{
+ printf("%s -- version %s\n"
+ "Copyright (C) %s The strace developers <%s>.\n"
+ "This is free software; see the source for copying conditions. There is NO\n"
+ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n",
+ PACKAGE_NAME, PACKAGE_VERSION, "1991-2017", PACKAGE_URL);
+}
+
static void
usage(void)
{
Output format:\n\
-a column alignment COLUMN for printing syscall results (default %d)\n\
-i print instruction pointer at time of syscall\n\
+"
+#ifdef USE_LIBUNWIND
+"\
+ -k obtain stack trace between each syscall (experimental)\n\
+"
+#endif
+"\
-o file send trace output to FILE instead of stderr\n\
-q suppress messages about attaching, detaching, etc.\n\
-r print relative timestamp\n\
-h print help message\n\
-V print version\n\
"
-#ifdef USE_LIBUNWIND
-" -k obtain stack trace between each syscall (experimental)\n\
-"
-#endif
/* ancient, no one should use it
-F -- attempt to follow vforks (deprecated, use -f)\n\
*/
va_start(args, fmt);
if (current_tcp) {
- int n = strace_vfprintf(current_tcp->outf, fmt, args);
+ int n = vfprintf(current_tcp->outf, fmt, args);
if (n < 0) {
if (current_tcp->outf != stderr)
perror_msg("%s", outfname);
int p;
for (p = 0; p < SUPPORTED_PERSONALITIES; ++p)
- free(tcp->fault_vec[p]);
+ free(tcp->inject_vec[p]);
free_tcb_priv_data(tcp);
}
if (!WIFSTOPPED(status) || WSTOPSIG(status) != SIGSTOP) {
kill_save_errno(pid, SIGKILL);
- perror_msg_and_die("Unexpected wait status %x", status);
+ perror_msg_and_die("Unexpected wait status %#x",
+ status);
}
}
/* Else: NOMMU case, we have no way to sync.
if (WIFSIGNALED(status)) {
return;
}
- error_msg_and_die("%s: unexpected wait status %x",
- __func__, status);
+ error_msg_and_die("%s: unexpected wait status %#x",
+ __func__, status);
}
}
#else /* !USE_SEIZE */
qualify("abbrev=none");
break;
case 'V':
- printf("%s -- version %s\n", PACKAGE_NAME, VERSION);
+ print_version();
exit(0);
break;
case 'z':
struct tcb *execve_thread;
long old_pid = 0;
- if (ptrace(PTRACE_GETEVENTMSG, pid, NULL, (long) &old_pid) < 0)
+ if (ptrace(PTRACE_GETEVENTMSG, pid, NULL, &old_pid) < 0)
return tcp;
/* Avoid truncation in pid2tcb() param passing */
if (old_pid <= 0 || old_pid == pid)
* TODO: shouldn't we check for errno == EINVAL too?
* We can get ESRCH instead, you know...
*/
- stopped = ptrace(PTRACE_GETSIGINFO, pid, 0, (long) &si) < 0;
+ stopped = ptrace(PTRACE_GETSIGINFO, pid, 0, &si) < 0;
#if USE_SEIZE
show_stopsig:
#endif
* This should be syscall entry or exit.
* Handle it.
*/
- if (trace_syscall(tcp) < 0) {
+ sig = 0;
+ if (trace_syscall(tcp, &sig) < 0) {
/*
* ptrace() failed in trace_syscall().
* Likely a result of process disappearing mid-flight.
*/
return true;
}
+ goto restart_tracee;
restart_tracee_with_sig_0:
sig = 0;