如何在GDB中查看文件的完整路径?

25
当我在gdb中停在一个断点时,它只显示文件名filename.cpp。如何查看此文件的完整路径名?
4个回答

31

使用info source命令获取当前堆栈帧的信息。

以下是其输出示例:

(gdb) info source
当前源文件为 /build/gtk+2.0-LJ3oCC/gtk+2.0-2.24.30/modules/input/gtkimcontextxim.c
位于 /home/sashoalm/Desktop/compile/gtk+2.0-2.24.30/modules/input/gtkimcontextxim.c
包含1870行。
源语言为c。
生产者是GNU C11 5.3.1 20160225 -mtune=generic -march=i686 -g -g -O2 -O2 -fstack-protector-strong -fPIC -fstack-protector-strong。
使用DWARF 2调试格式编译。
不包含预处理器宏信息。

这个命令显示有关当前断点的信息,有时在特定函数上达到断点需要很长时间。在这种情况下,使用 jump <function_name> 强制跳转到该函数可能会很有用。 - mMontu

3

Ciro Santill的回答非常好。然而,这个脚本需要进行一些小的修改才能在我的gdb 8.0.1上运行。

我还将其更改为将文本复制到剪贴板中,这样我就可以立即在vim中使用它了。它与file_line.vim插件很好地配合使用。以下是脚本生成的剪贴板内容示例:

/home/ops1/projects/test01/main.cpp:5

以下是脚本内容:
import pyperclip

class Clippath (gdb.Command):
    """print absolute path"""
    def __init__(self):
        super(Clippath, self).__init__("clippath", gdb.COMMAND_USER)

    def invoke(self, arg, from_tty):
        symtabline = gdb.selected_frame().find_sal()
        pyperclip.copy(symtabline.symtab.fullname() + ":" + str(symtabline.line))

Clippath()

以下是使所有内容正常工作的步骤:
  1. 安装pyperclip python库 sudo zypper in python3-pyperclip
  2. 将上面的脚本保存到一个文件中,比如说file-path.py,并将其复制到~/.gdb目录下
  3. 更新~/.gdbinit文件,添加以下行: source ~/.gdb/file-path.py
  4. 现在您可以在gdb中使用clippath命令将路径和行号复制到剪贴板中
此外,您可以阅读更多关于GDB Python API的信息 - 链接

一个相关的轻量级vim方法,可以直接在shell上打开vim,并跳转到正确的行:https://github.com/cirosantilli/dotfiles/blob/750aa4e4ad8280a960bd0f0fe883921af5770068/home/.gdbinit.py#L275 - Ciro Santilli OurBigBook.com

2

在Python脚本编写中

如果您想学习Python脚本编写,或者只想看到完整路径而没有其他内容:

class Curpath(gdb.Command):
    """
Print absolute path of the current file.
"""
    def __init__(self):
        super().__init__('curpath', gdb.COMMAND_FILES)
    def invoke(self, argument, from_tty):
        gdb.write(gdb.selected_frame().find_sal().symtab.fullname() + os.linesep)
Curpath()

使用方法:

curpath

1
使用filename-display来控制GDB中文件名的显示方式。要在GDB会话开始时显示绝对文件名,请使用以下命令:
set filename-display absolute

请参阅文档。此选项自GDB 7.6版本以来出现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接