1. 首先進(jìn)入vi編輯器,查看源碼
2. 冒號(hào),q是退出,wq是保存退出
3. 如果上面兩步不會(huì),可以參照下圖創(chuàng)建一個(gè).c文件
4. 編譯.c文件
方法一:我最常用
gcc -m32 -o test test.c
方法二:
gcc test.c -o test
gcc -Wall -g -o test test.c
-Wall 代表編譯器在編譯過程中會(huì)輸出警告信息(Warning),比如有些變量你并沒有使用,指針指向的類型有誤,main 函數(shù)沒有返回整數(shù)值等。這類信息雖然不是錯(cuò)誤,不影響編譯,但是很可能是程序 bug 的源頭,也有助于你尋找代碼中的錯(cuò)誤,規(guī)范代碼格式。所以建議每次編譯時(shí)都加上 -Wall 參數(shù)。
-g 代表編譯器會(huì)收集調(diào)試(debug)信息,這樣如果你的程序運(yùn)行出錯(cuò),就可以通過 gdb 或者 lldb 等工具進(jìn)行逐行調(diào)試,方便找出錯(cuò)誤原因。如果你不是百分之百確定你的程序毫無問題,建議加上 -g 參數(shù)。這樣 debug 的時(shí)候會(huì)方便很多。
-o 代表編譯器會(huì)將編譯完成后的可執(zhí)行文件以你指定的名稱輸出到你指定的文件夾下。-o 的空格后的名稱就是輸出的文件的名稱。例如我這里 -o 后是 test,就是說 gcc 會(huì)在編譯成功后在我的當(dāng)前目錄下生成一個(gè)叫 test 的可執(zhí)行文件。如果不加這個(gè)參數(shù),每次編譯后生成的可執(zhí)行文件都會(huì)放在根目錄下,名字叫做 a.out。每次編譯成功后都會(huì)把上一次的 a.out 文件覆蓋。所以建議加上 -o 參數(shù),這樣可以更加條理。
-m32:編譯32位程序
5. 用gdb進(jìn)行反匯編
disass main反匯編出來main函數(shù)的匯編代碼
disass main反匯編出來test子函數(shù)的匯編代碼
6. 設(shè)置斷點(diǎn)
設(shè)置斷點(diǎn)可以通過b或者break設(shè)置斷點(diǎn),斷點(diǎn)的設(shè)置可以通過函數(shù)名、行號(hào)、文件名+函數(shù)名、文件名+行號(hào)以及偏移量、地址等進(jìn)行設(shè)置。
break 函數(shù)名
break 行號(hào)
break 文件名:函數(shù)名
break 文件名:行號(hào)
break +偏移量
break -偏移量
break *地址
7. 運(yùn)行
r是運(yùn)行
n是單步執(zhí)行,next遇到函數(shù)不會(huì)進(jìn)入函數(shù)內(nèi)部
si是步入,step會(huì)執(zhí)行到函數(shù)內(nèi)部
c是繼續(xù)運(yùn)行,調(diào)試時(shí),使用continue命令繼續(xù)執(zhí)行程序。程序遇到斷電后再次暫停執(zhí)行;如果沒有斷點(diǎn),就會(huì)一直執(zhí)行到結(jié)束。
8. 刪除斷點(diǎn)
刪除斷點(diǎn)通過命令包括:
delete <斷點(diǎn)id>:刪除指定斷點(diǎn)
delete:刪除所有斷點(diǎn)
clear
clear 函數(shù)名
clear 行號(hào)
clear 文件名:行號(hào)
clear 文件名:函數(shù)名
9. 查看斷點(diǎn)
info br
簡(jiǎn)寫:i b
練習(xí):棧幀的形成與釋放
#include<stdio.h> int test(int a,int b) { int c = a + b; return c; } int main() { int d = test(1,2); }