Skip to content

Commit 5d3be01

Browse files
authored
Lock scheduler in GDB when launching functions (#8629)
Previously, when printing Id in GDB, thread have been changing constantly and stack frame was lost. This PR resolves that. Signed-off-by: Mikhail Kot <mikhail@spiraldb.com>
1 parent 3077131 commit 5d3be01

1 file changed

Lines changed: 32 additions & 1 deletion

File tree

scripts/vortex_gdb.py

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,15 +132,46 @@ def _str_to_python(s: gdb.Value) -> str | None:
132132
return None
133133

134134

135+
class _PinnedThread:
136+
"""Make a pretty-printer's call safe with multiple threads"""
137+
138+
def __enter__(self):
139+
try:
140+
self._frame = gdb.selected_frame()
141+
except gdb.error:
142+
self._frame = None
143+
try:
144+
self._prev_lock = gdb.parameter("scheduler-locking")
145+
# only this thread will run during infcall
146+
gdb.execute("set scheduler-locking on", to_string=True)
147+
except gdb.error:
148+
self._prev_lock = None
149+
return self
150+
151+
def __exit__(self, exc_type, exc, tb):
152+
if self._prev_lock is not None:
153+
try:
154+
gdb.execute(f"set scheduler-locking {self._prev_lock}", to_string=True)
155+
except gdb.error:
156+
pass
157+
if self._frame is not None:
158+
try:
159+
self._frame.select()
160+
except gdb.error:
161+
pass
162+
163+
135164
def _id_to_string(id_addr: int) -> str | None:
136165
sym = gdb.lookup_global_symbol(_AS_STR_NAME) or gdb.lookup_static_symbol(_AS_STR_NAME)
137166
if sym is None:
138167
return None
139168
try:
140169
id_ptr = gdb.Value(id_addr).cast(gdb.lookup_type(_ID_FQN).pointer())
141-
return _str_to_python(sym.value()(id_ptr))
170+
with _PinnedThread():
171+
str_val = sym.value()(id_ptr)
142172
except gdb.error:
143173
return None
174+
return _str_to_python(str_val)
144175

145176

146177
def _format_dtype(dtype_val: gdb.Value) -> str:

0 commit comments

Comments
 (0)