Day 44 Linux入门(动态库 内存分配 main函数接收参数 GDB调试工具)

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.  动态分配

Day 44 Linux入门(动态库 内存分配 main函数接收参数 GDB调试工具)_第1张图片

 

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的常用命令

Day 44 Linux入门(动态库 内存分配 main函数接收参数 GDB调试工具)_第2张图片

 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 

 

 

你可能感兴趣的:(linux,运维,服务器)