天天看點

一步一步寫算法(之函數堆棧顯示)

【 聲明:版權所有,歡迎轉載,請勿用于商業用途。  聯系信箱:feixiaoxing @163.com 】

    在繼續圖的讨論之前,我們今天開個小差,讨論一下函數堆棧的基本原理。有過程式設計經驗的朋友都知道,堆棧調試是我們在程式開發中經常應用的一個功能。那麼大家有沒有想過,函數堆棧是怎麼開始的啊?其實我們可以自己寫一個函數堆棧輸出函數分析一下。

    因為一般來說,函數的壓棧過程是這樣的:

              |    參數三  |

              |    參數二  |

              |    參數一  |

              |   address|

              |      ebp     |

              |   variable |     <--------------------------------- ebp

      那麼堆棧中的内容是怎麼列印的呢?

    上面的代碼隻是列印目前函數的傳回位址,那麼如果是連續的函數列印呢?列印到main函數開始呢。

    上面的代碼可看到一對位址,那麼怎麼把這些位址和函數名稱對應起來了,那就隻能查表了。函數對應的表在哪裡呢?不着急,看了下面的一個截圖,朋友們就明白怎麼回事了。

一步一步寫算法(之函數堆棧顯示)

    大家這樣在VC編譯的時候把Generate mapfile選上,就可以生成對應的*.map檔案了。檔案中包含了目前檔案中主要函數的起始位址,而且是按照從低到高依次排序的。是以隻要尋找到對應的函數起始,判斷我們的函數傳回位址是不是在這個函數中間,那麼就可以找到對應的函數名稱了。

總結:

    (1)今天總結了一下函數堆棧顯示的基本原理;

    (2)知道函數的基本原理之後,友善我們從本質上了解很多問題。即使很多CPU的處理方式和X86不同,我們也可以通過類似的方法快速掌握;

    (3)堆棧原理十分重要,朋友們應該好好了解一下。

繼續閱讀