gcc編譯與gdb調試簡要步驟

 

一、Linux程序gcc編譯步驟:

Gcc編譯過程主要的4個階段:

l 預處理階段,完成宏定義和include文件展開等工作;(.i)

l 根據編譯參數進行不同程度的優化,編譯成彙編代碼(.s.S)

l 用匯編器把彙編代碼進一步生成目標代碼(.o)

l 用連接器把生成的目標代碼和系統或用戶提供的庫連接起來,生成可執行文件

格式:

l gcc -E test.c//預處理階段

l Gcc -S test.c//編譯階段

l Gcc -c test.c//彙編階段

l Gcc -o test test.c//鏈接階段

二、Linux程序gdb調試步驟:

Gdb的功能:

l 設置斷點

l 監視程序變量的值

l 程序的單步執行

l 顯示、修改變量的值

l 顯示、修改寄存器

l 查看程序的堆棧情況

l 遠程調試

Gdb調試過程:

1、程序經過預處理後,即進入編譯階段,進入編譯階段,首先聲明編譯:

2、格式:gdb -o test test.c -g

3、進入編譯:gdb test

4、顯示需要編譯調試的源程序:l(list)//list filename

5、設置斷點:b(break)行號

6、查看設置的斷點:info b

7、運行調試程序:run

8、跳到下一個斷點:c(continue)

9、單步運行的話使用:n(next)/s(step into)跳到函數體 //區別在與:next執行函數體,而step不執行函數體

10、調試過程中查看某個變量的變化:print i (每次都要手動設置)//display i(設置一次一直尾隨,直到用“undisplay 變量標號” 停止)

11、退出當前的調試使用finish 跳出函數

12、清楚斷點 clear 行號

13、Delete 斷點信息序號// 刪除所有斷點或設置的要刪除的斷點

14、退出調試 q

15、b  num  if  i==20 設置斷點的觸發條件

16、condition num i==50 改變斷點的觸發條件

 

gcc -g  main.c                      //在目標文件加入源代碼的信息
gdb a.out       

(gdb) start                         //開始調試
(gdb) n                             //一條一條執行
(gdb) step/s                        //執行下一條,如果函數進入函數
(gdb) backtrace/bt                  //查看函數調用棧幀
(gdb) info/i locals                 //查看當前棧幀局部變量
(gdb) frame/f                       //選擇棧幀,再查看局部變量
(gdb) print/p                       //打印變量的值
(gdb) finish                        //運行到當前函數返回
(gdb) set var sum=0                 //修改變量值
(gdb) list/l 行號或函數名             //列出源碼
(gdb) display/undisplay sum         //每次停下顯示變量的值/取消跟蹤
(gdb) break/b  行號或函數名           //設置斷點
(gdb) continue/c                    //連續運行
(gdb) info/i breakpoints            //查看已經設置的斷點
(gdb) delete breakpoints 2          //刪除某個斷點
(gdb) disable/enable breakpoints 3  //禁用/啓用某個斷點
(gdb) break 9 if sum != 0           //滿足條件才激活斷點
(gdb) run/r                         //重新從程序開頭連續執行
(gdb) watch input[4]                //設置觀察點
(gdb) info/i watchpoints            //查看設置的觀察點
(gdb) x/7b input                    //打印存儲器內容,b--每個字節一組,7--7組
(gdb) disassemble                   //反彙編當前函數或指定函數
(gdb) si                            // 一條指令一條指令調試 而 s 是一行一行代碼
(gdb) info registers                // 顯示所有寄存器的當前值
(gdb) x/20 $esp                     //查看內存中開始的20個數

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章