linux-yocto/scripts/show_delta
Linus Torvalds 1da177e4c3 Linux-2.6.12-rc2
Initial git repository build. I'm not bothering with the full history,
even though we have it. We can create a separate "historical" git
archive of that later if we want to, and in the meantime it's about
3.2GB when imported into git - space that would just make the early
git days unnecessarily complicated, when we don't have a lot of good
infrastructure for it.

Let it rip!
2005-04-16 15:20:36 -07:00

3.0 KiB

#!/usr/bin/env python

show_deltas: Read list of printk messages instrumented with

time data, and format with time deltas.

Also, you can show the times relative to a fixed point.

Copyright 2003 Sony Corporation

GPL 2.0 applies.

import sys import string

def usage(): print """usage: show_delta []

This program parses the output from a set of printk message lines which have time data prefixed because the CONFIG_PRINTK_TIME option is set, or the kernel command line option "time" is specified. When run with no options, the time information is converted to show the time delta between each printk line and the next. When run with the '-b' option, all times are relative to a single (base) point in time.

Options: -h Show this usage help. -b Specify a base for time references. can be a number or a string. If it is a string, the first message line which matches (at the beginning of the line) is used as the time reference.

ex: $ dmesg >timefile $ show_delta -b NET4 timefile

will show times relative to the line in the kernel output starting with "NET4". """ sys.exit(1)

returns a tuple containing the seconds and text for each message line

seconds is returned as a float

raise an exception if no timing data was found

def get_time(line): if line[0]!="[": raise ValueError

# split on closing bracket
(time_str, rest) = string.split(line[1:],']',1)
time = string.atof(time_str)

#print "time=", time
return (time, rest)

average line looks like:

[ 0.084282] VFS: Mounted root (romfs filesystem) readonly

time data is expressed in seconds.useconds,

convert_line adds a delta for each line

last_time = 0.0 def convert_line(line, base_time): global last_time

try:
	(time, rest) = get_time(line)
except:
	# if any problem parsing time, don't convert anything
	return line

if base_time:
	# show time from base
	delta = time - base_time
else:
	# just show time from last line
	delta = time - last_time
	last_time = time

return ("[%5.6f < %5.6f >]" % (time, delta)) + rest

def main(): base_str = "" filein = "" for arg in sys.argv[1:]: if arg=="-b": base_str = sys.argv[sys.argv.index("-b")+1] elif arg=="-h": usage() else: filein = arg

if not filein:
	usage()

try:
	lines = open(filein,"r").readlines()
except:
	print "Problem opening file: %s" % filein
	sys.exit(1)

if base_str:
	print 'base= "%s"' % base_str
	# assume a numeric base.  If that fails, try searching
	# for a matching line.
	try:
		base_time = float(base_str)
	except:
		# search for line matching <base> string
		found = 0
		for line in lines:
			try:
				(time, rest) = get_time(line)
			except:
				continue
			if string.find(rest, base_str)==1:
				base_time = time
				found = 1
				# stop at first match
				break
		if not found:
			print 'Couldn\'t find line matching base pattern "%s"' % base_str
			sys.exit(1)
else:
	base_time = 0.0

for line in lines:
	print convert_line(line, base_time),

main()