gdb简介
GDB(GNU Debugger)是GCC的调试工具。
要使用GDB,需要在源代码编译的时候添加 -g 参数。
用到四个基础文件 file1.c、file2.c 、head.h、hello.c,一个 makefile 文件
其中文件file1.c 如下:
#include"head.h"
int sum(int a, int b)
{
printf("here is file1\n");
return a+b;
}
其中文件file2.c 如下:
#include"head.h"
int mul(int a,int b)
{
printf("here is file2\n");
return a*b;
}
其中文件head.h如下:
#include<stdio.h>
int sum(int a,int b);
int mul(int a,int b);
其中调用文件 hello.c 如下:
#include"head.h"
int main()
{
printf("here is hello.c\n");
int a=sum(1,2);
int b=mul(2,2);
printf("1+2=%d\n",a);
printf("2*2=%d\n",b);
return 0;
}
makefile文件:
src=$(wildcard ./*.c)
obj=$(patsubst %.c,%.o,$(src))
target=hello
CC=gcc
CPPFLAGS=-I ./
# 最终目标
$(target):$(obj)
$(CC) -o $@ $^
#注意这里加了参数 -g
%.o:%.c
$(CC) -o $@ -g -c $< $(CPPFLAGS)
# 伪目标
.PHONY:clean
clean:
rm -rf $(target) $(obj)
使用 make 命令生成 hello 可执行文件,注意在编译阶段一定要添加 -g 参数
make
#输出,并生成 hello 可执行文件
gcc -o file2.o -g -c file2.c -I./
gcc -o hello.o -g -c hello.c -I./
gcc -o file1.o -g -c file1.c -I./
gcc -o hello file2.o hello.o file1.o
gdb启动
gdb启动命令
#gdb 可执行文件
gdb hello
#输出
GNU gdb (Ubuntu 8.1.1-0ubuntu1) 8.1.1
Copyright (C) 2018 Free Software Foundation, Inc.
...
...
Reading symbols from hello...done.
(gdb)
gdb 就启动了,可以在gdb里面输入以下相关调试命令进行调试
1. 显示源代码
命令 | 作用 |
---|---|
show listsize | 查看当前 list 命令显示的行数 |
set listsize count | 设置 list 命令显示的行数为count |
list | 显示当前源程序文件,显示下方默认行数的内容 |
list - | 这里可以理解成减号,显示上方默认行数的内容 |
list linenum | 显示 linenum 行处的上下文内容 |
list function | 显示函数名为function的函数的源程序 |
list file:linenum | 显示file文件下第n行 |
list file:function | 显示file文件的函数名为function的函数的源程序 |
show listsize
查看当前 list命令 显示行数的大小
(gdb) show listsize
#输出,默认显示 10行
Number of source lines gdb will list by default is 10.
set listsize count
设置一次显示源代码的行数
#设置默认显示 5行
(gdb) set listsize 5
#输出默认显示行数
(gdb) show listsize
#输出,默认显示5行
Number of source lines gdb will list by default is 5.
2. 设置断点
设置断点用 break 命令, 简写为 b
2.1 添加断点
命令 | 作用 |
---|---|
b linenum | 在第 linenum 行设置断点 |
b func | 在函数 func 入口处设置断点 |
b filename:linenum | 在源文件filename的linenum行处设置断点 |
b filename:function | 在源文件filename的function函数的入口处设置断点 |
b test.c:8 if value== 5 | 条件断点,当变量value的值为5时断电生效 |
2.2 查看所有断点
命令 | 作用 |
---|---|
info break | 简写 i b ,查询所有断点 |
2.3 断点属性修改
删除断点
命令 | 作用 |
---|---|
delete num | 简写 d num ,删除某个断点 |
delete num1 num2 | 简写 d num1 num2,删除多个断点 |
delete n1-n2 | 简写 d n1-n2 ,删除多个断点 |
delete | 删除所有断点 |
禁用断点
命令 | 作用 |
---|---|
disable num | 简写 dis num ,禁用某个断点 |
disable num1 num2 | 简写 dis num1 num2,禁用多个断点 |
disable n1-n2 | 简写 dis n1-n2 ,禁用多个断点 |
disable | 禁用所有断点 |
启用断点
命令 | 作用 |
---|---|
enable num | 简写 ena num ,启用某个断点 |
enable num1 num2 | 简写 ena num1 num2,启用多个断点 |
enable n1-n2 | 简写 ena n1-n2 ,启用多个断点 |
enable | 启用所有断点 |
3. 调试代码
命令 | 作用 |
---|---|
run | 简写 r ,运行程序,有断点也不停 |
start | 运行程序,有断点停止运行 |
next | 简写 n,单步执行 |
step | 简写 s,单步执行,可以进入函数体内 |
finish | 退出函数体 |
until | 简写为u,在循环体内单步执行, 直到退出循环体 |
continue | 简写为c,继续运行程序, 若有断点则跳到下一个断点处 |
4. 查看变量的值
命令 | 作用 |
---|---|
print count | 简写p count,打印变量count |
display 变量名 | 添加一个变量名展示 |
info display | 查看添加了哪些变量名展示 |
undisplay num(info display时显示的编号) | 删除某个变量展示 |
delete display num | 删除某个变量展示 |
disable display num | 禁用某个变量的展示 |
enable display num | 启用某个变量的展示 |
5. 其他语法
查看变量类型: ptype 变量名
临时设置变量的值:set var 变量名=值