2013-10-11 54 views
3

在Visual Studio 2012中,我使用調試來啓動應用程序。我打開一些屏幕,然後關閉它。在這一點上,當我看到Call Stack時,我可以在我的應用程序中看到起點,一些打開/關閉屏幕的方法,以及很多(外部)調用不是來自我的應用程序。我注意到,我的應用程序中的很多調用都沒有列出,儘管它們已經被執行。調用堆棧信息

我在我的應用程序中放置了一個斷點。當應用程序遇到斷點時,我開始使用F11進入代碼。基本上它所做的是從循環中調用SomeMethod(斷點設置爲循環)。

當我使用F11進入SomeMethod時,我看到SomeMethod在調用堆棧中列出,但是如果我點擊F5,然後再次點擊一個斷點(在一個循環中)並再次查看調用堆棧,SomeMethod不再列出。

那麼,如何呼叫棧決定在它顯示什麼方法?我們如何獲得已執行方法的完整列表?

回答

3

調用堆棧不是已經調用的方法列表,這是已被調用但沒有恢復到方法的列表。

讓我解釋一下

,我會第一個函數調用舉一個簡單的例子。運行程序時會調用該函數。爲此,它將參數和本身的位置推入堆棧。 (這是現在在堆棧頂部)。然後它調用將指令指針跳轉到該函數的代碼所在位置的函數。該函數將其參數從堆棧中取出(它只是被調用,所以它知道它們必須位於堆棧的頂部)並運行它的本地代碼。完成後,將返回地址從堆棧中拉出,並使用它返回指向此函數被調用的位置的指令指針。

現在,在更復雜的情況下,任何函數可以調用任何其它功能 - 將工作完全一樣,但現在的堆棧將包含呼籲最近被調用函數的底部的第一功能。因爲你總是從堆疊的頂部取出,你總是會回到最後一次打電話的位置。

好的,所以當在調試器中查看調用堆棧時,您會看到所有函數調用之前到您在程序中的位置。在某些時候,代碼將返回到堆棧中列出的位置。但是,如果函數調用是已經返回,它將不再位於堆棧上,當該函數返回時,它已從堆棧彈出。

0

我認爲你對調用堆棧實際上有什麼誤解。每當一個方法調用另一個方法時,它在舊方法中的地址將被推入堆棧。一旦它返回到該方法,它將從堆棧彈出並不再被看到。

這不是已調用的所有方法的記錄,但在哪裏執行將返回執行時的當前塊已完成的列表。

2

調用堆棧只能說明目前「進展中」的方法(它們尚未退出)特定線程。該堆棧不包含已完成的方法。

弄清楚什麼方法跑(或沒有)最簡單的方法就是使用一個分析器。在Visual Studio中,它被稱爲「性能分析」(在「分析」菜單下找到)。

如果您不熟悉分析,我會建議使用「性能嚮導」(也在分析菜單上)。選擇「Instrumentation」作爲分析方法,因爲這會給你函數調用計數(可能會忽略不需要太多時間的方法調用)。

它還提到了分析器不會給出方法調用的順序。它只會計數它們。如果您需要了解方法調用的順序,您需要手動跟蹤(通過向每個方法的開始和/或結尾添加代碼來記錄調用)。

0

調用堆棧是一種堆棧數據結構,它存儲有關活動子例程的信息。方法結束後,它不再被視爲活動的,因此不會顯示在調用堆棧上。基本上,你可以看到的調用堆棧是方法調用的當前路徑,以達到中斷點被擊中的點。

2

調用堆棧不顯示先前已執行的方法。而是顯示正在執行的方法調用樹/堆棧/層次結構。第一種方法是你目前使用的方法 - 通常是設置斷點或使用調試器的步驟。

您可以使用'Step out'命令來看到這一點 - 這會將您跳轉到調用堆棧中的下一個方法。