[PATCH v4 1/4] Option to print only failing syscalls

Paul Chaignon paul.chaignon at gmail.com
Sat Jun 15 17:29:23 UTC 2019


Existing -z option prints only successful syscalls.  This patch adds a -Z
option to print only failing syscalls.

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 512ad51f..9745078b 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 318b1409..d9cff343 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);
@@ -1585,7 +1587,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);
@@ -1716,6 +1718,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