diff options
author | Dmitry V. Levin <ldv@altlinux.org> | 2015-02-12 22:43:02 +0000 |
---|---|---|
committer | Dmitry V. Levin <ldv@altlinux.org> | 2015-02-12 23:24:46 +0000 |
commit | d8b3404555b9a324610d0caaa0b9237f14605818 (patch) | |
tree | 830eff0ba392f811ac96d0c492d705b6789ee77d | |
parent | 67d0a8ecfa288928c2096123a9ddfb0e5392edbf (diff) | |
download | strace-d8b3404555b9a324610d0caaa0b9237f14605818.tar.gz |
Enhance wait status decoding
* xlat/ptrace_events.in: New file.
* wait.c: Include "xlat/ptrace_events.h".
(printstatus): In case of WIFSTOPPED, print 0x80 flag separately from
the stop signal name.
[WIFCONTINUED]: Add WIFCONTINUED support.
Decode PTRACE_EVENT_* events.
-rw-r--r-- | wait.c | 35 | ||||
-rw-r--r-- | xlat/ptrace_events.in | 8 |
2 files changed, 36 insertions, 7 deletions
@@ -29,6 +29,11 @@ #ifndef W_EXITCODE # define W_EXITCODE(ret, sig) ((ret) << 8 | (sig)) #endif +#ifndef W_CONTINUED +# define W_CONTINUED 0xffff +#endif + +#include "xlat/ptrace_events.h" static int printstatus(int status) @@ -41,9 +46,11 @@ printstatus(int status) * are no wait status constructors it will have to do. */ if (WIFSTOPPED(status)) { - tprintf("[{WIFSTOPPED(s) && WSTOPSIG(s) == %s}", - signame(WSTOPSIG(status))); - status &= ~W_STOPCODE(WSTOPSIG(status)); + int sig = WSTOPSIG(status); + tprintf("[{WIFSTOPPED(s) && WSTOPSIG(s) == %s%s}", + signame(sig & 0x7f), + sig & 0x80 ? " | 0x80" : ""); + status &= ~W_STOPCODE(sig); } else if (WIFSIGNALED(status)) { tprintf("[{WIFSIGNALED(s) && WTERMSIG(s) == %s%s}", @@ -57,15 +64,29 @@ printstatus(int status) exited = 1; status &= ~W_EXITCODE(WEXITSTATUS(status), 0); } +#ifdef WIFCONTINUED + else if (WIFCONTINUED(status)) { + tprints("[{WIFCONTINUED(s)}"); + status &= ~W_CONTINUED; + } +#endif else { tprintf("[%#x]", status); return 0; } - if (status == 0) - tprints("]"); - else - tprintf(" | %#x]", status); + if (status) { + unsigned int event = (unsigned int) status >> 16; + if (event) { + tprints(" | "); + printxval(ptrace_events, event, "PTRACE_EVENT_???"); + tprints(" << 16"); + status &= 0xffff; + } + if (status) + tprintf(" | %#x", status); + } + tprints("]"); return exited; } diff --git a/xlat/ptrace_events.in b/xlat/ptrace_events.in new file mode 100644 index 000000000..9e8f2a1ea --- /dev/null +++ b/xlat/ptrace_events.in @@ -0,0 +1,8 @@ +PTRACE_EVENT_FORK +PTRACE_EVENT_VFORK +PTRACE_EVENT_CLONE +PTRACE_EVENT_EXEC +PTRACE_EVENT_VFORK_DONE +PTRACE_EVENT_EXIT +PTRACE_EVENT_SECCOMP +PTRACE_EVENT_STOP |