1*c25ce589SFinn Behrens#!/usr/bin/env python 2acf14707SThomas Gleixner# SPDX-License-Identifier: GPL-2.0-only 31da177e4SLinus Torvalds# 41da177e4SLinus Torvalds# show_deltas: Read list of printk messages instrumented with 51da177e4SLinus Torvalds# time data, and format with time deltas. 61da177e4SLinus Torvalds# 71da177e4SLinus Torvalds# Also, you can show the times relative to a fixed point. 81da177e4SLinus Torvalds# 91da177e4SLinus Torvalds# Copyright 2003 Sony Corporation 101da177e4SLinus Torvalds# 111da177e4SLinus Torvalds 121da177e4SLinus Torvaldsimport sys 131da177e4SLinus Torvaldsimport string 141da177e4SLinus Torvalds 151da177e4SLinus Torvaldsdef usage(): 16f29b5f3eSMike Pagano print ("""usage: show_delta [<options>] <filename> 171da177e4SLinus Torvalds 181da177e4SLinus TorvaldsThis program parses the output from a set of printk message lines which 191da177e4SLinus Torvaldshave time data prefixed because the CONFIG_PRINTK_TIME option is set, or 201da177e4SLinus Torvaldsthe kernel command line option "time" is specified. When run with no 211da177e4SLinus Torvaldsoptions, the time information is converted to show the time delta between 221da177e4SLinus Torvaldseach printk line and the next. When run with the '-b' option, all times 231da177e4SLinus Torvaldsare relative to a single (base) point in time. 241da177e4SLinus Torvalds 251da177e4SLinus TorvaldsOptions: 261da177e4SLinus Torvalds -h Show this usage help. 271da177e4SLinus Torvalds -b <base> Specify a base for time references. 281da177e4SLinus Torvalds <base> can be a number or a string. 291da177e4SLinus Torvalds If it is a string, the first message line 301da177e4SLinus Torvalds which matches (at the beginning of the 311da177e4SLinus Torvalds line) is used as the time reference. 321da177e4SLinus Torvalds 331da177e4SLinus Torvaldsex: $ dmesg >timefile 341da177e4SLinus Torvalds $ show_delta -b NET4 timefile 351da177e4SLinus Torvalds 361da177e4SLinus Torvaldswill show times relative to the line in the kernel output 371da177e4SLinus Torvaldsstarting with "NET4". 38f29b5f3eSMike Pagano""") 391da177e4SLinus Torvalds sys.exit(1) 401da177e4SLinus Torvalds 411da177e4SLinus Torvalds# returns a tuple containing the seconds and text for each message line 421da177e4SLinus Torvalds# seconds is returned as a float 431da177e4SLinus Torvalds# raise an exception if no timing data was found 441da177e4SLinus Torvaldsdef get_time(line): 451da177e4SLinus Torvalds if line[0]!="[": 461da177e4SLinus Torvalds raise ValueError 471da177e4SLinus Torvalds 481da177e4SLinus Torvalds # split on closing bracket 491da177e4SLinus Torvalds (time_str, rest) = string.split(line[1:],']',1) 501da177e4SLinus Torvalds time = string.atof(time_str) 511da177e4SLinus Torvalds 521da177e4SLinus Torvalds #print "time=", time 531da177e4SLinus Torvalds return (time, rest) 541da177e4SLinus Torvalds 551da177e4SLinus Torvalds 561da177e4SLinus Torvalds# average line looks like: 571da177e4SLinus Torvalds# [ 0.084282] VFS: Mounted root (romfs filesystem) readonly 581da177e4SLinus Torvalds# time data is expressed in seconds.useconds, 591da177e4SLinus Torvalds# convert_line adds a delta for each line 601da177e4SLinus Torvaldslast_time = 0.0 611da177e4SLinus Torvaldsdef convert_line(line, base_time): 621da177e4SLinus Torvalds global last_time 631da177e4SLinus Torvalds 641da177e4SLinus Torvalds try: 651da177e4SLinus Torvalds (time, rest) = get_time(line) 661da177e4SLinus Torvalds except: 671da177e4SLinus Torvalds # if any problem parsing time, don't convert anything 681da177e4SLinus Torvalds return line 691da177e4SLinus Torvalds 701da177e4SLinus Torvalds if base_time: 711da177e4SLinus Torvalds # show time from base 721da177e4SLinus Torvalds delta = time - base_time 731da177e4SLinus Torvalds else: 741da177e4SLinus Torvalds # just show time from last line 751da177e4SLinus Torvalds delta = time - last_time 761da177e4SLinus Torvalds last_time = time 771da177e4SLinus Torvalds 781da177e4SLinus Torvalds return ("[%5.6f < %5.6f >]" % (time, delta)) + rest 791da177e4SLinus Torvalds 801da177e4SLinus Torvaldsdef main(): 811da177e4SLinus Torvalds base_str = "" 821da177e4SLinus Torvalds filein = "" 831da177e4SLinus Torvalds for arg in sys.argv[1:]: 841da177e4SLinus Torvalds if arg=="-b": 851da177e4SLinus Torvalds base_str = sys.argv[sys.argv.index("-b")+1] 861da177e4SLinus Torvalds elif arg=="-h": 871da177e4SLinus Torvalds usage() 881da177e4SLinus Torvalds else: 891da177e4SLinus Torvalds filein = arg 901da177e4SLinus Torvalds 911da177e4SLinus Torvalds if not filein: 921da177e4SLinus Torvalds usage() 931da177e4SLinus Torvalds 941da177e4SLinus Torvalds try: 951da177e4SLinus Torvalds lines = open(filein,"r").readlines() 961da177e4SLinus Torvalds except: 97f29b5f3eSMike Pagano print ("Problem opening file: %s" % filein) 981da177e4SLinus Torvalds sys.exit(1) 991da177e4SLinus Torvalds 1001da177e4SLinus Torvalds if base_str: 101f29b5f3eSMike Pagano print ('base= "%s"' % base_str) 1021da177e4SLinus Torvalds # assume a numeric base. If that fails, try searching 1031da177e4SLinus Torvalds # for a matching line. 1041da177e4SLinus Torvalds try: 1051da177e4SLinus Torvalds base_time = float(base_str) 1061da177e4SLinus Torvalds except: 1071da177e4SLinus Torvalds # search for line matching <base> string 1081da177e4SLinus Torvalds found = 0 1091da177e4SLinus Torvalds for line in lines: 1101da177e4SLinus Torvalds try: 1111da177e4SLinus Torvalds (time, rest) = get_time(line) 1121da177e4SLinus Torvalds except: 1131da177e4SLinus Torvalds continue 1141da177e4SLinus Torvalds if string.find(rest, base_str)==1: 1151da177e4SLinus Torvalds base_time = time 1161da177e4SLinus Torvalds found = 1 1171da177e4SLinus Torvalds # stop at first match 1181da177e4SLinus Torvalds break 1191da177e4SLinus Torvalds if not found: 120f29b5f3eSMike Pagano print ('Couldn\'t find line matching base pattern "%s"' % base_str) 1211da177e4SLinus Torvalds sys.exit(1) 1221da177e4SLinus Torvalds else: 1231da177e4SLinus Torvalds base_time = 0.0 1241da177e4SLinus Torvalds 1251da177e4SLinus Torvalds for line in lines: 126f29b5f3eSMike Pagano print (convert_line(line, base_time),) 1271da177e4SLinus Torvalds 1281da177e4SLinus Torvaldsmain() 129