在Linux软件开发过程中,调试是不可避免的一环,而GDB(GNU Debugger)是最强大的调试工具之一,用于发现运行程序中的疏漏并修复它们。这篇博客将通过详尽的介绍和实用的示例,帮助您熟练掌握GDB的使用方法
list (l) 行号
:从指定行号开始显示代码,每次显示10行。list (l) 函数名
:显示指定函数的源代码。运行和控制执行
run (r)
:开始运行程序。next (n)
:执行下一行代码,不进入函数内部。step (s)
:执行下一行代码,如果是函数则进入函数内部。continue (c)
:从当前断点继续执行,直到遇到下一个断点。finish
:运行直到当前函数返回。断点管理
break (b) 行号
或函数名
:在指定位置设置断点。info break
:列出所有断点。delete breakpoints
:删除所有断点。enable/disable breakpoints
:启用/禁用断点。变量和表达式
print (p) 表达式
:评估并打印表达式的值。set var 变量名=值
:设置变量的值。display 变量名
:自动显示变量的值每次程序停止时。undisplay
:停止显示先前设置的变量。调试信息
info locals
:显示当前函数的局部变量。backtrace (bt)
:显示当前的函数调用栈轨迹
背景知识
发布模式简介
Linux下使用GCC或G++编译器生成的程序默认是没有调试信息的release模式。为了能使用GDB有效地进行调试,开发者需要在编译时添加-g
选项,这样编译出的程序才包含足够的调试信息。
- Debug模式:
gcc -g source.c -o executable
- Release模式:
gcc source.c -o executable
GDB的启动与退出
启动GDB非常简单,只需要在命令行中输入gdb
后跟您的二进制文件名。例如:
gdb my_program
退出GDB,您可以使用quit
命令或按Ctrl + D
GDB的核心功能
查看和编辑代码
- 查看代码:
list
或l
命令用来显示源代码:list 10
显示从第10行开始的源代码。list main
显示main
函数的代码。
- 编辑代码: GDB自身不支持编辑代码,需要退出并使用文本编辑器修改后重新编译。
断点管理
断点是调试的核心,GDB提供了多种设置断点的方法:
- 设置断点:
break 100
在第100行设置断点。break func
在函数func
的起始处设置断点。
- 查看断点:
info breakpoints
显示所有设置的断点和它们的状态。 - 禁用和启用断点:
disable 1
禁用编号为1的断点。enable 1
启用编号为1的断点。
- 删除断点:
delete 2
删除编号为2的断点。
程序的执行控制
- 开始执行:
run
命令从头开始执行程序。 - 逐行执行:
next
或n
: 执行下一行,不进入函数内部。step
或s
: 执行下一行,如果有函数调用则进入函数。
- 继续执行:
continue
从当前位置继续执行到下一个断点。 - 执行直到返回:
finish
命令让程序运行直到当前函数完成返回。
查看和修改数据
- 打印变量:
print var
显示变量var
的值。 - 设置变量:
set var index=10
将变量index
的值设置为10。 - 自动显示变量: 使用
display var
命令在每次程序停下来时自动显示变量var
的值。
使用条件断点和观察点
- 条件断点:
break 50 if x==0
只在x
为0时在第50行停止。 - 观察点:
watch x
当变量x
的值改变时停止执行。
结语
GDB是一款功能强大的调试工具,通过本篇详细的介绍和示例,您应该能够更好地掌握如何使用GDB来调试您的Linux程序。记住,熟练使用GDB需要时间和实践,不断实践将帮助您更快速地发现并修复代码中的问题。