GDB是GNU开源组织发布的一个强大的UNIX/LINUX下的程序调试工具,因为很多优秀的应用都是C开发的,如:mysql、redis、php等,掌握gdb对了解这些应用和学习更是如虎添翼
gdb基本命令
命令(缩写) | 功 能 |
run(r) | 启动或者重启一个程序。 |
list(l) | 显示带有行号的源码。 |
continue(c) | 让暂停的程序继续运行。 |
next(n) | 单步调试程序,即手动控制代码一行一行地执行。 |
step(s) | 如果有调用函数,进入调用的函数内部;否则,和 next 命令的功能一样。 |
until(u)
until location(u location)
|
当你厌倦了在一个循环体内单步跟踪时,单纯使用 until 命令,可以运行程序直到退出循环体。
until n 命令中,n 为某一行代码的行号,该命令会使程序运行至第 n 行代码处停止。
|
finish(fi) | 结束当前正在执行的函数,并在跳出函数后暂停程序的执行。 |
return(return) | 结束当前调用函数并返回指定值,到上一层函数调用处停止程序执行。 |
jump(j) | 使程序从当前要执行的代码处,直接跳转到指定位置处继续执行后续的代码。 |
print(p) | 打印指定变量的值。 |
quit(q) | 退出 GDB 调试器。 |
display(disp) | 跟踪查看某个变量,每次停下来都显示它的值 |
watch | 监视变量值的变化 |
delete | 输入命令delete, 再加上断点编号,可以删除对应编号的断点 |
clear | 输入命令clear, 再加上行号,可以删除对应行号的断点 |
disable | 输入命令disable, 再加上断点编号,可以禁用该断点 |
准备一段c程序
#include <stdio.h> int print(int num){ int ret = num * num; return ret; } int myfunc(int num){ int i = 1; int sum = 0; while(i <= num){ sum += print(i); i++; } return sum; } int main(){ int num =0; scanf("%d", &num); int result = myfunc(num); printf("%d", result); return 0; }
编译成能gdb调试的可执行文件
gcc -g -o main.out main.c
-g 参数表示可用于gdb调试
开始gdb调试
gdb main.out #运行编译好的c程序
list #查看代码
break 8 #在程序第8行打断点
info breakpoints #查看断点信息
run # 打完断点后可使用run 重新运行程序
12 #是程序中接收的输入, 与gdb 调试无关
n #next 下一步,如果是下一步是方法,不进入方法内
s #step 下一步,如果下一步是方法,进入方法内
finish #跳出当前运行的方法,并在跳出方法后暂停程序的执行
c #continue ,继续运行至下一个断点或程序末尾
问题汇总:
Missing separate debuginfos, use: debuginfo-install glibc-2.17-222.el7.x86_64
# vim /etc/yum.repos.d/CentOS-Debuginfo.repo
enable=1
yum install glibc debuginfo-install glibc-2.17-222.el7.x86_64