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