小应用大智慧学习笔记

一、gdb的使用
1、使用gcc -g 编译
2、gdb + 文件名 启动gdb
3、设置断点:break(b) + 函数名
break(b) + 行号
break(b) + 文件名:行号
4、run运行程序
5、next(n)单步执行,不进入子程序
6、step(s)单步执行,进入子函数
7、continue 继续执行到下一个断点
8、print 变量名 查看指定变量值
9、set var=value 设置变量的值
10、quit(q) 退出gdb

二、core dump核心转存
1、linux启动core dump
ulimit -c unlimited
关闭 ulimit -c 0

2、段错误 Segment fault
数组访问越界
访问空指针
栈溢出
修改只读内存
3、core文件分析
gdb ./程序名 core文件名

三、linux应用程序地址布局
1、应用程序的起始地址都是从0x80480000,这是虚拟地址
2、如何查看程序各段地址
使程序一直运行着(while(1)),然后从另一个终端查看该进程的PID(ps aux),然后cat /proc/PID号 查看各段地址布局。。。
3、代码段:代码、全局常量、字符串常量
数据段:全局变量、静态变量
堆:动态分配的变量
栈:局部变量,不包含静态变量
4、如何显示段的详细信息
readelf -S 程序名字
5、bss段包含在数据段,存放全局未初始化的变量(不论静态与否)

四、静态函数库与动态函数库的设计
1、linux应用程序使用的主要函数库均存放在/lib, /usr/lib目录下,采用.so.方式的是 动态函数库,而*.a是静态函数库
2、静态函数库的使用
gcc -static 编译
3、静态函数库的制作
gcc -c mylib.c -o mylib.o
ar cqs libmylib.a mylib.o
将制作好的libmylib.a复制到usr/lib
4、gcc链接时只会默认链接c库,而对于其他函数库,需要用l来指明所链接的库
例:gcc (-static) -l*mylib* -o test
5、动态函数库的制作
gcc -c mylib.c -o mylib.o
gcc -shared -fPIC mylib.o -o libmylib.so
cp libmylib.so /usr/lib/
五、系统调用方式与库函数文件编程
1、系统调用是访问内核,库函数也要通过系统调用,但是因为缓冲技术,所有读写大量数据时,库函数大大减小了系统调用的次数。另外库函数的移植性好,因为库函数在不同的系统接口都是一致的。
2、在linux用man命令查看函数,默认的顺序是命令、系统调用、库函数

六、多进程编程
1、fork 创建子进程,父进程返回子进程PID,子进程返回0;
2、vfork也是创建子进程,与fork不同的是,vfork会先阻塞父进程,待子进程结束后,才开始执行父进程;vfork的子进程与父进程共用同一个数据空间,而fork子、父进程使用不同的数据空间。
3、exit 进程退出,正常退出exit(0),异常退出,exit(1);在父进程中可以与return 0互换,在子进程中只能用exit。
4、pid_t wait(int*statue) 进程等待;挂起进程,直到子进程结束、
5、execl 执行进程 ;execl不同于fork的是,exec保留原有的进程,执行新的代码。fork创建一个新的进程,产生一个新的PID

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值