Salome HOME
CCAR:restauration version Aster de V_MCSIMP
[tools/eficas.git] / Misc / Trace.py
1 """
2     Ce module sert à tracer les appels aux methodes pendant
3     l'exécution.
4     Mode d'emploi :
5     Au début de la zone à tracer faire : Trace.begin_trace()
6     à la fin de la zone faire : Trace.end_trace()
7
8 """
9 import sys
10
11 def begin_trace():
12      sys.settrace(trace_dispatch)
13
14 def end_trace():
15      sys.settrace(None)
16
17 def filter(filename):
18   return (filename[-10:] == 'Tkinter.py') or (filename[:21] == '/home01/chris/pkg/Pmw')
19
20 cara="+"
21 ldec=2
22 dec = cara*ldec
23 curframe=None
24
25 def compute_level(frame):
26    """Calcule le niveau dans la pile d'execution"""
27    level=0
28    while frame is not None:
29       frame=frame.f_back
30       level=level+1
31    return level-1
32   
33
34 def dispatch_call(frame, arg):
35      """ Cette fonction est appelée par trace_dispatch
36          pour tracer les appels à des fonctions ou méthodes
37      """
38      global dec,curframe
39      try:
40        dec = cara*ldec*compute_level(frame)
41        name = frame.f_code.co_name
42        if not name: name = '???'
43        if not filter(frame.f_code.co_filename):
44            print dec +' call', name, frame.f_lineno,frame.f_code.co_filename
45        # La trace des appels suivants est decalee de +
46        dec=dec+cara*ldec
47      except:
48        print "Pb dans dispatch_call: ",frame,curframe
49      return trace_dispatch
50
51 def dispatch_exception(frame, arg):
52      """ Cette fonction est appelée par trace_dispatch
53          pour tracer les exceptions
54      """
55      global dec,curframe
56      try:
57        dec = cara*ldec*(compute_level(frame)+1)
58        name = frame.f_code.co_name
59        if not name: name = '???'
60        if not filter(frame.f_code.co_filename):
61           print dec+' exception', name, frame.f_lineno,frame.f_code.co_filename,arg[0],arg[1]
62      except:
63        print "Pb dans dispatch_exception: ",frame,curframe
64      return trace_dispatch
65
66 def dispatch_return(frame, arg):
67      """ Cette fonction est appelée par trace_dispatch
68          pour tracer les retours de fonction
69      """
70      global dec,curframe
71 #     print dec+' return', arg
72      dec = cara*ldec*compute_level(frame)
73      return trace_dispatch
74
75 def dispatch_line(frame, arg):
76      """ Cette fonction est appelée par trace_dispatch
77          pour tracer les lignes de source
78      """
79      import linecache
80      name = frame.f_code.co_name
81      if not name: name = '???'
82      fn=frame.f_code.co_filename
83      line = linecache.getline(fn, frame.f_lineno)
84      print dec,name,frame.f_lineno,':',line.strip()
85      return trace_dispatch
86
87 def trace_dispatch(frame,event,arg):
88      """ Cette fonction sert à tracer tous les appels
89          à des fonctions ou à des méthodes.
90      """
91      if event == 'call': return dispatch_call(frame, arg)
92      if event == 'return': return dispatch_return(frame, arg)
93 #     if event == 'line': return dispatch_line(frame, arg)
94      if event == 'exception': return dispatch_exception(frame, arg)
95      return trace_dispatch
96
97 def a(x):
98    b(x)
99
100 def b(x):
101    return x
102
103 def d(x):
104    return 1/x
105
106 def e():
107    try:
108      c=1/0
109    except:
110      pass
111
112 def f():
113    try:
114      c=1/0
115    except:
116      b(10)
117      raise
118
119 def g():
120    try:
121       f()
122    except:
123       pass
124
125 def _test():
126    begin_trace()
127    a(5)
128    try:
129      d(0)
130    except:
131      pass
132    b(4)
133    g()
134    e()  
135    end_trace()
136    b(3)
137
138 if __name__ == "__main__":
139     _test()
140