目錄
一、簡單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...