在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行的代码。
list + fun 表示你要查看 fun的函数
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退出调试