本文共 2377 字,大约阅读时间需要 7 分钟。
GDB(GNU Project Debugger)是Linux和Unix系统中最强大的调试工具之一。它能够帮助开发者深入了解程序在执行过程中的内部状态,定位错误并修复问题。以下是关于GDB的一些实用知识和调试示例。
GDB 的安装方法因系统而异。通常情况下,可以通过以下命令安装:
sudo apt-get install gdb
安装完成后,可以通过终端运行 gdb 命令进入调试环境。
GDB 提供丰富的命令行帮助,使用以下命令查看所有调试命令:
help
使用 list 命令可以查看程序的源代码:
list
可以指定行号或函数名:
list 5list fib
next 命令用于单步执行程序:
next
或使用简写 n:
n
step 命令可以跳转到函数定义处:
step fib
backtrace 命令(简写为 bt)可以显示当前函数调用的堆栈信息:
bt
info 命令(简写为 i)可以查看当前栈帧中的局部变量:
info
编写一个斐波那契数列函数,发现当输入 n 为负数时,程序会进入死循环。
int fib(int n) { int a = 0, b = 1, t; while (n--) { t = a + b; a = b; b = t; } return a;}int main() { int n = 0; for (; n < 10; n++) { printf("斐波那契数列第 %d 项为: %d\n", n, fib(n)); } return 0;} 生成调试版本
使用 gcc 编译器添加调试信息:
gcc -g test.c -o test
进入调试环境
使用 gdb 进入调试环境:
gdb test
设置断点
使用 break 命令设置断点:
(gdb) break main
开始调试
使用 start 命令开始执行:
(gdb) start
GDB 会停在 main 函数的第一行。
单步调试
使用 next 命令逐行执行:
(gdb) next
或跳转到 fib 函数:
(gdb) step fib
检查循环问题
使用 backtrace 查看堆栈信息,发现 fib 函数被多次调用。
修复程序
在 fib 函数中添加参数检查:
if (n < 0) return 0;
一个程序在第一次运行时正常,但第二次运行时输出错误。通过断点调试找到问题所在。
int main(void) { int sum = 0, i = 0; char input[5]; while (1) { printf("输入: "); scanf("%s", input); for (i = 0; input[i] != '\0'; i++) { sum = sum * 10 + input[i] - '0'; } printf("输出:%d\n", sum); } return 0;} 设置断点
使用 break 命令设置断点:
(gdb) break main
或在循环开始处设置断点:
(gdb) break while
运行程序
使用 run 命令开始执行:
(gdb) run
由于断点设置在 main 函数的入口处,程序会暂停在断点处。
观察程序执行
使用 next 命令继续执行,直到触发断点。
分析问题
观察到第二次输入时,sum 变量没有被重置,导致错误。
修复程序
在循环开始处重置 sum:
sum = 0;
程序中一个数组可能被其他变量共享,导致数据污染。使用观察点追踪数组访问情况。
int main(void) { int sum = 0, i = 0; char input[5]; while (1) { sum = 0; scanf("%s", input); for (i = 0; input[i] != '\0'; i++) { sum = sum * 10 + input[i] - '0'; } printf("input=%d\n", sum); } return 0;} 设置观察点
使用 watch 命令设置观察点:
(gdb) watch input[5]
运行程序
使用 run 命令开始执行:
(gdb) run
观察结果
发现 input[5] 被多次修改,且与 i 变量共享同一内存地址。
修复程序
使用 scanf_s 或 fgets 替换 scanf,确保输入安全。
bt
continue
frame
info
list
break
step
delete breakpoints
disable
enable
通过以上方法,开发者可以有效地使用 GDB 调试程序,定位错误并快速修复问题。
转载地址:http://wwso.baihongyu.com/