Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit6cfada4

Browse files
committed
Trace deeply with birdseye
1 parente3a9502 commit6cfada4

File tree

2 files changed

+48
-7
lines changed

2 files changed

+48
-7
lines changed

‎backend/main/views.py‎

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,17 @@
99
fromtypingimportget_type_hints
1010
fromuuidimportuuid4
1111

12+
importrequests
13+
frombirdseyeimporteye
1214
fromdjango.confimportsettings
1315
fromdjango.contrib.auth.mixinsimportLoginRequiredMixin
1416
fromdjango.contrib.messages.viewsimportSuccessMessageMixin
1517
fromdjango.formsimportModelForm
1618
fromdjango.httpimportHttpResponse,JsonResponse
1719
fromdjango.viewsimportView
1820
fromdjango.views.genericimportCreateView
19-
20-
importrequests
21-
frombirdseyeimporteye
2221
fromdjango_user_agents.utilsimportget_user_agent
23-
fromlittleutilsimportselect_attrs
22+
fromlittleutilsimportselect_attrs,only
2423
frommarkdownimportmarkdown
2524
fromsentry_sdkimportcapture_exception
2625

@@ -101,6 +100,11 @@ def run_code(self, code, source, page_index, step_index):
101100
birdseye_objects=result["birdseye_objects"]
102101
ifbirdseye_objects:
103102
functions=birdseye_objects["functions"]
103+
top_old_function_id=only(
104+
f["id"]
105+
forfinfunctions
106+
iff["name"]=="<module>"
107+
)
104108
function_ids= [d.pop('id')fordinfunctions]
105109
functions= [eye.db.Function(**{**d,'hash':uuid4().hex})fordinfunctions]
106110
witheye.db.session_scope()assession:
@@ -109,13 +113,16 @@ def run_code(self, code, source, page_index, step_index):
109113
session.commit()
110114
function_ids= {old:func.idforold,funcinzip(function_ids,functions)}
111115

116+
call_id=None
112117
forcallinbirdseye_objects["calls"]:
113-
call["function_id"]=function_ids[call["function_id"]]
118+
old_function_id=call["function_id"]
119+
is_top_call=old_function_id==top_old_function_id
120+
call["function_id"]=function_ids[old_function_id]
114121
call["start_time"]=datetime.fromisoformat(call["start_time"])
115122
call=eye.db.Call(**call)
116123
session.add(call)
117-
# TODO get correct call from top level
118-
call_id=call.id
124+
ifis_top_call:
125+
call_id=call.id
119126

120127
birdseye_url=f"/birdseye/ipython_call/{call_id}"
121128

‎backend/main/workers/birdseye.py‎

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
importast
2+
importinspect
13
fromdatetimeimportdatetime
24

35
importbirdseye.bird
@@ -19,6 +21,38 @@ def exec_birdseye(filename, code):
1921
traced_file=eye.compile(code,filename)
2022
eye._trace('<module>',filename,traced_file,traced_file.code,'module',code)
2123
console.locals=eye._trace_methods_dict(traced_file)
24+
25+
nodes_by_lineno= {
26+
node.lineno:node
27+
fornodeintraced_file.nodes
28+
ifisinstance(node,ast.FunctionDef)
29+
}
30+
31+
deffind_code(root_code):
32+
"""
33+
Trace all functions recursively, like trace_module_deep.
34+
"""
35+
forcode_objinroot_code.co_consts:
36+
ifnotinspect.iscode(code_obj)orcode_obj.co_name.startswith('<'):
37+
continue
38+
39+
find_code(code_obj)
40+
41+
lineno=code_obj.co_firstlineno
42+
node=nodes_by_lineno.get(lineno)
43+
ifnotnode:
44+
continue
45+
46+
eye._trace(
47+
code_obj.co_name,filename,traced_file,code_obj,
48+
typ='function',
49+
source=code,
50+
start_lineno=lineno,
51+
end_lineno=node.last_token.end[0]+1,
52+
)
53+
54+
find_code(traced_file.code)
55+
2256
execute(traced_file.code)
2357
witheye.db.session_scope()assession:
2458
objects=session.query(eye.db.Call,eye.db.Function).all()

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp