【软件开发底层知识修炼】十七 快速学习GDB调试四 使用GDB进行函数调用栈的查看
- 上一篇文章學習了如何使用GDB數據斷點進行內存監測:【軟件開發底層知識修煉】十五 快速學習GDB調試三 使用GDB的數據斷點監測變量是否改變
- 本篇文章繼續上一篇文章的學習:如何使用GDB進行函數調用棧的查看
文章目錄
- 1 backtrace和frame
- 2 使用GDB進行函數調用棧的查看的實際代碼案例
- 3 總結
1 backtrace和frame
一般來說,查看函數調用棧,主要是為了研究函數的調用過程。
一般使用下面的命令進行查看:
-
backtrace
- 查看函數的調用順序(函數調用棧的信息)
-
frame N
- 切換到棧編號為N的上下文中(具體棧編號是什么在下面的實際案例中會有)
-
info frame
- 查看當前函數調用棧幀的信息
至于什么是棧幀信息,大概就是下圖的樣子,這里不再多介紹,后面還會有文章學習函數棧幀的概念,或者推薦大家去閱讀程序員的自我修養。
- 上面有一個info frame命令,我們在前幾篇文章已經學習過info的幾個命令。下面再介紹幾個下圖中的info命令:
2 使用GDB進行函數調用棧的查看的實際代碼案例
我們還是給出以下代碼,作為這次調試的代碼:
frame.c
#include <stdio.h>int sum(int n) {int ret = 0;if( n > 0 ){ret = n + sum(n-1);}return ret; }int main() {int s = 0;s = sum(10);printf("sum = %d\n", s);return 0; }上述代碼很簡單,sum函數是一個遞歸的求解過程,最終求得1+2+3+…+n
- 開始進行調試:
-
首先將程序編譯,并打開gdb調試,這在前幾篇文章已經做過很多次,大概如下圖所示的步驟:
-
然后我們再sum函數處打一個斷點,并給出條件,當n==0的時候斷點成立
-
break sum if n==0
-
查看斷點是否打上:info breakpoints
-
運行程序:continue
-
運行上述幾個步驟后,程序運行到sum函數,并在sum函數遞歸調用到n==0的時候停止:
-
此時,函數調用被中斷,我們現在來使用backtrace命令來查看之前sum函數的調用棧的順序(左側的#0 ,#1…就是棧的編號):
-
此時程序運行到n==0,本應該繼續運行sum函數,但是卻被我們的斷點中斷了。所以此時停在最后一層的sum函數遞歸調用上。且是停在sum函數中的第6行:
-
我們連續輸入兩次next,并且查看當前程序的棧信息:
-
程序運行到13行停下來了,這一行是本該return的。此時的函數棧中 n==0,ret==0,這個ret就差返回給上一層函數調用了。
-
現在我們來使用info registers查看當前的函數調用過程的各個寄存器的值,并使用info frame查看當前函數調用過程的函數棧幀的詳細信息:
-
如上圖,寄存器比較多,這里我們只關心一個寄存器,ebp,ebp寄存器保存的是調用這個函數的函數(也就是上一個函數,在這里是#1號棧對應的函數)棧幀基地址(old_ebp)。可以看到,此時的函數棧幀中的ebp地址為0xbffff088。注意你自己運行的話地址可能與我的不一樣。這個地址中保存的是上一個函數,其實就是1號棧的基地址。我們使用以下命令來查看該地址處的內容:
-
x /1bx 0xbffff088 //顯示結果為:
-
如上圖,紅框內的內容,就是#1號棧的基地址。當然我們可以驗證:連續輸入兩個next命令,程序就會把返回值返回給#1號棧的函數調用。那么此時再輸入info args,n就等于1,因為此時位于#1號棧中。然后在輸入info registers命令查看#1號棧的寄存器值信息,如下:
-
如上圖,#1號棧中的ebp值為0xbffff0b8,與我們上面在#0號棧中查詢的值是一樣的。這與函數棧幀的理論也是完全相符的。
上面的調試內容,非常簡單,我們并沒有調試什么bug,而是通過上述內容,學習一些調試的技巧。
3 總結
- 本節內容學習如何使用GDB查看函數的調用棧信息。
-
本文章參考狄泰軟件學院相關課程 想學習的可以加狄泰軟件學院群, 群聊號碼:199546072
-
學習探討加個人(可以免費幫忙下載CSDN資源):
-
qq:1126137994
-
微信:liu1126137994
-
學習交流資源分享qq群:962535112
總結
以上是生活随笔為你收集整理的【软件开发底层知识修炼】十七 快速学习GDB调试四 使用GDB进行函数调用栈的查看的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【python】画一个爱心
- 下一篇: 谷歌-adblock插件下载后的使用(国