簡體   English   中英

C ++程序中堆棧溢出的症狀是什么?

[英]What are the symptoms of a stack overflow in a C++ program?

我剛剛遇到一個問題,當一個本地對象試圖調用一個非常簡單的過程時,HPUX上的線程c ++程序中的堆棧溢出導致SEGV_MAPERR。 我有一段時間感到困惑,但幸運的是我和那些認識到這是堆棧大小問題的人交談過,我們能夠通過增加線程可用的堆棧大小來解決問題。

如何識別堆棧何時溢出? 在windows / linux / hpux上症狀有所不同嗎?

假設你不在一個會停止你的應用程序並說“堆棧溢出”的平台上,我懷疑你會看到你從任何緩沖區溢出中看到的相同行為。 堆棧只是你程序的另一個預先分配的內存塊,如果你超出這些界限......祝你好運! 誰知道你會踩到什么!

你可以寫一下來自CPU的溫度讀數,它可能是你給Larry輸入的電子郵件,可能有點說內核被鎖定,導致一個有趣的死鎖條件! 誰知道。

至於C ++,沒有什么可以說堆棧應該如何與內存中的其他內容相關聯,或者這個東西甚至需要是一個堆棧!

如何識別堆棧何時溢出?

如果您知道堆棧大小,堆棧啟動的位置以及它在內存中的增長方向,您只需檢查堆棧指針的地址,看它是否超過堆棧的末尾。 C ++不允許直接訪問堆棧指針。 您可以輕松地在匯編中編寫一個小函數來執行此分析並將其鏈接到您的程序中。

Windows上的異常代碼0xC00000FD

通常,當您意識到SEH停止工作時,診斷會更容易。

也許有點偏離主題,但Ada中的類似問題(任務中的堆棧空間耗盡)是一個相當常見的“罕見”錯誤。 許多編譯器將使用PROGRAM_ERROR異常停止任務(但不是主要任務)。

在某種程度上,你幾乎必須能夠嗅出這個。 它傾向於從諸如“我在我的任務中移動這個大陣列,然后它突然停止工作”之類的東西開始。

屏幕輸出文本與來自測試程序的代碼行混合在一起。 還出現了以前的bash命令和其他未知來源的文本。 添加到所有程序文本已損壞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM