Ir para o conteúdo

Última atualização:2026-10-12

Depuração estendida com Python no GDB

0. Introdução

A depuração é uma etapa indispensável no processo de desenvolvimento de software, e o GDB (GNU Debugger), como uma ferramenta de depuração poderosa, é amplamente usado pelos desenvolvedores. Além das funcionalidades tradicionais de depuração por linha de comando, o GDB também oferece a biblioteca GDB para Python, permitindo que os desenvolvedores usem a linguagem Python para expandir e potencializar a depuração. Este artigo mostrará como usar a biblioteca GDB para Python dentro do GDB, apresentando seus poderosos recursos de depuração e casos de uso.

Antes de começar, certifique-se de que o Python e o GDB estejam corretamente instalados e de que a versão do Python seja compatível com o GDB. Em seguida, siga estes passos para instalar a biblioteca GDB para Python:

a. Execute gdb na linha de comando para abrir o GDB.

b. Digite o comando python para entrar no interpretador Python do GDB.

c. Execute import gdb; se não houver erros, a biblioteca GDB para Python está corretamente instalada.

(gdb) python
>import gdb
>end

Durante a depuração com o gdb, geralmente queremos inspecionar algumas variáveis de estruturas complexas, como a estrutura List do PostgreSQL, em que cabe de tudo — e o que exatamente há dentro dela é difícil de imprimir de forma intuitiva. Para isso, no nosso desenvolvimento diário, entram os scripts Python; veja o exemplo abaixo:

(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

Podemos executar algumas operações Python dentro do gdb, como print, conforme mostrado abaixo:

scssCopy code
(gdb) python
> print(1+2)
> end
3
(gdb) end
This command cannot be used at the top level.

Neste exemplo, entramos no interpretador Python do GDB e executamos uma instrução Python simples, print(1+2), cujo resultado foi 3.

Outro exemplo: podemos digitar diretamente python xxxx para executar.

scssCopy code
(gdb) python f = 2
(gdb) python print(f)
2

Neste exemplo, definimos uma variável f com uma instrução Python no GDB e imprimimos o seu valor, que foi 2.

2. Prática: como escrever?

O ponto central é: como escrever esses scripts? A ideia é usar o script para imprimir convenientemente o seu próprio código. A seguir, a parte prática; o código e os materiais relacionados a esta seção serão atualizados na comunidade (星球), fique de olho:

struct Point {
    int x;
    int y;
};

Agora, dada uma estrutura Point, quero imprimi-la por meio de um script — como fazer?

A lógica é muito simples: leia a estrutura e então faça o 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()

Como usar?

Basta usar o source:

(gdb) source print.py

Neste exemplo, carregamos no GDB um script Python chamado print.py por meio do comando source.

(gdb) print_cpp_struct myPoint
Point: x=10, y=20

Neste exemplo, usamos no GDB um comando personalizado, print_cpp_struct, que imprime o valor de uma estrutura C++ chamada myPoint por meio da biblioteca GDB para Python.

Ao usar a biblioteca GDB para Python dentro do GDB, os desenvolvedores podem aproveitar o poder do Python para expandir e potencializar a depuração. Ela oferece uma API rica e flexibilidade para escrever scripts, tornando o processo de depuração mais eficiente e conveniente. Seja para automatizar tarefas de depuração, analisar e visualizar dados, ou modificar dinamicamente o comportamento do programa, a biblioteca GDB para Python oferece aos desenvolvedores muitas opções e flexibilidade. Esperamos que este artigo ajude você a entender e aplicar melhor a biblioteca GDB para Python, aprimorando suas habilidades de depuração e sua produtividade no desenvolvimento.

Tópicos relacionados

Comentários