2
0

simpletrace_stap.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. # -*- coding: utf-8 -*-
  2. """
  3. Generate .stp file that outputs simpletrace binary traces (DTrace with SystemTAP only).
  4. """
  5. __author__ = "Stefan Hajnoczi <redhat.com>"
  6. __copyright__ = "Copyright (C) 2014, Red Hat, Inc."
  7. __license__ = "GPL version 2 or (at your option) any later version"
  8. __maintainer__ = "Stefan Hajnoczi"
  9. __email__ = "stefanha@redhat.com"
  10. from tracetool import out
  11. from tracetool.backend.dtrace import probeprefix
  12. from tracetool.backend.simple import is_string
  13. from tracetool.format.stap import stap_escape
  14. def global_var_name(name):
  15. return probeprefix().replace(".", "_") + "_" + name
  16. def generate(events, backend, group):
  17. out('/* This file is autogenerated by tracetool, do not edit. */',
  18. '')
  19. for event_id, e in enumerate(events):
  20. if 'disable' in e.properties:
  21. continue
  22. out('probe %(probeprefix)s.simpletrace.%(name)s = %(probeprefix)s.%(name)s ?',
  23. '{',
  24. probeprefix=probeprefix(),
  25. name=e.name)
  26. # Calculate record size
  27. sizes = ['24'] # sizeof(TraceRecord)
  28. for type_, name in e.args:
  29. name = stap_escape(name)
  30. if is_string(type_):
  31. out(' try {',
  32. ' arg%(name)s_str = %(name)s ? user_string_n(%(name)s, 512) : "<null>"',
  33. ' } catch {}',
  34. ' arg%(name)s_len = strlen(arg%(name)s_str)',
  35. name=name)
  36. sizes.append('4 + arg%s_len' % name)
  37. else:
  38. sizes.append('8')
  39. sizestr = ' + '.join(sizes)
  40. # Generate format string and value pairs for record header and arguments
  41. fields = [('8b', str(event_id)),
  42. ('8b', 'gettimeofday_ns()'),
  43. ('4b', sizestr),
  44. ('4b', 'pid()')]
  45. for type_, name in e.args:
  46. name = stap_escape(name)
  47. if is_string(type_):
  48. fields.extend([('4b', 'arg%s_len' % name),
  49. ('.*s', 'arg%s_len, arg%s_str' % (name, name))])
  50. else:
  51. fields.append(('8b', name))
  52. # Emit the entire record in a single SystemTap printf()
  53. fmt_str = '%'.join(fmt for fmt, _ in fields)
  54. arg_str = ', '.join(arg for _, arg in fields)
  55. out(' printf("%%8b%%%(fmt_str)s", 1, %(arg_str)s)',
  56. fmt_str=fmt_str, arg_str=arg_str)
  57. out('}')
  58. out()