在linux下,写C和C++时,难免会调试程序,而在linux下,使用gdb来进行调试。

        首先看你的电脑是否已经安装了gdb

                centos 下使用sudo yum install gdb 来安装。

                ubuntu 下使用 sudo apt install gdb 来安装。

        已经安装完gdb后,下面来讲几个常用的gdb的命令:

                首先查看gdb版本,使用 gdb -v 命令

下面就用一个实例来讲解:

Makefile书写:可以先看这篇《教你玩Makefile(一)》

   Makefile

.PHYONE:clean                                                                   
BIN=test
OBJ=test.o
SOURCE=test.c
CC=gcc -g
$(BIN):$(OBJ)
    $(CC) -o $@ $^
$(OBJ):$(SOURCE)
    $(CC) -c $<
clean:
    rm -rf $(BIN) $(OBJ)

test.c

#include <stdio.h>
void display();
int main()
{
    int a = 10;
    int b = 20;
    int c = a + b;
    printf("test gdb ...\n");  
    display(); 
    return 0;
}
void display()
{
    printf("test gdb display...\n");
}



在Makefile中,有CC=gcc -g 中的-g就是生成可以进行调试的可执行文件。

1、首先进入调试中,可以使用gdb + filename ,filename是你的可以调试的可执行文件,进入了调试模式。

2、用list命令查看源码

list + number 表示你要查看number行的代码。

centos7 查看gdb是否安装 linux查看gdb版本_centos7 查看gdb是否安装

list + fun 表示你要查看 fun的函数

centos7 查看gdb是否安装 linux查看gdb版本_函数调用_02

list - 显示当前行前面的代码

在使用gdb调试时使用break命令来设置断点,有如下几种方法:
    break + fun
    在进入指定的函数fun时既停止运行,C++中可以使用class::fun或fun(type, type)格式来指定函数名称
    break lineNumber
    在指定的代码行打断点
    break filename:lineNumber 
    在名称为filename的文件中的第lineNumber行打断点
    break filename:fun
    在名称为filename的文件中的fun函数入口处打断点
    break *address 
    在程序运行的内存地址处打断点
    break 

    在下一条命令处停止运行

    break 可以简写为b

    设置好断点后run 或 r 来运行程序

    运行到断点处停下:

    next + count

         单步跟踪,如果有函数调用不会进入函数,如果后面不加count表示一条一条的执行,加count表示执行后面的count条指令

    step + count 
         单步跟踪,如果有函数调用则进入该函数(进入该函数前提是此函数编译有Debug信息),与next类似,其不加count表示一条一条执行,加上count表示自当前行开始执行count条代码指令 
set step-mode 
set step-mode on用于打开step-mode模式,这样在进行单步跟踪时,程序不会因为没有debug信息而不停止运行,这很有利于查看机器码,可以通过set step-mode off关闭step-mode模式 
finish 
运行程序直到当前函数完成并打印函数返回时的堆栈地址和返回值及参数值等信息。 
until 
运行程序直到退出循环体 
stepi(缩写si)和nexti(缩写ni) 

stepi和nexti用于单步跟踪一条及其指令,一条程序代码有可能由数条机器指令完成,stepi和nexti可以单步执行机器指令。

quit 或者 q退出调试