[PATCH v6 1/4] Option to print only failing syscalls
Paul Chaignon
paul.chaignon at gmail.com
Fri Jul 5 17:04:29 UTC 2019
Existing -z option prints only successful syscalls. This patch adds a -Z
option to print only failing syscalls.
* strace.c (init): Handle new -Z option.
* syscall.c (syscall_exiting_trace): Ignore failed syscalls if
failing_only is set.
* defs.h (failing_only): Expose new variable.
Resolves https://github.com/strace/strace/issues/50.
Signed-off-by: Paul Chaignon <paul.chaignon at gmail.com>
Co-Authored-by: Burkhard Kohl <burkhard.kohl at intel.com>
---
defs.h | 1 +
strace.c | 9 +++++++--
syscall.c | 6 ++++--
3 files changed, 12 insertions(+), 4 deletions(-)
diff --git a/defs.h b/defs.h
index a9c36d15..ca458d40 100644
--- a/defs.h
+++ b/defs.h
@@ -417,6 +417,7 @@ extern bool iflag;
extern bool count_wallclock;
extern unsigned int qflag;
extern bool not_failing_only;
+extern bool failing_only;
extern unsigned int show_fd_path;
/* are we filtering traces based on paths? */
extern struct path_set {
diff --git a/strace.c b/strace.c
index f7dfdaa5..24ddd53d 100644
--- a/strace.c
+++ b/strace.c
@@ -109,8 +109,9 @@ static bool daemonized_tracer;
static int post_attach_sigstop = TCB_IGNORE_ONE_SIGSTOP;
#define use_seize (post_attach_sigstop == 0)
-/* Sometimes we want to print only succeeding syscalls. */
+/* Sometimes we want to print succeeding/failing syscalls only. */
bool not_failing_only;
+bool failing_only;
/* Show path associated with fd arguments */
unsigned int show_fd_path;
@@ -304,6 +305,7 @@ Miscellaneous:\n\
*/
/* this is broken, so don't document it
-z -- print only succeeding syscalls\n\
+-Z -- print only failing syscalls\n\
*/
, DEFAULT_ACOLUMN, DEFAULT_STRLEN, DEFAULT_SORTBY);
exit(0);
@@ -1579,7 +1581,7 @@ init(int argc, char *argv[])
#ifdef ENABLE_STACKTRACE
"k"
#endif
- "a:Ab:cCdDe:E:fFhiI:o:O:p:P:qrs:S:tTu:vVwxX:yz")) != EOF) {
+ "a:Ab:cCdDe:E:fFhiI:o:O:p:P:qrs:S:tTu:vVwxX:yzZ")) != EOF) {
switch (c) {
case 'a':
acolumn = string_to_uint(optarg);
@@ -1710,6 +1712,9 @@ init(int argc, char *argv[])
case 'z':
not_failing_only = 1;
break;
+ case 'Z':
+ failing_only = 1;
+ break;
default:
error_msg_and_help(NULL);
break;
diff --git a/syscall.c b/syscall.c
index bae7343c..29dfb7a7 100644
--- a/syscall.c
+++ b/syscall.c
@@ -765,8 +765,10 @@ syscall_exiting_trace(struct tcb *tcp, struct timespec *ts, int res)
* whereas the intended result is that open(...) line
* is not shown at all.
*/
- if (not_failing_only && tcp->u_error)
- return 0; /* ignore failed syscalls */
+ if ((not_failing_only && syserror(tcp)) ||
+ (failing_only && !syserror(tcp)))
+ return 0; /* ignore failed/successful
+ * syscalls */
if (tcp->sys_func_rval & RVAL_DECODED)
sys_res = tcp->sys_func_rval;
else
--
2.17.1
More information about the Strace-devel
mailing list