1 | #! /usr/bin/env python
|
---|
2 |
|
---|
3 | """Transform gprof(1) output into useful HTML."""
|
---|
4 |
|
---|
5 | import re, os, sys, cgi, webbrowser
|
---|
6 |
|
---|
7 | header = """\
|
---|
8 | <html>
|
---|
9 | <head>
|
---|
10 | <title>gprof output (%s)</title>
|
---|
11 | </head>
|
---|
12 | <body>
|
---|
13 | <pre>
|
---|
14 | """
|
---|
15 |
|
---|
16 | trailer = """\
|
---|
17 | </pre>
|
---|
18 | </body>
|
---|
19 | </html>
|
---|
20 | """
|
---|
21 |
|
---|
22 | def add_escapes(input):
|
---|
23 | for line in input:
|
---|
24 | yield cgi.escape(line)
|
---|
25 |
|
---|
26 | def main():
|
---|
27 | filename = "gprof.out"
|
---|
28 | if sys.argv[1:]:
|
---|
29 | filename = sys.argv[1]
|
---|
30 | outputfilename = filename + ".html"
|
---|
31 | input = add_escapes(file(filename))
|
---|
32 | output = file(outputfilename, "w")
|
---|
33 | output.write(header % filename)
|
---|
34 | for line in input:
|
---|
35 | output.write(line)
|
---|
36 | if line.startswith(" time"):
|
---|
37 | break
|
---|
38 | labels = {}
|
---|
39 | for line in input:
|
---|
40 | m = re.match(r"(.* )(\w+)\n", line)
|
---|
41 | if not m:
|
---|
42 | output.write(line)
|
---|
43 | break
|
---|
44 | stuff, fname = m.group(1, 2)
|
---|
45 | labels[fname] = fname
|
---|
46 | output.write('%s<a name="flat:%s" href="#call:%s">%s</a>\n' %
|
---|
47 | (stuff, fname, fname, fname))
|
---|
48 | for line in input:
|
---|
49 | output.write(line)
|
---|
50 | if line.startswith("index % time"):
|
---|
51 | break
|
---|
52 | for line in input:
|
---|
53 | m = re.match(r"(.* )(\w+)(( <cycle.*>)? \[\d+\])\n", line)
|
---|
54 | if not m:
|
---|
55 | output.write(line)
|
---|
56 | if line.startswith("Index by function name"):
|
---|
57 | break
|
---|
58 | continue
|
---|
59 | prefix, fname, suffix = m.group(1, 2, 3)
|
---|
60 | if fname not in labels:
|
---|
61 | output.write(line)
|
---|
62 | continue
|
---|
63 | if line.startswith("["):
|
---|
64 | output.write('%s<a name="call:%s" href="#flat:%s">%s</a>%s\n' %
|
---|
65 | (prefix, fname, fname, fname, suffix))
|
---|
66 | else:
|
---|
67 | output.write('%s<a href="#call:%s">%s</a>%s\n' %
|
---|
68 | (prefix, fname, fname, suffix))
|
---|
69 | for line in input:
|
---|
70 | for part in re.findall(r"(\w+(?:\.c)?|\W+)", line):
|
---|
71 | if part in labels:
|
---|
72 | part = '<a href="#call:%s">%s</a>' % (part, part)
|
---|
73 | output.write(part)
|
---|
74 | output.write(trailer)
|
---|
75 | output.close()
|
---|
76 | webbrowser.open("file:" + os.path.abspath(outputfilename))
|
---|
77 |
|
---|
78 | if __name__ == '__main__':
|
---|
79 | main()
|
---|