Home | History | Annotate | Download | only in ioshark
      1 #!/bin/sh
      2 
      3 # This function just re-writes the timestamp of the strace entries to be
      4 # seconds.usecs since boot. To match the timestamping of ftrace (so we can
      5 # merge them later).
      6 process_strace()
      7 {
      8     strace=$1
      9     # parse in data/system/vendor and parse out /sys/devices/system/...
     10     egrep '\/system\/|\/data\/|\/vendor\/' $strace | egrep -v '\/sys\/devices\/system\/' > bar
     11     fgrep -v '= -1' bar > foo
     12     mv foo bar
     13     # begin_time is seconds since epoch
     14     begin_time=`cat trace.begin`
     15     # replace seconds since epoch with SECONDS SINCE BOOT in the
     16     # strace files
     17     awk -v begin="$begin_time" '{ printf "%f strace ", $1 - begin; $1=""; print $0}' bar > $2
     18     rm bar
     19 }
     20 
     21 #
     22 # This function processes the ftrace file, removing the fields that we don't care
     23 # about, breaks up the ftrace file into one file per pid.
     24 # Input : One single fstrace file.
     25 # Output : Multiple fstrace.pid files.
     26 prep_fstrace()
     27 {
     28     # Remove leading junk
     29     fgrep android_fs_data $1 | sed 's/^.* \[.*\] //' | sed s/://g | sed s/,//g > foo
     30     sed 's/android_fs_dataread_start/read/' foo > bar1
     31     mv bar1 bar
     32     # First column is timestamp SECONDS SINCE BOOT
     33     awk '{ print $2, "ftrace", $3, $5, $7, $9, $13 }' bar > foo
     34     rm bar
     35     # Get all the uniq pids
     36     awk '{print $7}' foo | sort | uniq > pidlist
     37     for i in `cat pidlist`
     38     do
     39 	awk -v pid=$i '{ if (pid == $7) print $0}' foo > fstrace.$i
     40     done
     41     rm pidlist
     42     rm foo
     43 }
     44 
     45 # Merge straces and ftraces.
     46 # The goal here is to catch mmap'ed IO (reads) that won't be in the
     47 # strace file. The algorithm is to look for mmaps in the strace file,
     48 # use the files tha are mmap'ed to search in the ftraces to pick up
     49 # tracepoints from there, and merge those with the straces.
     50 # The output of this function is a set of parsed_input_trace.<pid>
     51 # files, that can then be compiled into .wl files
     52 merge_compile()
     53 {
     54     for stracefile in trace.*
     55     do
     56 	if [ $stracefile == trace.begin ] || [ $stracefile == trace.tar ];
     57 	then
     58 	    continue
     59 	fi
     60 	# Get the pid from the strace filename (pid is the extension)
     61 	pid=${stracefile##*.}
     62 	process_strace $stracefile foo.$pid
     63 	if ! [ -s foo.$pid ]; then
     64 	    rm foo.$pid
     65 	    continue
     66 	fi
     67 	#
     68 	# If we have matching strace and ftrace files, then look for mmaps in
     69 	# the strace pluck the corresponding entries for the mmap (mmaped IO)
     70 	# from the ftrace and merge them into the strace
     71 	#
     72 	if [ -f fstrace.$pid ]; then
     73 	    fgrep mmap foo.$pid > bar
     74 	    if [ -s bar ]; then
     75 		# Get all the unique mmap'ed filenames from the strace
     76 		awk '{ print $7 }' bar | sed 's/^[^<]*<//g' | sed 's/>,//g' > mapped_files
     77 		# Pluck all the lines from the ftrace corresponding to the mmaps
     78 		cat /dev/null > footemp
     79 		for j in `sort mapped_files | uniq`
     80 		do
     81 		    # Merge the readpage(s) traces from the ftrace into strace
     82 		    # for this mmaped file.
     83 		    grep -w $j fstrace.$pid > foobar
     84 		    if [ $? == 0 ]; then
     85 			sort foo.$pid foobar >> footemp
     86 		    fi
     87 		    rm foobar
     88 		done
     89 		rm mapped_files
     90 		if [ -s footemp ]; then
     91 		    mv footemp parsed_input_trace.$pid
     92 		else
     93 		    mv foo.$pid parsed_input_trace.$pid
     94 		fi
     95 	    else
     96 		mv foo.$pid parsed_input_trace.$pid
     97 	    fi
     98 	    rm bar
     99 	else
    100 	    mv foo.$pid parsed_input_trace.$pid
    101 	fi
    102 	echo compiling parsed_input_trace.$pid
    103 	compile_ioshark parsed_input_trace.$pid $pid.wl
    104 	rm parsed_input_trace.$pid
    105 	rm -f foo.$pid
    106     done
    107 }
    108 
    109 # main() starts here
    110 
    111 rm -f *.wl
    112 rm -f parsed*
    113 rm ioshark_filenames
    114 
    115 # Pre-process the ftrace file
    116 prep_fstrace fstrace
    117 # Merge the ftrace file(s) with the strace files
    118 merge_compile
    119 
    120 # tar up the .wl files just created
    121 tar cf wl-test.tar ioshark_filenames *.wl
    122