GDB
生成可调式程序
gcc -g test.c -o test
-g 选项表示生成程序可以使用GDB进行调试
GDB基本命令
基本命令 | 参数 | 说明 |
---|---|---|
list(l) | 查看程序 | |
break(b) | 函数名 | 在函数入口添加断点 |
break(b) | 行号 | 在指定行添加断点 |
break(b) | 文件名:行号 | 在指定文件的指定行添加断点 |
info break | 查看所有设置的断点 | |
delete | 断点编号 | 删除断点 |
next(n) | 单步运行程序(不进入子函数) | |
step(s) | 单步运行程序(进入子函数) | |
continue(c) | 继续运行程序 | |
print(p) | 变量名 | 查看指定变量值 |
set var=value | 设置变量的值 | |
quit(q) | 退出GDB |
Core Dump
core dump定义
定义
核心转存。当程序在运行过程中发生异常,这是Linux可以把程序出错时的内存内容存储在一个core文件中,该过程叫做core dump
core dump只要对付segment fault错误
程序运行产生segment fault错误原因有:
- 数组访问越界
- 访问空指针
- 栈溢出
- 修改只读内存
core dump使能
在Linux系统中,默认关闭core dump功能但是可以通过ulimit命令打开/关闭core dump功能
打开:ulimit -c unlimited
关闭:ulimit -c O
core文件分析
发生coredunp之后可以使用gdb进行查看core文件内容,定位程序出错的位置。
gdb 程序名 core文件
e.g: gdb ./test test.core
静态链接
特点
- 程序所用到的函数代码在链接时全部被copy到程序中。
- 如果有多个进程在内存中同时运行,并且使用了相同得库函数,会有多份拷贝,造成了对空间浪费
- 对程序升级不方便
静态库编译选项
linux默认使用动态链接库进行链接,如果需要使用静态库,需要添加编译选项
-static
e.g:gcc -static test.c -o test
制作静态库
gcc -c nylib.c -o mylib.o
ar cqs libmylib.a mylib.o
动态链接
制作动态链接库
gcc -c mylib.c -o mylib.o
gcc -shared -fPIC mylib.o -o libmylib.so
-fPIC 使输出的对象模块是按照可冲定位地址方式生成的
说明:
如果不加-fPIC,则加载.so文件的代码段时,代码段引用的数据对象需要重定位, 重定位会修改代码段的内容,这就造成每个使用这个.so文件代码段的进程在内核里都会生成这个.so文件代码段的copy.每个copy都不一样,取决于 这个.so文件代码段和数据段内存映射的位置.
-shared 指明产生动态链接库