gprof2html.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #! /usr/bin/env python3
  2. """Transform gprof(1) output into useful HTML."""
  3. import html
  4. import os
  5. import re
  6. import sys
  7. import webbrowser
  8. header = """\
  9. <html>
  10. <head>
  11. <title>gprof output (%s)</title>
  12. </head>
  13. <body>
  14. <pre>
  15. """
  16. trailer = """\
  17. </pre>
  18. </body>
  19. </html>
  20. """
  21. def add_escapes(filename):
  22. with open(filename) as fp:
  23. for line in fp:
  24. yield html.escape(line)
  25. def main():
  26. filename = "gprof.out"
  27. if sys.argv[1:]:
  28. filename = sys.argv[1]
  29. outputfilename = filename + ".html"
  30. input = add_escapes(filename)
  31. output = open(outputfilename, "w")
  32. 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)
  74. output.close()
  75. webbrowser.open("file:" + os.path.abspath(outputfilename))
  76. if __name__ == '__main__':
  77. main()