• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            S.l.e!ep.¢%

            像打了激速一樣,以四倍的速度運(yùn)轉(zhuǎn),開心的工作
            簡單、開放、平等的公司文化;尊重個(gè)性、自由與個(gè)人價(jià)值;
            posts - 1098, comments - 335, trackbacks - 0, articles - 1
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            小覽call stack(調(diào)用棧) (一)

            Posted on 2009-11-02 17:30 S.l.e!ep.¢% 閱讀(813) 評論(1)  編輯 收藏 引用 所屬分類: WinDbg

            棧在計(jì)算機(jī)領(lǐng)域中是個(gè)經(jīng)常提到的名詞,數(shù)據(jù)結(jié)構(gòu)中有棧;網(wǎng)絡(luò)傳輸中有協(xié)議棧。今天我們討論的調(diào)用棧(call stack),指的是在程序的執(zhí)行過程中存儲函數(shù)調(diào)用信息的動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu)。

            ?

            這個(gè)定義可能太抽象了一些,在給出具體的例子之前,請大家先思考一個(gè)問題,哪些信息是函數(shù)調(diào)用過程中所需要的?或者這么問,一個(gè)編譯器,在面對一個(gè)函數(shù)的調(diào)用指令時(shí),該生成哪些代碼?

            ?

            首先,函數(shù)的返回地址要保存下來。就好像你和你的小狗玩仍飛碟游戲,每一個(gè)函數(shù)調(diào)用好比扔一個(gè)飛碟,當(dāng)你的狗狗哼茲哼茲的撿來飛碟,函數(shù)完執(zhí)行的時(shí)候,它一定得知道去哪里把飛碟還給你。

            ?

            然后,函數(shù)的參數(shù)是個(gè)必不可少的元素,這個(gè)很直觀,就不多羅嗦了。第三,被調(diào)用的函數(shù)的局部變量也要存儲在棧上。因?yàn)楦鶕?jù)局部標(biāo)量的定義,對相同函數(shù)的不同調(diào)用,局部變量有不同的存儲空間,不會互相影響,所以這些數(shù)據(jù)也是跟函數(shù)調(diào)用息息相關(guān)的信息。

            ?

            下面,我們通過一個(gè)例子,來看看函數(shù)的調(diào)用棧中的信息:

            對于下面一段c++程序

            view plaincopy to clipboardprint?
            #include <stdio.h>??
            ?
            int SumFromOne(int d)??
            {??
            ??? int sum = 0xabcd;??
            ??? if (d == 1)??
            ??????? sum = 1;??
            ??? else???
            ??????? sum = d + SumFromOne(d-1);??
            ??? return sum;??
            }??
            ?
            void main()??
            {??
            ??? int sum = SumFromOne(10);??
            ??? printf("sum=%d", sum);??
            }?
            #include <stdio.h>

            int SumFromOne(int d)
            {
            ??? int sum = 0xabcd;
            ??? if (d == 1)
            ??????? sum = 1;
            ??? else
            ??????? sum = d + SumFromOne(d-1);
            ??? return sum;
            }

            void main()
            {
            ??? int sum = SumFromOne(10);
            ??? printf("sum=%d", sum);
            }
            ?

            ?

            編譯之,Cl /Zi a.cpp (/Zi生成pdb,調(diào)試的時(shí)候使用)


            大家選用熟悉的調(diào)試器,在這里,筆者用的是windbg 大家可以去這個(gè)地址下載(http://www.microsoft.com/whdc/devtools/debugging/installx86.Mspx)


            從調(diào)試器中啟動(dòng)程序:Windbg a.exe

            然后在第4行設(shè)置一個(gè)斷點(diǎn)(F9)。開始執(zhí)行這個(gè)程序(F5),直到程序中斷在斷點(diǎn)處


            找到程序的調(diào)用棧:

            1.?????? 察看當(dāng)前的ebp,在command窗口中應(yīng)該已經(jīng)看到。否則的話,在command中輸入r

            2.?????? 在memory察看窗口中,virtual欄中輸入ebp-10的值,并且把display format改成long hex,以利于觀察棧中的值


            我把我的windbg截圖粘貼如下,并和大家一起觀察幾個(gè)地方

            ?

            1.?????? 返回地址0040106b。參見反匯編的結(jié)果,0040106b正是main調(diào)完SumFromOne之后的那條指令。

            2.?????? 參數(shù)。主程序傳給他的是10,(0xa),在memory窗口ebp+8的位置找到他。

            3.?????? 局部變量,我在程序中故意將sum初始化為0xabcd,大家可以在memory窗口ebp-4的位置找到他。


            有興趣地同學(xué)可以按F5,在下一個(gè)斷點(diǎn)中察看相關(guān)信息。

            ?

            好,今天的這片博客中我們對調(diào)用棧有了感性的認(rèn)識,在ebp周圍找到了返回地址,參數(shù)以及局部變量。下一片博客中,我將解釋為什么這些信息存儲在這些位置,敬請期待。

            ?

            本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/mountaintaiII/archive/2009/02/08/3869287.aspx

            Feedback

            # re: 小覽call stack(調(diào)用棧) (一)   回復(fù)  更多評論   

            2010-07-28 13:46 by 好看網(wǎng)
            好東西得支持
            欧美精品丝袜久久久中文字幕 | 狠狠色丁香久久婷婷综合五月| 久久美女人爽女人爽| 少妇人妻88久久中文字幕| 久久精品国产72国产精福利| 狠狠色丁香久久婷婷综合| 性高湖久久久久久久久| 久久久久久久免费视频| 久久精品www人人爽人人| 亚洲精品乱码久久久久久蜜桃不卡| yy6080久久| 新狼窝色AV性久久久久久| 人妻精品久久久久中文字幕一冢本| 久久夜色精品国产噜噜亚洲a| 大香伊人久久精品一区二区 | 91精品国产综合久久婷婷| 无码人妻久久一区二区三区蜜桃| 久久久久无码国产精品不卡| 色综合久久久久久久久五月| 国产A级毛片久久久精品毛片| 一本久久a久久精品综合夜夜 | 国产国产成人久久精品| 精品久久久久久无码人妻蜜桃| 亚洲国产精品无码久久久蜜芽| 日韩精品久久无码中文字幕 | 69久久夜色精品国产69| 久久精品一区二区影院| 国产∨亚洲V天堂无码久久久| 亚洲午夜精品久久久久久人妖| 国内精品久久久久影院优| 久久中文字幕一区二区| 亚洲国产欧美国产综合久久| MM131亚洲国产美女久久| 天天久久狠狠色综合| 欧美久久一级内射wwwwww.| 久久精品亚洲AV久久久无码| 国内精品人妻无码久久久影院 | AV无码久久久久不卡蜜桃| 久久精品视频网| 亚洲欧美精品一区久久中文字幕| 久久综合狠狠综合久久|