簡體   English   中英

如何在 Visual C++ 中快速檢測一個 function 導致堆棧溢出?

[英]How to detect the one function causing a stack overflow quickly in Visual C++?

我有一個巨大的 C++ 代碼庫。 在某組數據上存在堆棧溢出。 如果我在 Visual Studio 調試器下運行程序,我會得到一個調用堆棧 30 個不熟悉的函數深度 - 其中一個(或多個)函數在堆棧上創建了一個太大的 object,這會導致堆棧耗盡。 我查看了所有功能,沒有什么明顯的 - 沒有像

char buffer[512 * 1024];

我雖然可以在每個函數的開頭添加一個變量,然后轉儲該變量地址並重新編譯,然后查看相鄰函數之間的差異,但這需要大量的體力勞動。

如何快速識別在堆棧上創建了過多對象並導致緩沖區溢出的 function?

如果你有一個堆棧跟蹤(你應該能夠得到一個),你也許能夠訪問幀的地址。

導致該問題的一個 function 應該會導致幀指針的巨大飛躍。

如果沒有,請檢查堆棧大小,它可能太小了。

編輯:如何用 VC++ 調試不明顯的問題? (嗯……我在 Unix 上編碼:/)

Elan Rusking 在他2011 年的 GDC 演示文稿(PDF ) 中就調查做了精彩的演講。

堆棧指針(在 x86 上)存儲在ESP寄存器中。 如果您查看反匯編並檢查ESP的更改,那么您應該能夠看到哪個 function 以較大的值遞增/遞減它。

wikibooks上的示例:

mov eax, DWORD PTR SS:[esp]
add esp, 4

add esp是您要跟蹤的內容。 除非您使用 VLA,否則添加/減去的值是硬編碼的,因此很容易檢查。

您可以在更高版本中提供的 Visual C++ 中使用代碼分析。 如果 function 使用的堆棧高於某個限制,則會生成警告 ( C6262 )。 您可以使用/analyze:stacksize開關,其中stacksize是您想要的限制。

超出其堆棧分配的線程將引發異常。 可以使用 Microsoft Visual C++ 中的__try__except關鍵字捕獲此異常。 您可以將您的函數包裝在這個 try-except 塊中,以查看它們是否會導致堆棧溢出。

看看這里:如何在 Visual C++ 應用程序中捕獲堆棧溢出

暫無
暫無

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

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