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

运行结果:

Ubuntu gdal安装完后python调用 ubuntu怎么安装gdb_gdb

可以看到,在输入100的时候输出结果是错误的

  • 下面开始用GDB进行调试, 进入gdb
gcc -o test1 -g test.c
gdb test1
  • 输入l查看代码, 运行结果:
  • Ubuntu gdal安装完后python调用 ubuntu怎么安装gdb_gdb_02

  • 下断点
  • Ubuntu gdal安装完后python调用 ubuntu怎么安装gdb_#include_03

  • 发现问题
  • Ubuntu gdal安装完后python调用 ubuntu怎么安装gdb_GDB_04

经过一步一步查看值的变化,发现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给调用者