GDB/Core Dump/静态链接库/动态链接库

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 指明产生动态链接库

猜你喜欢

转载自blog.csdn.net/sinat_23185975/article/details/81055373