[PATCH v5] Print absolute paths in printpathn when -yy is used

Zubin Mithra zubin.mithra at gmail.com
Thu Aug 7 17:21:32 UTC 2014


Hello,

On Tue, Jul 1, 2014 at 3:13 PM, <zubin.mithra at gmail.com> wrote:

> From: Zubin Mithra <zubin.mithra at gmail.com>
>
> * defs.h (show_fd_path): Change type to unsigned int.
> * strace.c (show_fd_path): Update usage to count y flag.
> (usage): Update to add -yy option.
> * util.c (print_tracee_cwd): New function.
> (printpathn): Update to use print_tracee_cwd and print
>  absolute path.
> * strace.1: Add description of -yy option.
>
> Signed-off-by: Zubin Mithra <zubin.mithra at gmail.com>
> ---
>  defs.h   |  2 +-
>  strace.1 |  3 +++
>  strace.c |  5 +++--
>  util.c   | 38 ++++++++++++++++++++++++++++++++++++++
>  4 files changed, 45 insertions(+), 3 deletions(-)
>
> diff --git a/defs.h b/defs.h
> index 1a3b483..050341d 100644
> --- a/defs.h
> +++ b/defs.h
> @@ -562,7 +562,7 @@ extern bool iflag;
>  extern bool count_wallclock;
>  extern unsigned int qflag;
>  extern bool not_failing_only;
> -extern bool show_fd_path;
> +extern unsigned int show_fd_path;
>  extern bool hide_log_until_execve;
>  /* are we filtering traces based on paths? */
>  extern const char **paths_selected;
> diff --git a/strace.1 b/strace.1
> index 2a24c38..4504359 100644
> --- a/strace.1
> +++ b/strace.1
> @@ -321,6 +321,9 @@ Print all strings in hexadecimal string format.
>  .B \-y
>  Print paths associated with file descriptor arguments.
>  .TP
> +.B \-yy
> +Print absolute paths instead of relative paths everywhere.
> +.TP
>  .BI "\-a " column
>  Align return values in a specific column (default column 40).
>  .TP
> diff --git a/strace.c b/strace.c
> index 4154cde..28e2488 100644
> --- a/strace.c
> +++ b/strace.c
> @@ -129,7 +129,7 @@ static int post_attach_sigstop =
> TCB_IGNORE_ONE_SIGSTOP;
>  bool not_failing_only = 0;
>
>  /* Show path associated with fd arguments */
> -bool show_fd_path = 0;
> +unsigned int show_fd_path = 0;
>
>  static bool detach_on_execve = 0;
>  /* Are we "strace PROG" and need to skip detach on first execve? */
> @@ -216,6 +216,7 @@ usage: strace [-CdffhiqrtttTvVxxy] [-I n] [-e
> expr]...\n\
>  -v -- verbose mode: print unabbreviated argv, stat, termios, etc. args\n\
>  -x -- print non-ascii strings in hex, -xx -- print all strings in hex\n\
>  -y -- print paths associated with file descriptor arguments\n\
> +-yy -- print absolute paths instead of relative paths everywhere\n\
>  -h -- print help message, -V -- print version\n\
>  -a column -- alignment COLUMN for printing syscall results (default %d)\n\
>  -b execve -- detach on this syscall\n\
> @@ -1734,7 +1735,7 @@ init(int argc, char *argv[])
>                         xflag++;
>                         break;
>                 case 'y':
> -                       show_fd_path = 1;
> +                       show_fd_path++;
>                         break;
>                 case 'v':
>                         qualify("abbrev=none");
> diff --git a/util.c b/util.c
> index 33482d5..0c34b77 100644
> --- a/util.c
> +++ b/util.c
> @@ -563,6 +563,37 @@ string_quote(const char *instr, char *outstr, long
> len, int size)
>         return 0;
>  }
>
> +
> +/*
> + * Print the current working directory of the tracee process
> + */
> +static bool
> +print_tracee_cwd(struct tcb *tcp)
> +{
> +       int link_size = sizeof("/proc//cwd") + sizeof(int) * 3;
> +       char linkpath[link_size];
> +       char cwd[MAXPATHLEN + 2];
> +       ssize_t n;
> +
> +       snprintf(linkpath, link_size, "/proc/%u/cwd", tcp->pid);
> +       n = readlink(linkpath, cwd, MAXPATHLEN);
> +
> +       if (n > 0) {
> +               char *outstr;
> +
> +               cwd[n++] = '/';
> +               cwd[n++] = '\0';
> +
> +               /* cwd has n-1 characters followed by a null */
> +               outstr = alloca(4 * n); /* 4*(n-1) + 3 for quotes and NUL
> */
> +               string_quote(cwd, outstr, -1, n);
> +               outstr[strlen(outstr)-1] = '\0'; /* Don't print the
> closing quotes */
> +               tprints(outstr);
> +               return true;
> +       }
> +       return false;
> +}
> +
>  /*
>   * Print path string specified by address `addr' and length `n'.
>   * If path length exceeds `n', append `...' to the output.
> @@ -588,11 +619,18 @@ printpathn(struct tcb *tcp, long addr, int n)
>                 tprintf("%#lx", addr);
>         else {
>                 char *outstr;
> +               bool prefix_printed = false;
>
>                 path[n] = '\0';
> +               if (show_fd_path > 1 && *path && *path != '/')
> +                       prefix_printed = print_tracee_cwd(tcp);
>                 n++;
>                 outstr = alloca(4 * n); /* 4*(n-1) + 3 for quotes and NUL
> */
>                 string_quote(path, outstr, -1, n);
> +
> +               /* Dont print opening quotes if cwd is printed */
> +               if (prefix_printed)
> +                       outstr += 1;
>                 tprints(outstr);
>                 if (!nul_seen)
>                         tprints("...");
> --
> 1.8.4
>
>
Could someone take a look at this patch please? There is a "-yy
documentation part" and a "change show_fd_path to unsigned int" which need
not be a part of another patch I just submitted(sockfd decoding related) if
this could be merged.


Thanks!
-- zm
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.strace.io/pipermail/strace-devel/attachments/20140807/65ec9d4b/attachment.html>


More information about the Strace-devel mailing list