我剛碰到一個問題,當HPUX上的線程化C++程序中的堆棧溢出導致SEGV_MAPERR時,本地對象試圖調用一個非常簡單的過程。我感到困惑了一段時間,但幸運的是我和一個認識到這是堆棧大小問題的人交談,我們能夠通過增加線程可用的堆棧大小來解決問題。C++程序中堆棧溢出的症狀是什麼?
如何識別堆棧何時溢出?這些症狀在windows/linux/hpux上有所不同嗎?
我剛碰到一個問題,當HPUX上的線程化C++程序中的堆棧溢出導致SEGV_MAPERR時,本地對象試圖調用一個非常簡單的過程。我感到困惑了一段時間,但幸運的是我和一個認識到這是堆棧大小問題的人交談,我們能夠通過增加線程可用的堆棧大小來解決問題。C++程序中堆棧溢出的症狀是什麼?
如何識別堆棧何時溢出?這些症狀在windows/linux/hpux上有所不同嗎?
如何識別堆棧何時溢出?
如果你知道堆棧大小,其中棧開始,它生長在內存的方向,你可以簡單地檢查stack pointer的地址,看看它是否過堆疊的結束。 C++不允許直接訪問堆棧指針。您可以輕鬆地在彙編中編寫一個小函數來執行此分析並將其鏈接到您的程序中。
假設你不在一個會阻止你的應用程序並說「堆棧溢出」的平臺上,我懷疑你會看到從任何類型的緩衝區溢出中看到的相同行爲。該堆棧只是您的程序的另一個預先分配的內存塊,如果您超出這些範圍......祝您好運!誰知道你會跺腳!
你可以寫出來自CPU的溫度讀數,它可能是你輸入給Larry的電子郵件,它可能是內核被鎖定的位,導致一個有趣的死鎖狀態!誰知道。
至於C++,沒有什麼可以說堆棧應該如何與內存中的其他東西相關聯,或者這個東西甚至需要成爲堆棧!
Windows上的例外代碼0xC00000FD
。
通常,當您意識到您的SEH停止工作時,它更容易診斷。
也許有點偏離主題,但Ada中的類似問題(在任務中用盡堆棧空間)是一個相當常見的「罕見」錯誤。許多編譯器會停止執行PROGRAM_ERROR異常的任務(但不是主要任務)。
某種程度上,你幾乎必須能夠嗅出這一個。它傾向於以類似於「我把我的任務放在這個大陣列中,並突然停止工作」開始。
將文本輸出到屏幕變得混合了來自測試程序的代碼行。還存在以前的bash命令和其他未知來源的文本。所有增加的程序文本已損壞。
這很有趣... stackoverflow標籤將是合適的,除了沒有人使用它實際的堆棧溢出。 – 2009-02-18 21:54:44
是的,我想知道誰是誰放置了stackoverflow標籤的小丑。 :-) – 2009-02-18 22:01:33