原文鏈接:http://www.orlion.ga/762/ 一、單步執行和跟蹤函數調用 對於以下程式 最後列印出的結果是55和5105,而第二個結果應該是5050。現在用gdb調試下。 在編譯時要加上-g選項生成的目標文件才能用gdb進行調試,-g作用是在目標文件中加入源代碼的信息,比如目標文件第 ...
原文鏈接:http://www.orlion.ga/762/
一、單步執行和跟蹤函數調用
對於以下程式
最後列印出的結果是55和5105,而第二個結果應該是5050。現在用gdb調試下。
在編譯時要加上-g選項生成的目標文件才能用gdb進行調試,-g作用是在目標文件中加入源代碼的信息,比如目標文件第幾行機器指令對應源代碼的第一行,但並不是把整個源文件嵌入到目標文件中,所以在調試時必須保證gdb也能找到源文件。
可以用"list"命令從第一行開始列出源代碼:
一次只列出10行,如果要繼續源代碼可以輸入list,也可以什麼都不敲直接回車,表示使用上一條命令。可以"list 函數名"列出函數的源碼:
使用"quit"退出gdb。
使用"start"命令執行程式:
這表示停在main函數中變數定義之後的第一條語句出等待我們發命令,gdb列出這條語句表示它還沒執行並且要馬上執行,可以用"next"指令控製程序一條條執行。
可以使用"step"命令進入程式中執行,用"backtrace"命令查看函數調用的堆棧:
可見當前的add_range函數是被main函數調用的,main傳進來的參數是low=1, high=10.main函數的棧幀編號為1,add_range的棧幀為0.現在可以用"info"命令查看add_range局部變數的值。如果想查看main函數的局部變數的值可以先用"frame"命令選擇1號棧然後再查看局部變數:
(result數組中雜亂無章的數是因為未初始化的局部變數有不確定的值)。用"step"或者"next"往下走,然後用"print"命令列印出局部變數sum的值。
可以使用"finish"命令讓程式一直運行到從當前函數返回為止。
二、斷點
可以使用"break 行號"設置一個斷點,也可以"break 函數名";
然後可以使用"continue"命令繼續執行;
可以設置多個斷點,可以使用"info breakpoints"查看所有斷點,每個斷點都有一個編號,可以輸入指令"delete breakpoints 編號"刪除指定編號的斷點;
有時一個斷點暫時不想用可以禁用而不必刪除:"disable breakpoints 編號",啟用:"enable breakpoints 編號"。
還可以設置斷點在滿足某個條件時才激活:"break 9 if sum != 0"。
三、觀察點
觀察點是當程式訪問某一存儲單元時中斷,如果我們不知道某一存儲單元在哪裡被改動,這時候可以使用觀察點,
命令:"watch 變數名",如"watch array[1]";"info watchpoints"查看設置了哪些觀察點。