1. 动态库
1.1 动态库和静态库的区别
静态库在内存中静态展开,所以就会变成有多少个文件就展开多少次,非常的占内存,但是这种方式速度很快,属于是追求速度,牺牲内存
使用动态库,会将动态库加载到内存,10个文件也只需要加载一次,然后这些文件用到库的时候临时去加载,速度慢一些,但是会省内存
1.2 创建和使用动态库
gcc -shared -fPIC -p [动态库名称].so 文件名.c 文件名.c........
生成好动态库后, 然后和含main函数的.c通过gcc编译 生成可执行文件
gcc main.c [动态库名称].so -o [生成可执行文件的名字]
如果库和头文件位置不在当前路径,就需要写文件路径
gcc main.c -o [可执行文件的名字] [动态库名称] -L [头文件路径] -I [库文件路径]
2. 动态分配
3. main函数接收参数
我们平时写的int main()其实是Linux默许的写法,其实main函数是有参数的,在Linux中,main函数的标准写法应该是int main(int argc, char *argv[])
我们调用函数的时候,可以给参数,例如,我们编译一个main的C语言可执行文件
./main 后面可以输入多个字符串,然后如果输出argv这个数组的话,可以将刚刚的入参全部输出
4. GDB调试工具
4.1 概述
Linux包含了一个gdb的调试程序,它可以
1. 监视程序中的变量
2. 设置断点可以使程序在指定的代码上停止执行
3. 一行行的执行代码,便于发现错误
4.2 GDB的常用命令
4.3 GDB调试编译代码
为了使gdb可以正常工作,我们在编译代码的时候,需要加一个-g,加入调试选项
4.4 常用命令使用
4.4.1 装入调试文件
1. gdb [可执行文件]
2. 可以先进入gdb模式
在gdb模式的时候
(gdb) file[文件名]
4.4.2 查看源代码list或l
(gdb)list #不指定行号,随机列出行号
(gdb)list 20 #显示20行周围的代码,一般是前面一半后面一半
(gdb)list 2,16 #显示2~16行的代码
4.4.3 运行命令
(1)运行命令run或r
(gdb)run/r #运行程序
(2)下一步next或n
会越过函数
(gdb)next/n #下一步
(3)单步执行step或s
会进入函数
(gdb)step/s #下一步
(4)继续运行continue
从断点开始,继续执行文件,遇到断点或者结束时停止
(gdb)continue #继续运行
(5)首行开始start
从断点开始,继续执行文件,遇到断点或者结束时停止
(gdb)start #重新开始
4.4.4 断点操作
(1)设置断点
设置断点,需要知道行号,所以要先用list看看需要在哪一行设置断点,设置成功后,使用run运行程序
1. 指定行设置断点
(gdb)break 4
(gdb)run
2.指定函数前设置断点
(gdb)break add
(gdb)run
3. 使用表达式设置断点(比如循环、嵌套、递归内部变量查看)
(gdb)break 8 if i = 3 #当i=3的时候,启动断点
(gdb)run
(gdb)info locals #查看当前函数所有变量的值
(2)显示断点信息
(gdb)info break
(3)进制或使用断点
(gdb)disable break #禁止使用断点
(gdb)enable break #继续使用断点
(4)删除断点
(gdb)d/delete breakpoint break 断点号n(这个n可以在断点信息中去查询)
(5)清除断点,同样有删除断点的效果
用法和d类似,效果也类似
(6)观察点watch
设置断点的时候,可以用watch给变量赋值,然后用新的值来参与程序的后续运算
(gdb)watch a = 10
后面再使用a的时候,他的值改变,是a
4.4.5 查看数据
(1)查看变量值print或p
(gdb)print [变量名] #查看变量名的值
(2)自动显示变量display
当程序停住时,自动显示变量值
#每次断点停止,自动显示已设置的变量的内容
(gdb) display i #查看变量i的值
...
(gdb)continue
...
undisplay #删除所有显示
delete display n #上次编号为n的显示,用info display可以查看
4.5 其他命令
4.5.1 结束当前函数运行finish
(gdb)finish #退出当前函数
4.5.2 结束当前循环 jump
当进入某个函数或循环的时候,可以用jump跳到n行
(gdb)jump n(行号)
4.5.3 查看变量类型ptype
(gdb)ptype [变量名] #查看变量名的类型
4.5.4 列出当前程序存活的栈帧bt
栈帧:随着函数的调用而在stack上开辟的一篇内存空间,用于存放函数调用时产生的局部变量和临时值
4.5.5 根据栈帧编号,切换栈帧frame
(gdb)bt #显示栈帧
(gdb)frame n #根据显示存货的栈帧编号n,切换到栈帧n