Skip to content

Commit 8d82857

Browse files
committed
bt_has_any: fall back to symbol name when indexing
We currently use the "frame.name" which may not be present when using CTF. Instead, we should fallback to the symbol name. The frame_name() function is not appropriate, since this may include additional information, such as the module containing the symbol. So introduce a new helper, func_name() for this case. Signed-off-by: Stephen Brennan <[email protected]>
1 parent 0d463a2 commit 8d82857

File tree

1 file changed

+17
-4
lines changed

1 file changed

+17
-4
lines changed

drgn_tools/bt.py

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,15 @@
3737
)
3838

3939

40+
def func_name(prog: drgn.Program, frame: drgn.StackFrame) -> t.Optional[str]:
41+
if frame.name:
42+
return frame.name
43+
try:
44+
return frame.symbol().name
45+
except LookupError:
46+
return None
47+
48+
4049
def frame_name(prog: drgn.Program, frame: drgn.StackFrame) -> str:
4150
"""Return a suitable name for a stack frame"""
4251
# Looking up the module for an address is currently a bit inefficient, since
@@ -473,7 +482,10 @@ def _index_functions(prog: drgn.Program) -> t.Dict[str, t.Set[int]]:
473482
try:
474483
frames = bt_frames(task)
475484
for frame in frames:
476-
func_to_pids[frame.name].add(pid)
485+
name = func_name(prog, frame)
486+
if not name:
487+
continue
488+
func_to_pids[name].add(pid)
477489
except FaultError:
478490
# FaultError: catch unusual unwinding issues
479491
pass
@@ -496,7 +508,8 @@ def _indexed_bt_has_any(
496508
for pid in pids:
497509
task = find_task(prog, pid)
498510
for frame in bt_frames(task):
499-
if frame.name in funcs:
511+
name = func_name(prog, frame)
512+
if name in funcs:
500513
result.append((task, frame))
501514
return result
502515

@@ -532,7 +545,7 @@ def bt_has_any(
532545
try:
533546
frames = bt_frames(task)
534547
for frame in frames:
535-
if frame.name in funcs:
548+
if func_name(prog, frame) in funcs:
536549
frame_list.append((task, frame))
537550

538551
return frame_list
@@ -546,7 +559,7 @@ def bt_has_any(
546559
try:
547560
frames = bt_frames(task)
548561
for frame in frames:
549-
if frame.name in funcs:
562+
if func_name(prog, frame) in funcs:
550563
frame_list.append((task, frame))
551564
except (FaultError, ValueError):
552565
# FaultError: catch unusual unwinding issues

0 commit comments

Comments
 (0)