簡單程式的編譯 GDB 除錯指令和反彙編指令

2021-09-12 17:11:36 字數 1631 閱讀 1117

目錄

一、簡單c程式的編譯與執行

二、使用 gdb 進行程式基本的程式除錯以及一些常用的除錯指令

三、反編譯目標**(.o檔案)

使用「gedit hello.c」命令在主資料夾下建立乙個 hello.c ,也可以選擇輸入"cd 桌面/test"切換至桌面/test目錄,再輸入"gedit hello.c"在當前目錄下建立乙個hello.c檔案

在 hello.c 檔案中編寫程式後將其儲存

編譯階段:使用「gcc -s hello.i -o hello.s」 「gedit hello.s」得到彙編**(文字)

彙編階段:使用「gcc -c hello.s -o hello.o」 「gedit hello.o」得到可重定向目標程式(二進位制)

執行階段:使用「./hello」得到執行結果

可以直接輸入"gcc hello.c -o hello"  "./hello"得到執行結果而不檢視中間的過程

(一)、輸入命令「gcc -g hello.c -o hello」開始除錯(-g 選項告訴 gcc 在編譯程式時加入除錯資訊)、輸入「gdb hello」可以得到版本資訊說明;如果不想得到版本資訊,可以輸入「gdb -q hello」即可忽略版本資訊

(二)、輸入「file hello」 先進入 gdb 模式,再載入檔案,輸入『y』即可以開始除錯

(三)、如需要列印出程式,可以先觀察程式的行數,輸入"set listsize 100" 設定listsize的值(預設為10)為100,再輸入「list」則可以列印100行**

(四)、選擇你需要的設定斷點的行數,輸入「break 4」表示將斷點設定在第四行,可以得到斷點的位址

breakpoint 1表示這是我設定地第乙個斷點,斷點所在地記憶體位址為0x80483dd,它在檔案hello.c的第四行

num表示斷點的編號;type表示斷點的斷點的型別;disp表示中斷點在執行一次之後是否失去作用,dis為是,keep為不是;enb表示當前中斷點是否有效,y為是,n為否;address表示中斷點所處的記憶體位址;what指出斷點所處的位置。

(五)、斷點設定好之後可以輸入「run」/「r」開始執行程式

(六)、輸入"next" / "n",繼續執行下一條語句;還有一條命令step,與之類似,不同的是,當下一條語句遇到函式呼叫的時候,next不會跟蹤進入函式,而是繼續執行下面的語句,而step命令則會跟蹤進入函式內部。

(七)、輸入「quit」退出除錯

可以使用"as -gstabs 1009.s -o 1009.o

"  "objdump -d 1009.o"可以用於檢視彙編**中的機器指令以及位址,其中objdump -d可以充當反彙編器的角色。

也可以使用"disassemble sum"生成sum的反彙編**

目標檔案分為兩種:test(可執行目標檔案),test.o(可重定向目標檔案)

test.o中的**從位址0開始,test中的**從0x80483d4(也可以是其他的位址,由系統分配)開始!

簡單程式除錯

程式的除錯 是程式設計師的必備技能,也是程式設計師的必殺技 做程式的目的就是為了明確程式的每乙個步驟都是執行正確的 即,保證程式能夠滿足現實需求 程式實際執行過程中從頭執行到尾部,程式設計師是看不到中間的執行過程的 需要在程式的中間的某個位置,設定斷點,程式執行到斷點,程式就會暫停,有程式設計師通過...

gdb除錯常用的指令

關於第一次使用了gcc後,我做了一些總結 以乙個題目為例 對於兩組使用者輸入的字串進行比較,長度自定,輸出相同的字元。下面是一些gdb常用的指令 首先是要進入gdb除錯環境,先通過gcc g o newname name.c 生成可執行檔案 gdb newname進入gdb除錯環境 退出gdb ob...

命令列下編譯簡單程式

命令列下編譯簡單console程式 vc8為例 cl.exe 是控制microsoft c 和c 編譯器與鏈結器的32 位工具。編譯器產生通用物件檔案格式 coff 物件 obj 檔案。鏈結器產生可執行檔案 exe 或動態鏈結庫檔案 dll 預設情況下,cl.exe 編譯完後自動呼叫link.exe...