gdb工具:
GDB的主要功能
-
断点设置:允许开发者在特定的代码行设置断点,当程序执行到该行时会自动暂停,方便开发者进行调试和分析。
-
变量查看与修改:在程序运行过程中,可以查看和修改变量的值,以便了解程序的运行状态。
-
代码执行控制:可以单步执行代码(包括步入、步过、步出),也可以运行到特定行或函数,从而更细致地观察程序的执行过程。
-
回溯和堆栈查看:提供堆栈回溯功能,可以查看函数调用栈,了解函数调用顺序和当前执行的位置。
-
内存查看:可以查看程序的内存使用情况,包括读取和修改内存内容,有助于发现内存泄漏、越界等问题。
-
进程控制:可以启动、停止、继续、杀死被调试的程序,方便进行各种调试操作。
-
命令脚本:支持编写命令脚本,实现自动化调试过程,提高调试效率。
用法:(Linux)
gcc -g 文件名 -o 执行文件名
gdb 执行文件名------进入调试页面
l(list)-----默认看十行代码
r(run)-----跑程序代码
b(breakpoint)-----设置一个断点,代码运行到断点会停止
c(continue)------继续执行代码,到下一个断点
n(next)------一行一行的执行代码,但是不会进入函数
首先设置一个断点,然后r跑程序,程序运行到断点停止,使用n接着往下一行一行执行代码,由图可以看出,当执行到我的自定义函数show之后再n执行下一行就到了return,并没有进入我的show函数。
s-----一行一行执行代码,但是会进入函数
首先设置一个断点,然后r跑程序,程序运行到断点停止,使用s接着往下一行一行执行代码,由图可以看出, 当我执行到第19行我的自定义函数的时候,在s执行下一行它就会进入到我的自定义函数里面去一行一行执行;这里除了自定义的函数,库函数也会进入。
d 断点序号 ------删除对应序号的断点,如果d后面什么都不加,默认删除所有断点
p 变量名 -------输出变量名的值
在断点之后使用n一行一行执行代码,当执行到循环时,使用p i就可以查看这一次循环i的值为多少,当我们执行代码发生错误或者死循环时就可以使用它来查看循环中哪里出了问题。
q -----退出gdb调试
make工具:
make工具是一个解释器 ,用来解释makefile文件,它会默认在当前路径下执行makefile或者Makefile
作用:节省大量时间,只会根据文件修改的时间戳的改变而编译对应的文件,没有改变的不会再重复编译
时间戳:文件最近一次修改的时间
常用makefile一般形式:
目标文件:依赖文件
(Tab空格)编译规则
目标文件:通过编译规则之后得到的文件
依赖文件:生成目标文件所需要编译的文件,如果没有依赖文件,会继续寻找生成依赖文件的依赖文件,直到找完所有依赖文件或者报错为止
gcc编译的四个步骤:
1、预处理,展开文件的头文件和宏定义
gcc -E 1.c -o 1.i
2、编译,检查语法错误
gcc -S 1.i -o 1.s
3、汇编,生成计算机能够识别的二进制文件
gcc -c 1.s -o 1.o
4、链接、生成最终执行文件
gcc 1.o -o a.out
例:
OBJS=huiwen.o my_rechar.o
cc=gcc
OBJS1=huiwen.c
OBJS2=my_rechar.c
TARGET1=huiwen.o
TARGET2=my_rechar.o
${TARGET}:${OBJS}
${cc} ${OBJS} -o ${TARGET}
${TARGET1}:${OBJS1}
${CC} -c ${OBJS1} -o ${TARGET1}
${TARGET2}:${OBJS2}
${cc} -c ${OBJS2} -o ${TARGET2}
clean:
rm ${OBJS} ${TARGET}
#h:huiwen.o my_rechar.o
# gcc huiwen.o my_rechar.o -o h
#huiwen.o:huiwen.c
# gcc -c huiwen.c -o huiwen.o
#my_rechar.o:my_rechar.c
# gcc -c my_rechar.c -o my_rechar.o
#clean:
# rm huiwen.o my_rechar.o h
解析:这里的huiwen.c、my_rechar.c是功能函数和主函数,还有一个huiwen.h是放头文件的,下面带#号的就是一般写法,通过.o文件生成可执行文件,然后.o文件又是由.c文件生成,最后的clean是删除生成的.o文件,以便于我们更改之后重新make;上面的是通用的写法,用一个通用的变量名来代替可执行文件、目标文件和依赖文件,这样后续我们编译其他文件的时候只需要修改最前面变量的内容即可,就不需要再写一遍编译规则。