一.gdb
gdb工具用来调试代码,所调试的可执行文件必须以-g 形式编译。否则无调试所需的环境。
gdb调试时,b设置断点,info b查看所有断点。
run 可以执行程序,停止在第一个断点。
n/s操作可以执行下一段语句,n会跳过函数,s会进入函数内部,这里由于跳入了不同的函数,由于作用域的存在,只可以访问当前函数内存在的变量,因为每一个函数都会有自己的一段栈帧,可以使用bt命令,查看当前程序中存在的栈帧。可以使用frame切换栈帧。
在某作用域中的变量,可以通过p命令查看它的内容,通过display命令可以监测该变量,undisplay取消监测。
在使用p和ptype时,如果处于一个函数区间内,想要去查看另一个函数内的局部变量内容是不可行的,这要引入栈帧的概念:
栈帧
一个进程地址空间的栈区(Stack),由一个个函数的栈帧组成。
栈帧是随着函数调用而在stack上开辟的一片内存空间。用于存放函数调用时产生的局部变量和临时值。
当函数开始执行时,开辟栈帧,存放局部变量等信息,函数执行结束后,释放栈帧,局部变量随之释放。
这就解释了在某一个栈帧内部,只能查看它自身的变量信息,无法查看其他栈帧的变量信息。
如下图,该进程正在执行main函数和selectsort函数,共有两个栈帧。
在gdb调试过程中:
使用bt来查看当前进程具有的全部栈帧
使用frame+栈帧号 实现切换栈帧
二.Makefile
Makefile本质上是一系列脚本命令的集合文件,可以用来管理项目。
记住一个规则,两个函数,三个自动变量
1.makefile规则
目标:依赖
(tab缩进) 命令
makefile文件默认以第一个目标为终极目标,但是可以使用ALL: 来指定终极目标。
为什么要用makefile管理?
若同时编译多个文件生成可执行程序,对于某个源文件,若其进行修改,则需要联通其它文件一起重新编译,这会有时间的开销,但是如果只重新编译要修改的文件,然后再与其它文件链接,就可以省去其他文件的二次编译。
所以可以使用makefile将步骤拆分,当有文件被修改时,makefile自动重新执行被修改的文件命令,就可以省去编译的一部分时间。
2.makefile两个函数
第一个函数: wildcard
src = $(wildcard *.#) 使用变量名接受 wildcard *.# 所返回的列表(代表当前目录下后缀名为#的所有文件)
第二个函数: patsubst
表示将src列表中的第一参数后缀名更改为第二参数后缀名
clean:
它默认不执行,只有在输入make clean命令时才执行,它没有依赖,只是命令。
命令:make clean
在执行前使用make clean -n可以查看当前会执行的命令,确保没有错误删除
3.makefile的三个自动变量