Modify strace to use the JSON framework. * Makefile.am: Add json.c to compile list. * strace.c(tprintf, tprints, usage, init): Add a new option '-j' in init(), Modify tprintf/tprints to use the basic JSON framework, Add 2 new function:_tprintf/_tprints for the original output. * strace.1: Add document for '-j' option. --- Makefile.am | 1 + strace.1 | 3 +++ strace.c | 45 +++++++++++++++++++++++++++++++++++++++------ 3 files changed, 43 insertions(+), 6 deletions(-)
diff --git a/Makefile.am b/Makefile.am index be05946..4ce8d44 100644 --- a/Makefile.am +++ b/Makefile.am @@ -29,6 +29,7 @@ strace_SOURCES = \ ioctl.c \ ioprio.c \ ipc.c \ + json.c \ kexec.c \ keyctl.c \ ldt.c \ diff --git a/strace.1 b/strace.1 index 2a24c38..d1bb3aa 100644 --- a/strace.1 +++ b/strace.1 @@ -267,6 +267,9 @@ Print the help summary. .B \-i Print the instruction pointer at the time of the system call. .TP +.B \-j +Print the trace results in JSON format. +.TP .B \-k Print the execution stack trace of the traced processes after each system call (experimental). .TP diff --git a/strace.c b/strace.c index 4154cde..deb636b 100644 --- a/strace.c +++ b/strace.c @@ -89,6 +89,8 @@ static unsigned int syscall_trap_sig = SIGTRAP; static unsigned int tflag = 0; static bool rflag = 0; static bool print_pid_pfx = 0; +/* Support option '-j' to enable JSON output */ +int jflag = 0; /* -I n */ enum { @@ -210,6 +212,7 @@ usage: strace [-CdffhiqrtttTvVxxy] [-I n] [-e expr]...\n\ -D -- run tracer process as a detached grandchild, not as parent\n\ -f -- follow forks, -ff -- with output into separate files\n\ -i -- print instruction pointer at time of syscall\n\ +-j -- print the trace results in JSON format\n\ -q -- suppress messages about attaching, detaching, etc.\n\ -r -- print relative timestamp, -t -- absolute timestamp, -tt -- with usecs\n\ -T -- print time spent in each syscall\n\ @@ -535,11 +538,8 @@ strace_popen(const char *command) } void -tprintf(const char *fmt, ...) +_tvprintf(const char *fmt, va_list args) { - va_list args; - - va_start(args, fmt); if (current_tcp) { int n = strace_vfprintf(current_tcp->outf, fmt, args); if (n < 0) { @@ -548,6 +548,21 @@ tprintf(const char *fmt, ...) } else current_tcp->curcol += n; } +} + +void +tprintf(const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + + // json_tprintf is defined in json.c + extern void json_tprintf(const char *fmt, va_list args); + if (jflag == 0) + _tvprintf(fmt, args); + else + json_tprintf(fmt, args); + va_end(args); } @@ -556,7 +571,7 @@ tprintf(const char *fmt, ...) #endif void -tprints(const char *str) +_tprints(const char *str) { if (current_tcp) { int n = fputs_unlocked(str, current_tcp->outf); @@ -570,6 +585,17 @@ tprints(const char *str) } void +tprints(const char *str) +{ + // json_tprints is defined in json.c + extern void json_tprints(const char *str); + if (jflag == 0) + _tprints(str); + else + json_tprints(str); +} + +void line_ended(void) { if (current_tcp) { @@ -1672,7 +1698,7 @@ init(int argc, char *argv[]) #endif qualify("signal=all"); while ((c = getopt(argc, argv, - "+b:cCdfFhiqrtTvVwxyz" + "+b:cCdfFhijqrtTvVwxyz" #ifdef USE_LIBUNWIND "k" #endif @@ -1715,6 +1741,13 @@ init(int argc, char *argv[]) case 'i': iflag = 1; break; + case 'j': + jflag = 1; // must before json_init() + if (json_init() == -1) { + fprintf(stderr, "json_init() failed, back to normal output.\n"); + jflag = 0; + } + break; case 'q': qflag++; break; -- 1.9.1 ------------------------------------------------------------------------------ Want fast and easy access to all the code in your enterprise? Index and search up to 200,000 lines of code with a free copy of Black Duck Code Sight - the same software that powers the world's largest code search on Ohloh, the Black Duck Open Hub! Try it now. http://p.sf.net/sfu/bds _______________________________________________ Strace-devel mailing list Strace-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/strace-devel