Back to home page

LXR

 
 

    


0001 #!/usr/bin/python
0002 #
0003 # show_deltas: Read list of printk messages instrumented with
0004 # time data, and format with time deltas.
0005 #
0006 # Also, you can show the times relative to a fixed point.
0007 #
0008 # Copyright 2003 Sony Corporation
0009 #
0010 # GPL 2.0 applies.
0011 
0012 import sys
0013 import string
0014 
0015 def usage():
0016     print ("""usage: show_delta [<options>] <filename>
0017 
0018 This program parses the output from a set of printk message lines which
0019 have time data prefixed because the CONFIG_PRINTK_TIME option is set, or
0020 the kernel command line option "time" is specified. When run with no
0021 options, the time information is converted to show the time delta between
0022 each printk line and the next.  When run with the '-b' option, all times
0023 are relative to a single (base) point in time.
0024 
0025 Options:
0026   -h            Show this usage help.
0027   -b <base> Specify a base for time references.
0028         <base> can be a number or a string.
0029         If it is a string, the first message line
0030         which matches (at the beginning of the
0031         line) is used as the time reference.
0032 
0033 ex: $ dmesg >timefile
0034     $ show_delta -b NET4 timefile
0035 
0036 will show times relative to the line in the kernel output
0037 starting with "NET4".
0038 """)
0039     sys.exit(1)
0040 
0041 # returns a tuple containing the seconds and text for each message line
0042 # seconds is returned as a float
0043 # raise an exception if no timing data was found
0044 def get_time(line):
0045     if line[0]!="[":
0046         raise ValueError
0047 
0048     # split on closing bracket
0049     (time_str, rest) = string.split(line[1:],']',1)
0050     time = string.atof(time_str)
0051 
0052     #print "time=", time
0053     return (time, rest)
0054 
0055 
0056 # average line looks like:
0057 # [    0.084282] VFS: Mounted root (romfs filesystem) readonly
0058 # time data is expressed in seconds.useconds,
0059 # convert_line adds a delta for each line
0060 last_time = 0.0
0061 def convert_line(line, base_time):
0062     global last_time
0063 
0064     try:
0065         (time, rest) = get_time(line)
0066     except:
0067         # if any problem parsing time, don't convert anything
0068         return line
0069 
0070     if base_time:
0071         # show time from base
0072         delta = time - base_time
0073     else:
0074         # just show time from last line
0075         delta = time - last_time
0076         last_time = time
0077 
0078     return ("[%5.6f < %5.6f >]" % (time, delta)) + rest
0079 
0080 def main():
0081     base_str = ""
0082     filein = ""
0083     for arg in sys.argv[1:]:
0084         if arg=="-b":
0085             base_str = sys.argv[sys.argv.index("-b")+1]
0086         elif arg=="-h":
0087             usage()
0088         else:
0089             filein = arg
0090 
0091     if not filein:
0092         usage()
0093 
0094     try:
0095         lines = open(filein,"r").readlines()
0096     except:
0097         print ("Problem opening file: %s" % filein)
0098         sys.exit(1)
0099 
0100     if base_str:
0101         print ('base= "%s"' % base_str)
0102         # assume a numeric base.  If that fails, try searching
0103         # for a matching line.
0104         try:
0105             base_time = float(base_str)
0106         except:
0107             # search for line matching <base> string
0108             found = 0
0109             for line in lines:
0110                 try:
0111                     (time, rest) = get_time(line)
0112                 except:
0113                     continue
0114                 if string.find(rest, base_str)==1:
0115                     base_time = time
0116                     found = 1
0117                     # stop at first match
0118                     break
0119             if not found:
0120                 print ('Couldn\'t find line matching base pattern "%s"' % base_str)
0121                 sys.exit(1)
0122     else:
0123         base_time = 0.0
0124 
0125     for line in lines:
0126         print (convert_line(line, base_time),)
0127 
0128 main()