Как просмотреть полный путь к файлу в GDB?

Когда я останавливаюсь в точке останова в gdb, он просто показывает filename.cpp. Как просмотреть полный путь к этому файлу?

Ответ 1

Используйте команду info source, чтобы получить информацию о текущем фрейме стека.

Вот пример его вывода:

(gdb) info source
Current source file is /build/gtk+2.0-LJ3oCC/gtk+2.0-2.24.30/modules/input/gtkimcontextxim.c
Located in /home/sashoalm/Desktop/compile/gtk+2.0-2.24.30/modules/input/gtkimcontextxim.c
Contains 1870 lines.
Source language is c.
Producer is GNU C11 5.3.1 20160225 -mtune=generic -march=i686 -g -g -O2 -O2 -fstack-protector-strong -fPIC -fstack-protector-strong.
Compiled with DWARF 2 debugging format.
Does not include preprocessor macro info.

Ответ 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

Ответ 3

Отличный ответ от Сиро Сантилла. Тем не менее, script потребовалась небольшая коррекция для работы с моим gdb 8.0.1.

Я также изменил его, чтобы скопировать текст в буфер обмена, чтобы сразу использовать его в vim. Он отлично работает с file_line.vim. Это пример содержимого буфера обмена, созданного script:

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

script находится ниже:

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()

Вот шаги, чтобы все это работало:

  • Установить библиотеку python pyperclip sudo zypper в python3-pyperclip
  • Сохраните script выше в файл, скажем file-path.py и скопируйте его в ~/.gdb
  • Обновить ~/.gdbinit с добавлением следующих строк: source ~/.gdb/file-path.py
  • Теперь вы можете скопировать путь и строку в буфер обмена с помощью clippath в gdb

И подробнее о API-интерфейсе GDB Python - ссылка