Hi Zubin, On Fri, May 30, 2014 at 12:27:21PM +0530, zubin.mit...@gmail.com wrote: > From: Zubin Mithra <zubin.mit...@gmail.com> > > * defs.h (returns_fd): New prototype. > * util.c (returns_fd): New function that checks if the tcb refers > to a function that returns a file descriptor. > * syscall.c (trace_syscall_exiting): Use returns_fd to determine whether > tcp->u_rval is a file descriptor. > > Signed-off-by: Zubin Mithra <zubin.mit...@gmail.com> > --- > defs.h | 1 + > syscall.c | 7 ++++++- > util.c | 11 +++++++++++ > 3 files changed, 18 insertions(+), 1 deletion(-) > > diff --git a/defs.h b/defs.h > index 4e06a92..25551a3 100644 > --- a/defs.h > +++ b/defs.h > @@ -625,6 +625,7 @@ extern long getrval2(struct tcb *); > */ > extern int setbpt(struct tcb *); > extern int clearbpt(struct tcb *); > +extern bool returns_fd(struct tcb *); > > extern const char *signame(int); > extern void pathtrace_select(const char *); > diff --git a/syscall.c b/syscall.c > index 28bdb66..e6ad7ad 100644 > --- a/syscall.c > +++ b/syscall.c > @@ -2669,7 +2669,12 @@ trace_syscall_exiting(struct tcb *tcp) > tprintf("= %lu", tcp->u_rval); > break; > case RVAL_DECIMAL: > - tprintf("= %ld", tcp->u_rval); > + if (show_fd_path && returns_fd(tcp)) { > + tprints("= "); > + printfd(tcp, tcp->u_rval); > + } > + else > + tprintf("= %ld", tcp->u_rval); > break; > #if defined(LINUX_MIPSN32) || defined(X32) > /* > diff --git a/util.c b/util.c > index ff18b87..e47297a 100644 > --- a/util.c > +++ b/util.c > @@ -1549,3 +1549,14 @@ clearbpt(struct tcb *tcp) > tcp->flags &= ~TCB_BPTSET; > return 0; > } > + > +bool > +returns_fd(struct tcb *tcp) > +{ > + return tcp->s_ent->sys_func == sys_open || > + tcp->s_ent->sys_func == sys_openat || > + tcp->s_ent->sys_func == sys_creat || > + tcp->s_ent->sys_func == sys_dup || > + tcp->s_ent->sys_func == sys_dup2 || > + tcp->s_ent->sys_func == sys_dup3; > +}
How did you test this change? Some of syscall handlers are implemented as aliases to other handlers, for example, sys_dup is aliased to sys_close. As result, return code of close would be interpreted as a file descriptor: $ strace -yeclose cat /dev/null close(3</etc/ld.so.cache>) = 0</dev/pts/1> close(3</lib64/libc-2.19.so>) = 0</dev/pts/1> close(3</dev/null>) = 0</dev/pts/1> close(1</dev/pts/1>) = 0</dev/pts/1> close(2</dev/pts/1>) = 0</dev/pts/1> +++ exited with 0 +++ Another example is sys_delete_module aliased to sys_open. -- ldv
pgpEi9DMcNETO.pgp
Description: PGP signature
------------------------------------------------------------------------------ Time is money. Stop wasting it! Get your web API in 5 minutes. www.restlet.com/download http://p.sf.net/sfu/restlet
_______________________________________________ Strace-devel mailing list Strace-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/strace-devel