Mercurial > cpython-lru_cache-weakref
annotate Tools/scripts/gprof2html.py @ 49955:878d40468c4e legacy-trunk
Issue #4384: Added logging integration with warnings module using captureWarnings(). This change includes a NullHandler which does nothing; it will be of use to library developers who want to avoid the "No handlers could be found for logger XXX" message which can appear if the library user doesn't configure logging.
| author | Vinay Sajip <vinay_sajip@yahoo.co.uk> |
|---|---|
| date | Wed, 03 Dec 2008 23:22:58 +0000 |
| parents | 981fff7363b9 |
| children | 0c308d65d7bc fcfe324663a6 |
| rev | line source |
|---|---|
|
24721
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1 #! /usr/bin/env python2.3 |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2 |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3 """Transform gprof(1) output into useful HTML.""" |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4 |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5 import re, os, sys, cgi, webbrowser |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
6 |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
7 header = """\ |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
8 <html> |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
9 <head> |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
10 <title>gprof output (%s)</title> |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
11 </head> |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
12 <body> |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
13 <pre> |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
14 """ |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
15 |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
16 trailer = """\ |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
17 </pre> |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
18 </body> |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
19 </html> |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
20 """ |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
21 |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
22 def add_escapes(input): |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
23 for line in input: |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
24 yield cgi.escape(line) |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
25 |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
26 def main(): |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
27 filename = "gprof.out" |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
28 if sys.argv[1:]: |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
29 filename = sys.argv[1] |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
30 outputfilename = filename + ".html" |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
31 input = add_escapes(file(filename)) |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
32 output = file(outputfilename, "w") |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
33 output.write(header % filename) |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
34 for line in input: |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
35 output.write(line) |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
36 if line.startswith(" time"): |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
37 break |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
38 labels = {} |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
39 for line in input: |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
40 m = re.match(r"(.* )(\w+)\n", line) |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
41 if not m: |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
42 output.write(line) |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
43 break |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
44 stuff, fname = m.group(1, 2) |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
45 labels[fname] = fname |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
46 output.write('%s<a name="flat:%s" href="#call:%s">%s</a>\n' % |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
47 (stuff, fname, fname, fname)) |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
48 for line in input: |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
49 output.write(line) |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
50 if line.startswith("index % time"): |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
51 break |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
52 for line in input: |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
53 m = re.match(r"(.* )(\w+)(( <cycle.*>)? \[\d+\])\n", line) |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
54 if not m: |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
55 output.write(line) |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
56 if line.startswith("Index by function name"): |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
57 break |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
58 continue |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
59 prefix, fname, suffix = m.group(1, 2, 3) |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
60 if fname not in labels: |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
61 output.write(line) |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
62 continue |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
63 if line.startswith("["): |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
64 output.write('%s<a name="call:%s" href="#flat:%s">%s</a>%s\n' % |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
65 (prefix, fname, fname, fname, suffix)) |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
66 else: |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
67 output.write('%s<a href="#call:%s">%s</a>%s\n' % |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
68 (prefix, fname, fname, suffix)) |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
69 for line in input: |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
70 for part in re.findall(r"(\w+(?:\.c)?|\W+)", line): |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
71 if part in labels: |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
72 part = '<a href="#call:%s">%s</a>' % (part, part) |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
73 output.write(part) |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
74 output.write(trailer) |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
75 output.close() |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
76 webbrowser.open("file:" + os.path.abspath(outputfilename)) |
|
2d3c4a7aec0a
A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
77 |
|
33074
981fff7363b9
[Patch #1005491 ] use __name__ == '__main__' in scripts
Andrew M. Kuchling <amk@amk.ca>
parents:
24721
diff
changeset
|
78 if __name__ == '__main__': |
|
981fff7363b9
[Patch #1005491 ] use __name__ == '__main__' in scripts
Andrew M. Kuchling <amk@amk.ca>
parents:
24721
diff
changeset
|
79 main() |
