1#!/usr/bin/python 2# 3# show_deltas: Read list of printk messages instrumented with 4# time data, and format with time deltas. 5# 6# Also, you can show the times relative to a fixed point. 7# 8# Copyright 2003 Sony Corporation 9# 10# GPL 2.0 applies. 11 12import sys 13import string 14 15def usage(): 16 print """usage: show_delta [<options>] <filename> 17 18This program parses the output from a set of printk message lines which 19have time data prefixed because the CONFIG_PRINTK_TIME option is set, or 20the kernel command line option "time" is specified. When run with no 21options, the time information is converted to show the time delta between 22each printk line and the next. When run with the '-b' option, all times 23are relative to a single (base) point in time. 24 25Options: 26 -h Show this usage help. 27 -b <base> Specify a base for time references. 28 <base> can be a number or a string. 29 If it is a string, the first message line 30 which matches (at the beginning of the 31 line) is used as the time reference. 32 33ex: $ dmesg >timefile 34 $ show_delta -b NET4 timefile 35 36will show times relative to the line in the kernel output 37starting with "NET4". 38""" 39 sys.exit(1) 40 41# returns a tuple containing the seconds and text for each message line 42# seconds is returned as a float 43# raise an exception if no timing data was found 44def get_time(line): 45 if line[0]!="[": 46 raise ValueError 47 48 # split on closing bracket 49 (time_str, rest) = string.split(line[1:],']',1) 50 time = string.atof(time_str) 51 52 #print "time=", time 53 return (time, rest) 54 55 56# average line looks like: 57# [ 0.084282] VFS: Mounted root (romfs filesystem) readonly 58# time data is expressed in seconds.useconds, 59# convert_line adds a delta for each line 60last_time = 0.0 61def convert_line(line, base_time): 62 global last_time 63 64 try: 65 (time, rest) = get_time(line) 66 except: 67 # if any problem parsing time, don't convert anything 68 return line 69 70 if base_time: 71 # show time from base 72 delta = time - base_time 73 else: 74 # just show time from last line 75 delta = time - last_time 76 last_time = time 77 78 return ("[%5.6f < %5.6f >]" % (time, delta)) + rest 79 80def main(): 81 base_str = "" 82 filein = "" 83 for arg in sys.argv[1:]: 84 if arg=="-b": 85 base_str = sys.argv[sys.argv.index("-b")+1] 86 elif arg=="-h": 87 usage() 88 else: 89 filein = arg 90 91 if not filein: 92 usage() 93 94 try: 95 lines = open(filein,"r").readlines() 96 except: 97 print "Problem opening file: %s" % filein 98 sys.exit(1) 99 100 if base_str: 101 print 'base= "%s"' % base_str 102 # assume a numeric base. If that fails, try searching 103 # for a matching line. 104 try: 105 base_time = float(base_str) 106 except: 107 # search for line matching <base> string 108 found = 0 109 for line in lines: 110 try: 111 (time, rest) = get_time(line) 112 except: 113 continue 114 if string.find(rest, base_str)==1: 115 base_time = time 116 found = 1 117 # stop at first match 118 break 119 if not found: 120 print 'Couldn\'t find line matching base pattern "%s"' % base_str 121 sys.exit(1) 122 else: 123 base_time = 0.0 124 125 for line in lines: 126 print convert_line(line, base_time), 127 128main() 129 130