一起talk GDB吧(第四回 GDB呼叫棧除錯)

2021-07-03 14:58:38 字數 1741 閱讀 7141

這一回中,我們繼續介紹gdb的除錯功能:呼叫棧除錯。當然了,我們也會介紹如何使用gdb進行呼叫棧

除錯。閒話休提,言歸正轉。讓我們一起talk gdb吧!

看官們,我們先說一下什麼是呼叫棧。大家都知道,程式中經常使用各種各樣的函式,有的是語言提供的

庫函式,比如printf(),有的是我們自己定義的函式。各種函式之間會相互呼叫,有時候函式多了,我們很難

找出函式之間的呼叫關係,函式棧就是用來顯示函式之間呼叫關係的。這們說大家可能覺得有點抽象,不

容易理解,我們舉個例子來說明,例如程式中有以下**。

void funa()

void funb()

void func()

void fund()

int main()

這些函式的功能比較簡單,只有乙個輸出語句,顯示函式被呼叫。大家可以看到,程式中自己定義了四個

函式,它們分別是:funa,funb,func,fund。(以後不用全名,簡稱abcd)各個函式之間的呼叫關

係為:d->c->b->a。編譯並且執行該函式時,可以得到以下結果:

show the call stack of functions

d function is called

c function is called

b function is called

a function is called

從程式的執行結果中也可以看到,各個函式之間的呼叫關係。如果把d比作棧底,那麼每次呼叫函式就是

在進行入棧操作,d呼叫c就是把c入棧,依此類推,直到最後乙個函式a。這種函式呼叫關係符合棧」先進

後出「的特點,因此我們形象地叫它為呼叫棧。此外,從程式的執行結果中也可以看出來abcd函式的呼叫

關係從棧頂到棧底依次排列。

數之間的呼叫關係,怎麼辦?不用擔心,gdb提供了顯示函式呼叫棧的功能。和單步呼叫一樣,呼叫棧調

試也有專門的命令:backtrace(縮寫為bt)。使用該命令,可以通過gdb列印出函式呼叫棧,我們還是舉個

例子來說明,為了方便,還使用上面提到過的**。

1.首先編譯程式,並且加入除錯資訊:gcc -g file.c -o file

2.啟動gdb進行除錯:gdb file

3.在函式d處打乙個斷點:b fund。執行結果如下:breakpoint 3, funa () at file.c:5

4.執行程式,遇到斷點停止執行:run

5.檢視函式呼叫棧:bt.這時顯示的結果如下:

(gdb) bt                     //檢視函式呼叫棧

#0  funa () at file.c:5

#1  0x08048448 in funb () at file.c:10

#2  0x08048461 in func () at file.c:15

#3  0x0804847a in fund () at file.c:20

#4  0x08048496 in main () at file.c:27

通過執行的結果,我們可以看到,函式a位於棧底,main函式位於棧頂。而且在每行最前面有編號。當然

了,編號從0開始,有點類似陣列中元素的位置。

看官們,關於gdb的內容,今天咱們就說到這裡。欲知後事如何,且聽下回分解!

一起talk GCC吧(第四回 GCC警告)

話休提,言歸正轉。讓我們一起talk gcc吧!看官們,gcc有編譯警告的功能。什麼是編譯警告?台下有看官提問了。所謂的編譯警告就是編譯器在編 譯過程中把一些不符合編譯規則但是又符合編譯語法的內容給予警告。我用乙個現實生活中的例子給大家 做個比喻 大家都看過足球比賽吧,足球比賽的裁判手裡拿著拿著黃色...

一起talk GCC吧(第五回 GCC優化)

閒話休提,言歸正轉。讓我們一起talk gcc吧!看官們,大家都知道,人們寫的 中,不一定是最優的 所以有時候會使用編譯器對 進行優化。這樣可以提高 執行效率。和警告功能一樣,優化功能也是通過選項實現的。選項o 注意是大寫,與指 定生成檔名的小寫o區分開,另外gcc是區分大小寫的,不要寫錯 的用法和...

一起talk Vim吧(第一回 Vim出山)

起talk vim吧!vim是vi improved的簡稱,從名字上就能看出來,它是vi的改良版本,那麼vi又是何物?vi是linux 上的一種文字編譯器,而vim就是vi種編輯器的公升級版本。vim可以看作是文字編輯器裡的屠龍刀,也就 只有emacs這把倚天劍才能與他爭鋒。那麼倚天劍和屠龍刀哪個利...