Ubuntu1804下安装gdb与使用
1. Ubuntu1804下安装gdb
sudo apt-get install gdb
查看安装版本:
gdb --version
GNU gdb (Ubuntu 9.2-0ubuntu1~20.04) 9.2
Copyright (C) 2020 Free Software Foundation, Inc.
2.Ubuntu1804下gdb使用
1. GDB调试实例
- 首先创建一个C语言文件test.c
vim test.c
#include <stdio.h>
void ShowRevertNum(int iNum)
{
while (iNum > 10)
{
printf("%d", iNum % 10);
iNum = iNum / 10;
}
printf("%d\n", iNum);
}
int main(void)
{
int iNum;
printf("Please input a number :");
scanf("%d", &iNum);
printf("After revert : ");
ShowRevertNum(iNum);
}
上面的代码可以逆序输出一个整型数,比如输入123,则输出321。
- 使用gcc生成可执行文件并编译运行
gcc -o test1 test.c
./test1
运行结果:
可以看到,在输入100的时候输出结果是错误的
- 下面开始用GDB进行调试, 进入gdb
gcc -o test1 -g test.c
gdb test1
- 输入l查看代码, 运行结果:
- 下断点
- 发现问题
经过一步一步查看值的变化,发现iNum变成10了之后就不会再进入循环了,所以循环条件应该是大于等于10,我们要对错误进行修改,需要先退出gdb再进行对代码的修改。
- 修改程序,解决问题
程序编译运行后,输入100,得到正确的结果
2. 内存出错的GDB调试
Linux中,程序崩溃时,一般会产生core文件,记录进程退出前的状态,调试段错误问题,借助于该文件,可快速定位问题。
- 首先让Linux系统产生core文件
新建一个C语言文件,输入以下代码:
#include<stdio.h>
int main(void)
{
int *p=0;
*p=1;
return 0;
}
然后输入命令:
ulimit –c 100
让系统产生core文件,运行程序,让程序崩溃,产生core文件,使用gdb配合core文件,定位问题
3.gdb的常用命令
命令 | 结果 |
file | 装入想要调试的可执行文件 |
kill | 终止正在调试的程序 |
list | 列出产生执行文件的源代码的一部分 |
next | 执行一行源代码但不进入函数内部 |
step | 执行一行源代码而且进入函数内部 |
run | 执行当前被调试的程序 |
c | 继续运行程序 |
quit | 终止gdb |
watch | 使你能监视一个变量的值而不管它何时被改变 |
backtrace | 栈跟踪,查出代码被谁调用 |
print | 查看变量的值 |
make | 使你能不退出gdb就可以重新产生可执行文件 |
shell | 使你能不离开gdb就执行UNIX shell命令 |
whatis | 显示变量或函数类型 |
break | 在代码里设断点,这将使程序执行到这里时被挂起 |
info break | 显示当前断点清单,包括到达断点处的次数等 |
info files | 显示被调试文件的详细信息 |
info func | 显示所有的函数名称 |
info local | 显示当函数中的局部变量信息 |
info prog | 显示被调试程序的执行状态 |
delete [n] | 删除第n个断点 |
disable[n] | 关闭第n个断点 |
enable[n] | 开启第n个断点 |
ptype | 显示结构定义 |
set variable | 设置变量的值 |
call name(args) | 调用并执行名为name,参数为args的函数 |
Finish | 终止当前函数并输出返回值 |
return value | 停止当前函数并返回value给调用者 |