From 4aae4c9db3b09199336d7c518851c55cadcdff55 Mon Sep 17 00:00:00 2001 From: eficas <> Date: Wed, 6 Nov 2002 16:00:30 +0000 Subject: [PATCH] amelioration Trace --- Misc/Trace.py | 114 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 111 insertions(+), 3 deletions(-) diff --git a/Misc/Trace.py b/Misc/Trace.py index 9aac3d2b..cce9b4be 100644 --- a/Misc/Trace.py +++ b/Misc/Trace.py @@ -14,19 +14,127 @@ def begin_trace(): def end_trace(): sys.settrace(None) +def filter(filename): + return (filename[-10:] == 'Tkinter.py') or (filename[:21] == '/home01/chris/pkg/Pmw') + +cara="+" +ldec=2 +dec = cara*ldec +curframe=None + +def compute_level(frame): + """Calcule le niveau dans la pile d'execution""" + level=0 + while frame is not None: + frame=frame.f_back + level=level+1 + return level-1 + + def dispatch_call(frame, arg): """ Cette fonction est appelée par trace_dispatch pour tracer les appels à des fonctions ou méthodes """ + global dec,curframe + try: + dec = cara*ldec*compute_level(frame) + name = frame.f_code.co_name + if not name: name = '???' + if not filter(frame.f_code.co_filename): + print dec +' call', name, frame.f_lineno,frame.f_code.co_filename + # La trace des appels suivants est decalee de + + dec=dec+cara*ldec + except: + print "Pb dans dispatch_call: ",frame,curframe + return trace_dispatch + +def dispatch_exception(frame, arg): + """ Cette fonction est appelée par trace_dispatch + pour tracer les exceptions + """ + global dec,curframe + try: + dec = cara*ldec*(compute_level(frame)+1) + name = frame.f_code.co_name + if not name: name = '???' + if not filter(frame.f_code.co_filename): + print dec+' exception', name, frame.f_lineno,frame.f_code.co_filename,arg[0],arg[1] + except: + print "Pb dans dispatch_exception: ",frame,curframe + return trace_dispatch + +def dispatch_return(frame, arg): + """ Cette fonction est appelée par trace_dispatch + pour tracer les retours de fonction + """ + global dec,curframe +# print dec+' return', arg + dec = cara*ldec*compute_level(frame) + return trace_dispatch + +def dispatch_line(frame, arg): + """ Cette fonction est appelée par trace_dispatch + pour tracer les lignes de source + """ + import linecache name = frame.f_code.co_name if not name: name = '???' - print '+++ call', name, arg + fn=frame.f_code.co_filename + line = linecache.getline(fn, frame.f_lineno) + print dec,name,frame.f_lineno,':',line.strip() + return trace_dispatch def trace_dispatch(frame,event,arg): """ Cette fonction sert à tracer tous les appels à des fonctions ou à des méthodes. """ - if event == 'call': - return dispatch_call(frame, arg) + if event == 'call': return dispatch_call(frame, arg) + if event == 'return': return dispatch_return(frame, arg) +# if event == 'line': return dispatch_line(frame, arg) + if event == 'exception': return dispatch_exception(frame, arg) return trace_dispatch +def a(x): + b(x) + +def b(x): + return x + +def d(x): + return 1/x + +def e(): + try: + c=1/0 + except: + pass + +def f(): + try: + c=1/0 + except: + b(10) + raise + +def g(): + try: + f() + except: + pass + +def _test(): + begin_trace() + a(5) + try: + d(0) + except: + pass + b(4) + g() + e() + end_trace() + b(3) + +if __name__ == "__main__": + _test() + -- 2.39.2