Перейти к содержанию

Последнее обновление:2026-10-12

Расширенная отладка с помощью GDB Python

0. Вступление

Отладка — неотъемлемая часть процесса разработки ПО, а GDB (отладчик GNU), как мощный инструмент отладки, широко распространён среди разработчиков. Помимо традиционной командной отладки, GDB предоставляет Python-библиотеку GDB, позволяющую разработчикам расширять и усиливать возможности отладки на языке Python. Эта статья расскажет, как использовать Python-библиотеку GDB в GDB, и продемонстрирует её мощные возможности отладки и сценарии применения.

Перед началом убедитесь, что Python и GDB правильно установлены и версия Python совместима с GDB. Затем выполните следующие шаги для установки Python-библиотеки GDB:

a. Выполните в командной строке gdb, чтобы открыть GDB.

b. Введите команду python, чтобы войти в Python-интерпретатор GDB.

c. Выполните import gdb; если ошибок нет, Python-библиотека GDB установлена правильно.

(gdb) python
>import gdb
>end
В процессе отладки с помощью gdb нам часто хочется просмотреть переменные сложных структур, например структуру List в PostgreSQL — туда можно положить что угодно, и что именно внутри, напрямую напечатать трудно; тут в нашей повседневной разработке и появляются python-скрипты, пример ниже:

(gdb) tl
TargetEntry [resno=1 resname="sum"]
    Aggref [aggfnoid=2107 aggtype=1700 aggtranstype=2281 aggstar=false aggvariadic=false aggkind=110 'n' agglevelsup=0 aggsplit=AGGSPLIT_FINAL_DESERIAL aggno=0 aggtransno=0 agg_expr_id=0]

1. Hello python gdb

Мы можем выполнять в gdb некоторые python-операции, например print, как показано ниже:

scssCopy code
(gdb) python
> print(1+2)
> end
3
(gdb) end
This command cannot be used at the top level.
В этом примере мы вошли в Python-интерпретатор GDB и выполнили простой Python-оператор print(1+2); результат — 3.

Другой пример: можно напрямую ввести python xxxx для запуска.

scssCopy code
(gdb) python f = 2
(gdb) python print(f)
2
В этом примере мы определили в GDB с помощью Python-оператора переменную f и напечатали её значение; результат — 2.

2. Практика: как писать?

Ключевой вопрос — как писать такие скрипты? С их помощью удобно печатать собственные структуры кода; ниже практическая часть; соответствующий код и материалы этого раздела будут выложены в закрытом сообществе, приглашаем следить:

struct Point {
    int x;
    int y;
};
Пусть есть структура Point, и я хочу напечатать её с помощью скрипта — как это реализовать?

Логика очень простая: читаем структуру и делаем print.

import gdb

def print_point(point):
    print(f"Point: x={point['x']}, y={point['y']}")

def print_person(person):
    age = person['age']
    print(f"Person: age={age}")

class PrintCppStruct(gdb.Command):
    def __init__(self):
        super(PrintCppStruct, self).__init__("print_cpp_struct", gdb.COMMAND_USER)

    def invoke(self, arg, from_tty):
        try:
            cl = gdb.parse_and_eval(arg)
            if cl.type.code == gdb.TYPE_CODE_STRUCT and str(cl.type) == 'Point':
                print_point(cl)
            elif cl.type.code == gdb.TYPE_CODE_STRUCT and str(cl.type) == 'Person':
                print_person(cl)
            else:
                print("Unknown C++ structure type.")
        except gdb.error as e:
            print(f"Error: {e}")

PrintCppStruct()
Как использовать?

Достаточно source:

(gdb) source print.py
В этом примере мы загрузили в GDB с помощью команды source Python-скрипт с именем print.py.

(gdb) print_cpp_struct myPoint
Point: x=10, y=20
В этом примере мы использовали в GDB собственную команду print_cpp_struct, которая через Python-библиотеку GDB напечатала значение C++-структуры с именем myPoint.

Используя в GDB Python-библиотеку GDB, разработчики могут задействовать всю мощь Python для расширения и усиления возможностей отладки. Она предоставляет богатый API и гибкие возможности написания скриптов, делая процесс отладки более эффективным и удобным. Будь то автоматизация отладочных задач, анализ и визуализация данных или динамическое изменение поведения программы — Python-библиотека GDB даёт разработчикам богатый выбор и гибкость. Надеюсь, эта статья поможет вам лучше понять и применять Python-библиотеку GDB, повышая навыки отладки и эффективность разработки.

Похожие темы

Комментарии