小应用大智慧学习笔记

一、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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章