You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过编程方式获取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():判断是否成功获取到有效的源码位置(避免无源码的二进制场景报错)

使用方法

  1. 将上述脚本保存为getloc.py
  2. 在GDB中加载:source getloc.py
  3. 触发断点后,输入getloc即可输出("file.c", 15)格式的位置,同时自动通过tmux跳转到Vim的对应行

内容的提问来源于stack exchange,提问作者Egor Sozonov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 16:03:17