1.gdb
可执行文件分两种: 1.默认的为 release版本,也可以叫发行版本,用户使用
2.debug版本,也叫开发版本,开发者使用
1.编译过程中手动加入debug信息,生成对应 .o文件 例如:
gcc -c main.c -g
2.链接不会加入链接文件,对上述的 .o文件进行链接,例如:
gcc -o run main.o
3.可由 .c文件 直接生成debug版本的可执行文件,例如:
gcc -o run main.c -g
下面开始说说进入gdb调试内的一些操作:
l //默认显示main函数所在文件的源代码
list filename:num //显示指定文件的指定行附近的代码
b num //在指定行下断点
b funcname //给指定函数下断点
b filename:linenum //给指定文件的指定行下断点
b num if i==5 //在指定行下条件断点,当 i==5时断点生效,主要是后面的 if 加断点的方式以上几种都可以
info b //显示断点信息
d bpnum //删除断点,根据断点号bpnum删除,断点号可由 显示断点信息 后得到
disable bpnum //将断点设为无效断点
enable bpnum //将断点设为有效断点
gdb执行过程中的控制:
r //启动调试
n //执行下一步
s //进入函数中执行,相当于vs中的 逐语句执行
finish //退出函数继续执行
c //继续执行,直到运行到下一个断点处
q //退出调试
gdb调试过程中如何查看运行的值,类似于vs中的监控功能(结合c语言的知识来看):
p valname //看变量值
p &valname //看变量地址
p *ptr //ptr为一个指针,看指针所指地址存储的值(指针解引用)
p arr //显示数组的所有元素
p ptrarr //ptrarr指向数组arr,显示数组的首地址
p ptrarr@num //通过指向数组的指针显示数组所有元素?(请自行验证,可能描述有误)
p struct_val //显示结构体内的所有成员值
p ptr_struct->a //显示结构体中 a成员的值
p funcname(a, b) //显示函数的返回值,由于函数执行完才会有返回值,所以也可以用来做函数的测试运行
bt //显示函数的调用过程
2.链接
链接分为 软链接和硬链接(Linux中看链接文件和源文件是否是同一个inode结点来判断,看inode的命令为: ls -i )
软链接(可以理解为快捷方式,并不是真的文件所在):
生成软链接命令: ln -s 源文件 链接文件
源文件和链接文件是不同的 inode结点
硬链接(可以理解为起别名):
生成硬链接命令: ln 源文件 链接文件
源文件和链接文件是同一个 inode结点
在这里可以了解一下 { Linux ,Windows, U盘 } 三者分别使用何种文件管理系统,了解这个是比较重要的
操作系统中 进程管理/内存管理/文件管理 是三块大的部分!
3.库文件
库文件分为 静态库 是和 动态库(共享库):
静态库(Linux上为 .a Window上为 .lib )
1.是中间文件的集合,在链接阶段直接将库中的内容合并到最终的可执行文件中,就是说,链接完成后,生成的可执行文 件的执行不再依赖静态库
2.静态库生成的命令: gcc -c *.c (先将.c文件生成对应的.o文件)
ar crv libxxxx.a *.o (其中xxxx是生成的库名,前面的 lib和后面的 .a必须有 )
3.静态库的使用:
第一种: gcc -o run main.c -L(库路径) -l(库名)
例如: gcc -o run main.c -L/home/stu/lib -lList
第二种: gcc -o run main.c 路径/libxxxx.a
例如: gcc -o run main.c /home/stu/lib/libList.a
动态库(Linux上为 .so Window上为 .dll )
1.动态库是 不可单独执行的可执行文件,链接阶段只在可执行文件中设置使用的的库,运行时由操作系统加载到内存上 执行,因此生成的可执行文件在执行时要依赖动态库的存在
2.动态库生成的命令:
gcc -shared -fPIC -o libxxxx.so *.c
3.动态库的使用: 同静态库一样
4.当链接完成后执行时会有问题,问题出现的原因是: 动态库需要由操作系统加载到内存上,但我们自己写的库操作系统 找不到,因此依赖动态库而的程序不能直接运行,会出错! 解决这个问题有以下两种方案:
<1>将动态库拷贝到 /lib 或 /usr/lib 目录下,但是这个操作需要 root 权限,不建议这么做
<2>设置环境变量 export LD_LIBRARY_PATH=动态库所在的绝对路径
但是这么做只在本bash内有效,为了一劳永逸,做以下这个操作:
vi /home/.bashrc //进入到.bashrc这个配置文件中
然后在文件的最后加上一句 export LD_LIBRARY_PATH=动态库所在的绝对路径
5. lddd run //查看可执行文件run中所加载的动态库