文章目录
调试器gdb
-
注意,如果要在linux操作系统底下,进行调程序需要把文件调成debug版中。debug中有一些调试信息,而release是发布版本,在这个版本中运行更快,并且最终debug版本比release版本大,因为debug里面有调试信息。Linux操作系统底下默认在编译的时候生成的是release版本,如果在Linux想要生成一个debug版本需要增加“-g”命令行参数。
命令:gcc test.c -o bb -g
-
调试的起手式
调试可执行程序命令: gdb可执行程序名称
查看源代码: l(list)
打断点: b(breakpoint) 行号(源码文件中的行号)
去除断点: delete 断点的序号
查看断点信息: i b (info breakpoint)
注意:因为之前先打了一个断点,之后又把那个断点删除了,所以断点序号是从2开始的,在linux中断点序号即使被删除,也会算是一个编号。
使断点失效: disable 断点的序号
使断点生效: enable 断点的序号
使程序跑起来: run
如何逐语句执行,对标到window当中是F11,执行的命令是:s(step),逐过程执行,window中是F10,执行的命令是:n(next)。逐语句执行进函数,逐过程执行不进函数。
继续执行: c(countinue)直到遇到下一个断点的时候停止。
注意: 当开始执行gdb命令的时候,可以直接回车,执行上一次的命令。
打印变量的值: p(print)
p 变量名称
p 对象
p 指针
退出: q(quit)
调试coredump文件前提: 本质上是调试程序崩溃之后的内存镜像文件。
Segmentation fault:段错误,内存访问越界,或者访问空指针导致的。产生cordump文件的条件:
-
linux操作系统当中需要设置core size的大小。
命令:unlimit -c -
磁盘大小并不是无限制,磁盘大小大于镜像文件大小。
例如:core 31351就是内存镜像文件保存的是程序崩溃那一瞬间内存当中的值。
报错:program terminated with signal 11, Segmentation fault.
程序收到了11号信号,产生了段错误,*lp = a ,提示程序员崩溃的代码是哪一行。错误原因,解引用崩溃,有可能解引用了空指针,也有可能引用了野指针。
例如:
char * lp (char *)malloc(1024)
strcpy(lp,"aaa");
free(lp)
*lp = 'a'
bt查看函数的调用堆栈,查看的时候需要从下往上看
f 堆栈序号 跳转到某一个具体的堆栈
tips:
11号信号:1.解引用空指针 2.解引用野指针 3. 越界访问内存
6号信号: double free 重复释放
make&makefile
- make 解释器,自动化解释工具 makefile是一个文件
- 通过make解释makefile文件,可以构建可执行程序
- makefile文件的规则:
目标对象:需要生成什么可执行程序或者目标程序(.o)
依赖对象:生成目标对象的时候,依赖的文件。
编译命令:如何使用依赖对象生成目标对象
vim makefile
bb:test.c
gcc test.c -o bb
make 会自动选取当前文件夹下的makefile文件 - make解释makefile规则
make解释器在解释makefile的时候,会比较依赖对象(源文件)和目标文件(可执行程序)的生成时间。如果目标对象(可执行程序)生成的时间距离现在较近,说明依赖对象(源码文件更改过,需重新编译)
只为生成第一个目标对象而服务
make解释器在解释makefile的时候,为了生成第一个目标对象,也会判断第一个目标对象依赖的对象是否存在,如果不在,则在makefile后续的语句当中查找生成依赖对象的方法。先将依赖对象生成,再使用依赖对象将第一个目标对象生成。 - 预定义变量
$^:依赖所有对象
$@:目标对象
gcc $^ -o $@ - makefile的清理想要删除生成的目标对象
- makefile当中也可以自定义变量
vim makefile
CFLAGS = -g
BIN1 = main
BIN2 = bb
all: $ (BIN1) $ (BIN2)
$ :相当于c中的解引用
git版本管理工具
分布式管理
svn
集中式管理
- 克隆仓库
git clone “url” - 上传
(1)标记 git add [filename]
告诉git工具需要管理哪些文件
(2)提交到本地仓库 git commit -m “提交日志”
(3)推送给远端仓库 git push origin master - 删除仓库当中的内容
本地仓库的内容 + 远端仓库的内容
git rm “文件”
git commit -m “xx”
git push origin master - 从远端仓库下载源代码
git pull