如何通过编程方式获取GDB中的当前源码位置?
获取GDB当前断点的源码位置(元组形式)
你可以通过GDB Python API的SymtabAndLine对象直接获取当前帧的源码文件名和行号,以下是修改后的命令脚本:
import gdb import subprocess class GetSourceLocationCommand(gdb.Command): def __init__(self): # 自定义命令名,比如改成getloc gdb.Command.__init__(self, "getloc", gdb.COMMAND_USER) def invoke(self, arg, from_tty): # 获取当前选中的帧 frame = gdb.selected_frame() if not frame: print("No selected frame.") return # 获取对应的源码位置(SymtabAndLine对象) sal = frame.find_sal() if not sal.is_valid(): print("No source location available for current frame.") return # 提取文件名和行号 filename = sal.symtab.filename line = sal.line location = (filename, line) print(location) # 可选:直接调用tmux命令跳转到已打开的编辑器(以Vim为例) # 替换成你的tmux窗口/窗格标识,比如"vim"或者窗格ID tmux_target = "vim" # 发送Vim命令跳转到指定行 cmd = f'tmux send-keys -t {tmux_target} ":{line}" C-m' subprocess.run(cmd, shell=True) GetSourceLocationCommand()
关键API说明
gdb.selected_frame():获取当前GDB选中的栈帧(断点触发时就是断点所在的帧)frame.find_sal():返回SymtabAndLine对象,包含源码文件和行号信息sal.symtab.filename:获取源码文件的路径(如果需要相对路径,可以用os.path.basename处理)sal.line:获取对应的源码行号sal.is_valid():判断是否成功获取到有效的源码位置(避免无源码的二进制场景报错)
使用方法
- 将上述脚本保存为
getloc.py - 在GDB中加载:
source getloc.py - 触发断点后,输入
getloc即可输出("file.c", 15)格式的位置,同时自动通过tmux跳转到Vim的对应行
内容的提问来源于stack exchange,提问作者Egor Sozonov
相关产品推荐
相关产品推荐

