2008-11-14 40 views
2

我正在遠程調試遞歸函數的堆棧溢出。 Visual Studio IDE僅顯示前1000幀(全部相同的功能),但我需要進一步查看原因是什麼。讓VC調試器在堆棧溢出中顯示更多幀

有沒有人知道如何讓VS在堆棧列表中「向上移動」?

謝謝。

回答

2

我不相信有一種方法可以通過用戶界面(甚至註冊表黑客)來做到這一點。我猜測原因是顯示堆棧溢出情況下的所有幀可能會對性能產生非常負面的影響。

大多數堆棧幀是不良遞歸的結果。如果是這種情況,您可能會在目標函數上設置條件斷點。只有當命中次數達到一定水平時纔將其設置爲中斷。我會以大約1000的計數開始。您可能需要嘗試一下以獲得正確的計數,但不應超過幾次嘗試。

0

您可以爲函數添加一個臨時遞歸計數參數,並在其超過最大值時斷言。給它一個默認值,您將不再需要編輯任何其他來源

void f(int rcount /* = 0 */) 
{ 
Assert(rcount < 1000); 
f(count+1); 
} 
1

我會建議更換你的調試方法和使用日誌記錄來處理這樣的問題。您可能會發現它更高效,您只需要仔細選擇要打印的內容和時間。
任何分析幾千行文本的方法都會比上千個堆棧幀快得多。恕我直言。
你也可以使用David's提示來控制數據量打印(即從一個遞歸循環傳遞相關信息給別人)

1

您也可以嘗試WinDbg。這不是很友好,但它有時可以在VC調試器沒有的地方工作。

1

我現在再碰上這個,我做的是以下行添加到正被遞歸調用該函數:

static int nest; if (++nest == 100) *(char*)0 = 0; 

100這個數字是任意的,往往只是10將正常工作。這限制了遞歸,並以seg錯誤結束。然後調試器應該顯示開始遞歸的幀。

0

你試圖解決這個錯誤的方式。

應該有足夠的堆棧幀來顯示重複呼叫模式。你應該已經被提供了足夠的推理數據來確定如何發生無限循環的呼叫。

另一個黑客的想法可能是大幅減少你的堆棧大小或人爲地增加每幀的大小...