Skip to content

Commit fba13cf

Browse files
committed
Add a gdb helper for jit backtraces
1 parent c1569cc commit fba13cf

File tree

1 file changed

+50
-0
lines changed

1 file changed

+50
-0
lines changed

scripts/jit-helpers.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import gdb
2+
3+
def jitmap_raw():
4+
pid = gdb.selected_inferior().pid
5+
jitmap_file = open("/tmp/perf-%d.map" % (pid,), "r")
6+
jitmap = jitmap_file.read()
7+
jitmap_file.close()
8+
return jitmap
9+
10+
def jit_functions():
11+
jitmap = jitmap_raw()
12+
13+
functions = []
14+
for line in jitmap.strip().split("\n"):
15+
[addr, size, name] = line.split(" ")
16+
functions.append((int(addr, 16), int(size, 16), name))
17+
18+
return functions
19+
20+
class JitDecorator(gdb.FrameDecorator.FrameDecorator):
21+
def __init__(self, fobj, name):
22+
super(JitDecorator, self).__init__(fobj)
23+
self.name = name
24+
25+
def function(self):
26+
return self.name
27+
28+
class JitFilter:
29+
"""
30+
A backtrace filter which reads perf map files produced by cranelift-jit.
31+
"""
32+
33+
def __init__(self):
34+
self.name = 'JitFilter'
35+
self.enabled = True
36+
self.priority = 0
37+
38+
gdb.current_progspace().frame_filters[self.name] = self
39+
40+
def filter(self, frame_iter):
41+
for frame in frame_iter:
42+
frame_addr = frame.inferior_frame().pc()
43+
for (addr, size, name) in jit_functions():
44+
if frame_addr >= addr and frame_addr < addr + size:
45+
yield JitDecorator(frame, name)
46+
break
47+
else:
48+
yield frame
49+
50+
JitFilter()

0 commit comments

Comments
 (0)