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ò)誤原因。如果你不是百分之百確定你的程序毫無(wú)問題,,建議加上 -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); }