blob: b14def4ef8482bef070bb7f21d8cff1af6bbc2b5 [file] [log] [blame]
Ned Deily67804e92013-04-20 14:07:43 -07001#! /usr/bin/env python3
Guido van Rossum7ec34b52002-08-09 20:07:34 +00002
3"""Transform gprof(1) output into useful HTML."""
4
Serhiy Storchaka7a1104d2014-12-01 10:50:33 +02005import html
6import os
7import re
8import sys
9import webbrowser
Guido van Rossum7ec34b52002-08-09 20:07:34 +000010
11header = """\
12<html>
13<head>
14 <title>gprof output (%s)</title>
15</head>
16<body>
17<pre>
18"""
19
20trailer = """\
21</pre>
22</body>
23</html>
24"""
25
R David Murray776c0df2012-04-11 15:16:38 -040026def add_escapes(filename):
27 with open(filename) as fp:
28 for line in fp:
Serhiy Storchaka7a1104d2014-12-01 10:50:33 +020029 yield html.escape(line)
R David Murray776c0df2012-04-11 15:16:38 -040030
Serhiy Storchakaafbb7a32019-03-30 08:32:18 +020031def gprof2html(input, output, filename):
Guido van Rossum7ec34b52002-08-09 20:07:34 +000032 output.write(header % filename)
33 for line in input:
34 output.write(line)
35 if line.startswith(" time"):
36 break
37 labels = {}
38 for line in input:
39 m = re.match(r"(.* )(\w+)\n", line)
40 if not m:
41 output.write(line)
42 break
43 stuff, fname = m.group(1, 2)
44 labels[fname] = fname
45 output.write('%s<a name="flat:%s" href="#call:%s">%s</a>\n' %
46 (stuff, fname, fname, fname))
47 for line in input:
48 output.write(line)
49 if line.startswith("index % time"):
50 break
51 for line in input:
52 m = re.match(r"(.* )(\w+)(( &lt;cycle.*&gt;)? \[\d+\])\n", line)
53 if not m:
54 output.write(line)
55 if line.startswith("Index by function name"):
56 break
57 continue
58 prefix, fname, suffix = m.group(1, 2, 3)
59 if fname not in labels:
60 output.write(line)
61 continue
62 if line.startswith("["):
63 output.write('%s<a name="call:%s" href="#flat:%s">%s</a>%s\n' %
64 (prefix, fname, fname, fname, suffix))
65 else:
66 output.write('%s<a href="#call:%s">%s</a>%s\n' %
67 (prefix, fname, fname, suffix))
68 for line in input:
69 for part in re.findall(r"(\w+(?:\.c)?|\W+)", line):
70 if part in labels:
71 part = '<a href="#call:%s">%s</a>' % (part, part)
72 output.write(part)
73 output.write(trailer)
Serhiy Storchakaafbb7a32019-03-30 08:32:18 +020074
75
76def main():
77 filename = "gprof.out"
78 if sys.argv[1:]:
79 filename = sys.argv[1]
80 outputfilename = filename + ".html"
81 input = add_escapes(filename)
82 with open(outputfilename, "w") as output:
83 gprof2html(input, output, filename)
Guido van Rossum7ec34b52002-08-09 20:07:34 +000084 webbrowser.open("file:" + os.path.abspath(outputfilename))
85
Andrew M. Kuchlinge236b382004-08-09 17:27:55 +000086if __name__ == '__main__':
87 main()