1.调试器-gdb
1.2注意
如果要在linux操作系统底下,进行调程序,需要在编译程序的时候,将程序编译为debug版本。
debug:是程序的一个调试版本,增加了一些调试信息,这些调试信息,可以帮助程序员调试代码。
release:是程序的发布版本,客户一般拿到的是这个版本,这个版本相对于debug版本,编译器在编译的时候做了优化,程序运行更快;
Linux 操作系统下,默认在编译的时候生成的是release版本;如果想要生成debug版本,在编译的时候需要增加"-g"命令行参数
1.3调试的起手式
1.3.1调试可执行程序
1.gdb [可执行程序的名称]
2.查看源代码:l(list)
3.打断点:b [行号](源码文件中的行号)
4. 如何删除断点:delete [断点的序号]
5.查看断点信息:i b(info breakpoints)
6.使断点失效:disable [断点的序号]
断点本质上还是在的,但是程序在执行的时候就不会停留在失效的断点处
7.使断点生效:enable [断点的序号]
8.使程序运行:r(run)
9.逐过程执行:对标win当中的F10,执行的命令是:n(next)
逐过程不会进入到被调用函数内部执行
10.逐语句执行:对标win当中的F11,执行的命令是:s(step)
逐语句会进入到被调用函数内部执行
11.继续执行:c(遇到下一个断点的时候就会停止执行)
12.打印变量的值:p [变量名称]
p [变量名称]:不仅仅局限于普通变量,还可以打印指针变量,还可以打印对象
13.退出:q (quit) 或 ctrl + d
注意:开始执行gdb命令的时候,可以直接回车执行上一次的命令
1.3.2调试coredump文件
1.前提: 本质上是调试程序崩溃之后的内存镜像文件。
内存镜像文件保存的是程序在崩溃的一瞬间内存当中的值
2.Segmentation fault:段错误,内存访问越界,或者访问空指针导致的。
3.产生cordump文件的条件:
linux操作系统当中需要设置core size的大小。
命令:unlimit -c
4.磁盘大小并不是无限制,磁盘大小大于镜像文件大小。
例如:core 31351就是内存镜像文件保存的是程序崩溃那一瞬间内存当中的值。
报错:program terminated with signal 11, Segmentation fault.
程序收到了11号信号,产生了段错误,*lp = a ,提示程序员崩溃的代码是哪一行。错误原因,解引用崩溃,有可能解引用了空指针,也有可能引用了野指针。
调试coredump文件:gdb [可执行程序][coredump文件]
- bt查看函数的调用堆栈,查看的时候需要从下往上看
- f 堆栈序号 跳转到某一个具体的堆栈
tips:
11号信号:1.解引用空指针 2.解引用野指针 3. 越界访问内存
6号信号: double free 重复释放
2.make/makefile
-
make 解释器,自动化解释工具 makefile是一个文件
-
通过make解释makefile文件,可以构建可执行程序
-
makefile文件的规则:
- 目标对象:需要生成什么可执行程序或者目标程序(.o)
- 依赖对象:生成目标对象的时候,依赖的文件。
- 编译命令:如何使用依赖对象生成目标对象
-
make解释makefile规则
- make解释器在解释makefile的时候,会对比依赖对象(源文件)和目标对象(可执行程序)的生成时间
- 如果目标对象(可执行程序)生成的时间距离现在较近,说明目标对象是最新的,不需要重新编译
(time - 目标对象的生成时间) < (time - 依赖对象的生成时间)- 如果依赖对象(源文件)生成的时间距离现在比较近,说明依赖对象(源码文件)更改过,需要重新编译
(time - 目标对象的生成时间) > (time - 依赖对象的生成时间)
-
预定义变量
-
$^:依赖所有对象
-
$@:目标对象
-
gcc $^ -o $@
-
-
makefile的清理想要删除生成的目标对象
-
makefile当中也可以自定义变量
3.git
-
克隆仓库
- git clone “仓库的url”
-
上传
-
标记:告诉git工具需要管理那些文件
- git add [filename]/*
-
提交到本地仓库
- git commit -m “提交日志及为什么上传”
-
推送给远端仓库
- git push origin master
-
-
删除仓库中的内容
- 本地仓库内容 + 远端仓库内容
- git rm “文件”
- git commit -m “提交日志”
- git push origin master
-
从远端仓库下载源代码
- git pull