可執行檔案分兩種: 1.預設的為 release版本,也可以叫發行版本,使用者使用
2.debug版本,也叫開發版本,開發者使用
1.編譯過程中手動加入debug資訊,生成對應 .o檔案 例如:
gcc -c main.c -g
2.鏈結不會加入鏈結檔案,對上述的 .o檔案進行鏈結,例如:
gcc -o run main.o
3.可由 .c檔案 直接生成debug版本的可執行檔案,例如:
gcc -o run main.c -g
下面開始說說進入gdb除錯內的一些操作:
l //預設顯示main函式所在檔案的源**
list filename:num //顯示指定檔案的指定行附近的**
b num //在指定行下斷點
b funcname //給指定函式下斷點
b filename:linenum //給指定檔案的指定行下斷點
b num if i==5 //在指定行下條件斷點,當 i==5時斷點生效,主要是後面的 if 加斷點的方式以上幾種都可以
info b //顯示斷點資訊
d bpnum //刪除斷點,根據斷點號bpnum刪除,斷點號可由 顯示斷點資訊 後得到
disable bpnum //將斷點設為無效斷點
enable bpnum //將斷點設為有效斷點
gdb執行過程中的控制:
r //啟動除錯
n //執行下一步
s //進入函式中執行,相當於vs中的 逐語句執行
finish //退出函式繼續執行
c //繼續執行,直到執行到下乙個斷點處
q //退出除錯
gdb除錯過程中如何檢視執行的值,類似於vs中的監控功能(結合c語言的知識來看):
p valname //看變數值
p &valname //看變數位址
p *ptr //ptr為乙個指標,看指標所指位址儲存的值(指標解引用)
p arr //顯示陣列的所有元素
p ptrarr //ptrarr指向陣列arr,顯示陣列的首位址
p ptrarr@num //通過指向陣列的指標顯示陣列所有元素?(請自行驗證,可能描述有誤)
p struct_val //顯示結構體內的所有成員值
p ptr_struct->a //顯示結構體中 a成員的值
p funcname(a, b) //顯示函式的返回值,由於函式執行完才會有返回值,所以也可以用來做函式的測試執行
bt //顯示函式的呼叫過程
鏈結分為 軟鏈結和硬鏈結(linux中看鏈結檔案和原始檔是否是同乙個inode結點來判斷,看inode的命令為: ls -i )
軟鏈結(可以理解為快捷方式,並不是真的檔案所在):
生成軟鏈結命令: ln -s 原始檔 鏈結檔案
原始檔和鏈結檔案是不同的 inode結點
硬鏈結(可以理解為起別名):
生成硬鏈結命令: ln 原始檔 鏈結檔案
原始檔和鏈結檔案是同乙個 inode結點
在這裡可以了解一下 三者分別使用何種檔案管理系統,了解這個是比較重要的
作業系統中 程序管理/記憶體管理/檔案管理 是三塊大的部分!
庫檔案分為 靜態庫 是和 動態庫(共享庫):
靜態庫(linux上為 .a window上為 .lib )
1.是中間檔案的集合,在鏈結階段直接將庫中的內容合併到最終的可執行檔案中,就是說,鏈結完成後,生成的可執行文 件的執行不再依賴靜態庫
2.靜態庫生成的命令: gcc -c *.c (先將.c檔案生成對應的.o檔案)
ar crv lib***x.a *.o (其中***x是生成的庫名,前面的 lib和後面的 .a必須有 )
3.靜態庫的使用:
第一種: gcc -o run main.c -l(庫路徑) -l(庫名)
例如: gcc -o run main.c -l/home/stu/lib -llist
第二種: gcc -o run main.c 路徑/lib***x.a
例如: gcc -o run main.c /home/stu/lib/liblist.a
動態庫(linux上為 .so window上為 .dll )
1.動態庫是 不可單獨執行的可執行檔案,鏈結階段只在可執行檔案中設定使用的的庫,執行時
由作業系統載入到記憶體上 執行,因此生成的可執行檔案在執行時要依賴動態庫的存在
2.動態庫生成的命令:
gcc -shared -fpic -o lib***x.so *.c
3.動態庫的使用: 同靜態庫一樣
4.當鏈結完成後執行時會有問題,問題出現的原因是: 動態庫需要由作業系統載入到記憶體上,但我們自己寫的庫作業系統 找不到,因此依賴動態庫而的程式不能直接執行,會出錯! 解決這個問題有以下兩種方案:
<1>將動態庫拷貝到 /lib 或 /usr/lib 目錄下,但是這個操作需要 root 許可權,不建議這麼做
<2>設定環境變數 export ld_library_path=動態庫所在的絕對路徑
但是這麼做只在本bash內有效,為
了一勞永逸,做以下這個操作:
vi /home/.bashrc //進入到.bashrc這個配置檔案中
然後在檔案的最後加上一句 export ld_library_path=動態庫所在的絕對路徑
5. lddd run //檢視可執行檔案run中所載入的動態庫
動態鏈結庫 靜態鏈結庫
包含標頭檔案和庫 idir 指定編譯查詢標頭檔案的目錄,常用於查詢第三方的庫的標頭檔案,例 gcc test.c i.inc o test。ldir 指定鏈結時查詢lib的目錄,常用於查詢第三方庫。llibrary 指定額外鏈結的lib庫 巨集定義 dmacro 以字串 1 預設值 定義 macro...
靜態鏈結庫 動態鏈結庫
庫是寫好的現有的,成熟的,可以復用的 現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的 都從零開始,因此庫的存在意義非同尋常。本質上來說庫是一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。庫有兩種 靜態庫 a lib 和動態庫 so dll windows上對應的是.lib dll ...
靜態鏈結庫,動態鏈結庫
關於靜態鏈結庫,參考如下博文 當你完成了 開發,想把這個 給別人用,但是又不希望別人看到原始碼,就要給別人乙個庫和標頭檔案,庫和標頭檔案是配合的,缺一不可。或者過程相反,你從別人那裡拿到乙個庫和標頭檔案來使用。那麼如何編譯生成乙個庫給他人,如何使用從他人那裡拿到的庫呢?範例1 我們想把linuxfr...