| 1 | #!/usr/bin/env python2
|
| 2 | """
|
| 3 | uftrace_plugin.py
|
| 4 | """
|
| 5 | from __future__ import print_function
|
| 6 |
|
| 7 | import collections
|
| 8 |
|
| 9 | stack = []
|
| 10 |
|
| 11 | # call stack (list) -> count
|
| 12 | list_callers = collections.Counter()
|
| 13 | str_callers = collections.Counter()
|
| 14 | slice_callers = collections.Counter()
|
| 15 | t2_callers = collections.Counter()
|
| 16 | t3_callers = collections.Counter()
|
| 17 | t4_callers = collections.Counter()
|
| 18 | new_callers = collections.Counter()
|
| 19 | malloc_callers = collections.Counter()
|
| 20 |
|
| 21 |
|
| 22 | def uftrace_begin(ctx):
|
| 23 | pass
|
| 24 |
|
| 25 |
|
| 26 | def uftrace_entry(ctx):
|
| 27 | # TODO: When function is List::List, get the STACK
|
| 28 | func = ctx["name"]
|
| 29 |
|
| 30 | if func == 'List::List':
|
| 31 | list_callers[stack[-1]] += 1
|
| 32 | #print('STACK %s' % stack)
|
| 33 | elif func == 'Str::Str':
|
| 34 | str_callers[stack[-1]] += 1
|
| 35 | elif func == 'Str::slice':
|
| 36 | slice_callers[stack[-1]] += 1
|
| 37 | elif func == 'Tuple2::Tuple2':
|
| 38 | t2_callers[stack[-1]] += 1
|
| 39 | elif func == 'Tuple3::Tuple3':
|
| 40 | t3_callers[stack[-1]] += 1
|
| 41 | elif func == 'Tuple4::Tuple4':
|
| 42 | t4_callers[stack[-1]] += 1
|
| 43 | elif func == 'operator new':
|
| 44 | new_callers[stack[-1]] += 1
|
| 45 | elif func == 'malloc':
|
| 46 | malloc_callers[stack[-1]] += 1
|
| 47 |
|
| 48 | stack.append(func)
|
| 49 | #print("entry : " + func + "()")
|
| 50 |
|
| 51 |
|
| 52 | def uftrace_exit(ctx):
|
| 53 | func = ctx["name"]
|
| 54 | #print("exit : " + func + "()")
|
| 55 | stack.pop()
|
| 56 |
|
| 57 |
|
| 58 | def PrintMostCommon(c, k):
|
| 59 | total = sum(c.values())
|
| 60 | for caller, count in c.most_common(k):
|
| 61 | percent = count * 100.0 / total
|
| 62 | print('%5.2f%% %5d %s' % (percent, count, caller))
|
| 63 | print(' ...')
|
| 64 | print(' %5d TOTAL' % total)
|
| 65 |
|
| 66 |
|
| 67 | def uftrace_end():
|
| 68 | k = 10
|
| 69 | print('')
|
| 70 | print('List')
|
| 71 | PrintMostCommon(list_callers, k)
|
| 72 |
|
| 73 | print('')
|
| 74 | print('Str')
|
| 75 | PrintMostCommon(str_callers, k)
|
| 76 |
|
| 77 | print('')
|
| 78 | print('slice')
|
| 79 | PrintMostCommon(slice_callers, k)
|
| 80 |
|
| 81 | print('')
|
| 82 | print('Tuple2')
|
| 83 | PrintMostCommon(t2_callers, k)
|
| 84 |
|
| 85 | print('')
|
| 86 | print('Tuple3')
|
| 87 | PrintMostCommon(t3_callers, k)
|
| 88 |
|
| 89 | print('')
|
| 90 | print('Tuple4')
|
| 91 | PrintMostCommon(t4_callers, k)
|
| 92 |
|
| 93 | print('')
|
| 94 | print('operator new')
|
| 95 | PrintMostCommon(new_callers, k)
|
| 96 |
|
| 97 | print('')
|
| 98 | print('malloc')
|
| 99 | PrintMostCommon(malloc_callers, k)
|