Diretório de artigos
A depuração é uma parte muito importante do desenvolvimento de software, pois pode nos ajudar a encontrar erros no programa e corrigi-los. Em sistemas Linux, o GDB é uma ferramenta de depuração muito popular e quase todos os desenvolvedores a utilizam para depurar programas. Este artigo apresentará em detalhes como usar o GDB para depurar programas. Se você achar o conteúdo útil para você, não se esqueça de curtir e salvá-lo. Isso será um grande incentivo para mim. Vamos começar esta jornada de aprendizagem juntos!
Passo 1: Instale o GDB
1.1. Instalação do gerenciador de pacotes
Em sistemas Linux, o GDB pode ser instalado usando um gerenciador de pacotes. Por exemplo, em sistemas Ubuntu, você pode usar o seguinte comando para instalar o GDB:
sudo apt-get install gdb
1.2. Baixe o código-fonte, compile e instale
# 1. 打开终端,使用以下命令下载GDB源码压缩包到当前目录
wget http://ftp.gnu.org/gnu/gdb/gdb-9.2.tar.gz 或者 wget https://ftp.gnu.org/gnu/gdb/gdb-12.1.tar.xz
# 2. 解压GDB源码压缩包到当前目录
tar -zxvf gdb-12.1.tar.xz
# 3. 进入GDB源码目录
cd gdb-12.1
# 4. 运行以下命令来配置GDB:这将在`/usr/local/gdb`目录下安装GDB,并启用系统读取行模式和禁用Guile语言
./configure --prefix=/usr/local/gdb --with-system-readline --without-guile
# 5. 运行以下命令来编译GDB源代码并生成可执行文件
make
# 6. 运行以下命令来安装GDB到系统中,并将其添加到系统路径中
sudo make install
# 验证GDB是否成功安装:如果GDB成功安装,将输出GDB的版本信息
gdb --version
Passo 2: Adicione informações de depuração ao compilar o programa
Ao compilar seu programa, você precisa usar -g
opções para adicionar informações de depuração. Por exemplo, se quiser compilar test.c
um programa nomeado, você pode usar o seguinte comando:
gcc -g -Wall test.c -o test
-g
Função: Adicione informações do código-fonte ao arquivo executável, como qual linha do arquivo executável corresponde a qual linha do código-fonte.
-Wall
Função: Ative todos os avisos sem afetar o comportamento do programa, descubra mais problemas e evite BUG desnecessários
Isto irá gerar um arquivo executável com informações de depuração test
.
Passo 3: Inicie o GDB, saia e visualize o código
# 启动GDB并加载可执行文件
gdb test
# 退出
quit
# GDB使用帮助
help
# 给程序设置参数/获取设置参数
set args 10 20
show args
# 查看当前文件代码
1ist/1 (从默认位置显示)
1ist/1 行号 (从指定的行显示)
list/1 函数名(从指定的函数显示)
# 查看非当前文件代码
list/1 文件名:行号
list/1 文件名:函数名
# 设置显示的行数
show list/listsize
set list/listsize 行数
Etapa 4: operação do ponto de interrupção do GDB
# 设置断点,b或者break
b/break 行号
b/break 函数名
b/break 文件名:行号
b/break 文件名:函数
# 查看断点,删除断点
i/info b/break
d/del/delete 断点编号
# 设置断点无效和生效
dis/disable 断点编号
ena/enable 断点编号
# 设置条件断点(一般用在循环的位置)
b/break 10 if i==5
# 要查看当前作用域内的变量值,可以使用`print`命令。例如,要查看变量`x`的值,可以输入以下命令:
print x
Etapa 5: operação de depuração do GDB
5.1 Depuração em etapa única
No GDB, você pode usar o seguinte comando para percorrer um programa:
# 运行gdB程序
start(程序停在第一行)
run(遇到断点才停)
# 继续运行,到下一个断点停
c/continue
# 向下执行一行代码(不会进入函数体)
n/next
# 向下单步调试(遇到函数进入函数体)
s/step
finish(跳出函数体)
# 变量操作
p/print变量名(打印变量值)
ptype 变量名(打印变量类型)
# 自动变量操作
display num(自动打印指定变量的值)
i/info display
undisplay 编号
# 其它操作
setvar变量名=变量值
until(跳出循环)
Para visualizar a pilha de chamadas atual, use backtrace
o comando. Por exemplo, para visualizar detalhes da pilha de chamadas atual, digite o seguinte comando:
backtrace
5.2 Depuração multiprocesso
Ao usar o GDB para depuração, o GDB pode rastrear apenas um processo por padrão. Você pode definir a ferramenta de depuração do GDB para rastrear o processo pai ou rastrear o processo filho por meio de instruções antes de chamar a função fork. O processo pai é rastreado por padrão.
# 设置调试父进程或者子进程
set follow-fork-mode [parent(默认)| child]
# 设置调试模式,默认为on,表示调试当前进程的时候其它的进程继续运行,如果为off,调试当前进程的时候其它进程被GDB挂起。
set detach-on-fork [on | off]
# 查看调试的进程
info inferiors
# 切换当前调试的进程
inferior id
# 使进程脱离 GDB 调试
detach inferiors id
No final deste tutorial detalhado do gdb, eu realmente espero que todos possam gostar e salvá-lo. Isto não é apenas um reconhecimento dos meus esforços pessoais, mas também um incentivo à minha paixão em continuar compartilhando conhecimento. Cada pequena curtida e coleção é meu maior apoio e me dá motivação para continuar criando conteúdo mais valioso. Vamos apoiar uns aos outros no caminho do aprendizado e da exploração e progredir juntos!