小應用大智慧學習筆記

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

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