-
Notifications
You must be signed in to change notification settings - Fork 7
/
sawx.py
executable file
·86 lines (70 loc) · 2.42 KB
/
sawx.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#!/usr/bin/env python
# Standard library imports.
import sys
import logging
last_trace_was_system_call = False
trace_after_funcname = None
def trace_calls(frame, event, arg):
global last_trace_was_system_call, trace_after_funcname
if event != 'call':
return
co = frame.f_code
func_name = co.co_name
if func_name == 'write':
# Ignore write() calls from print statements
return
if trace_after_funcname is not None:
if func_name == trace_after_funcname:
trace_after_funcname = None
else:
# skip anything until it hits the trace_after function
return
func_line_no = frame.f_lineno
func_filename = co.co_filename
caller = frame.f_back
caller_line_no = caller.f_lineno
caller_filename = caller.f_code.co_filename
if "/python3" in caller_filename or "/logging/" in func_filename or "/wx/core.py" in func_filename or "/sre_" in caller_filename or "/logging/" in caller_filename:
if not last_trace_was_system_call:
print(' <system calls>')
last_trace_was_system_call = True
return
last_trace_was_system_call = False
print('%s:%s -> %s %s:%s' % (caller_filename, caller_line_no, func_name, func_filename, func_line_no))
return
def create_global_functions():
def what_called_me():
import traceback
stack = traceback.extract_stack()
count = len(stack) - 2
for i, item in enumerate(stack[:-1]):
print(("#%d %s in %s at %s:%d" % (count - i, item[3], item[2], item[0], item[1])))
import builtins
builtins.what_called_me = what_called_me
create_global_functions()
def main(argv):
""" Run the application.
"""
logging.basicConfig(level=logging.WARNING)
if "--trace" in argv:
i = argv.index("--trace")
argv.pop(i)
sys.settrace(trace_calls)
if "--trace-after" in argv:
global trace_after_funcname
i = argv.index("--trace-after")
argv.pop(i)
funcname = argv.pop(i)
trace_after_funcname = funcname
sys.settrace(trace_calls)
from sawx.startup import run
from sawx.application import SawxApp
from sawx._version import __version__
SawxApp.app_version = __version__
run(SawxApp)
logging.shutdown()
if __name__ == '__main__':
import sys
from sawx.startup import setup_frozen_logging
setup_frozen_logging()
main(sys.argv)