Linux 调试工具 gdb
编译链接
gcc的可执行文件,默认是release得
release 发行版本
debug 开发版本 可调式版本。
ELF 文件的组成.text .data .bss(best 中间那个忘记了是啥了,space)
用 readelf -S 查看文件信息可以得知,debug版本比release版本多了一些debug信息。
编译过程中加入了debug信息
gcc -c main.c -g
链接不会加入debug信息
gcc -o main mian.o
调试的对象:
main.c main.o(可重定位的二进制文件) debug(这个就是调试的对象)
调试过程
1,显示代码
list,l
list filename:num显示指定文件指定行附近的源代码
2,断点
b linenum 给指定行添加断点
b funactionname 给指定函数添加断点
b filenum:linenum 给指定文件指定行添加文件
d dnum 删除断点
distable 将断点设置为失效 disable 不加断点号 代表全部失效
enable 将断点设置为有效的
info b 显示断点信息
b 19 if i==5 条件断点(特定模块才暂停)
断点有类型~TYPE
3,启动
r==》启动
s==》进入函数等同于VS中F11
n==》进入下一步等同于VS中F10
finish 退出函数执行。
c 继续运行 运行到下一个断点。(执行到下一个断点或者执行完毕===》看你后面有没有断点了)。
q退出调试。
p valname 变量的值。
p &valname 变量的地址。
p *ptr 查看指针指向的地址存储的值。
int arr[10]={};
int *ptrarr=arr;
p arr 显示数据所有的元素。
p *ptrarr@num 通过指向数组的指针显示数组所有元素。
p struct_val 显示结构体变量中所有的成员值。
p struct_val.a 显示结构体变量的成员名字。
p struct_val->a 通过指针显示结构体变量某个成员的值。
p funactionname(a,b) 将函数的返回值显示出来 将函数测试运行。
Linux文件类型:
目录 普通 链接 管道 设备
链接文件:软连接和硬链接
软连接:相当于Windows下的快捷方式软连接和源文件使用不同的inode结点。ln -s 源文件 要创建的文件
Linux ext3 ext4 XFS 索引式文件系统(磁盘格式化时,将磁盘空间分了三个部分 inode block superblock){
superblock :存储整个文件系统的信息,包括inode&block(4k)的总量使用量剩余量。
inode:存储文件的属性信息,包括文件的权限、用户。。。。(block编号)
block:存储文件的真实内容。
}
U盘 FAT32 链接式文件系统
Windows NTFS
硬链接:相当于源文件的别名,因为链接文件和源文件使用同一个inode结点。(ls -i 可以查看文件i结点);
Linux(进程管理,内存管理,文件管理)很重要
库文件:静态库 和动态库(共享库):
静态库:(中间文件的集合)(生成的可执行文件最终执行时,并不依赖库文件)(后缀windows .lib Linux .a)
链接阶段直接将库中的内容合并到最终的可执行文件中。
动态库:(不可执行的可执行文件,不可单独执行)(库也加载到内存上,源程序执行必须依赖库)(后缀Windows .dll Linux .so)
链接阶段只在可执行文件中设置使用的库,运行时,由操作系统动态加载到内存上执行。
创建:
静态库:
list.c queue.c stack.c
gcc -c list.c queue.c stack.c ---->.o
ar crv libxxxx.a .o ---->libxxxxxx.a(静态库)
静态库的使用:
main.c
1,gcc -o main main.c -L(库的路径) -l(库名称 ex:xxxx)
2,gcc -o main main.c 路径/libxxxx.a
动态库:
创建:
gcc -shared -fPIC -o libxxxx.so *.c
用法:
gcc -o main main.c -L. -lxxxx(操作系统默认加载动态库路径 /lib /usr/lib)
assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:
#include <assert.h> void assert( int expression );
问题:(原因:操作系统默认加载动态库路径 /lib /usr/lib)
1,将lib放到lib底下去
2,设置环境变量,使操作系统加载时除了在默认路径下搜索,还需要到用户指定路径下搜索。
/root/lib
export LD_LIBRARY_PATH=/root/lib