我有一個非常計算密集型的模塊,其中我添加了堆棧跟蹤以便能夠找到特定的問題。儘管啓用此堆棧跟蹤時允許應用程序運行速度較慢,但它的運行速度不得慢10倍。這就是爲什麼我不使用DBGHELP.DLL的StackWalk例程,但我使用幀指針自己走棧(所以我不使用幀指針省略編譯器選項)。在64位Windows應用程序中獲取TID(線程信息塊)的最快方法?
在大多數情況下,獲取調用堆棧正常工作並且速度非常快,但是在某些情況下,我的邏輯失敗,因爲其中一個幀指針指向堆棧外的地址(不多,只是一點點)。
我知道這可能是某處的錯誤,但爲了能夠使我的代碼更安全,我需要一種方法來檢查幀指針是否指向當前線程堆棧中的內存位置。該應用程序是64位,並在Windows下運行。
How to get thread stack information on Windows?的代碼很可能解決了這個問題,但是由於這個調用了其他函數,它可能會讓我的代碼運行速度慢得多(說實話,我沒有測試它)。
我還發現了一些應該執行這個技巧的內聯彙編代碼(http://nasutechtips.blogspot.com/2011/01/thread-information-block-tib-and-fs.html),但內聯彙編不被Microsoft的64位C++編譯器支持。
此外,內在__readfsqword在64位上似乎不起作用。
有關如何儘可能快地獲取64位TIB的其他建議?
有趣我現在對託管代碼也做同樣的事情,而且我遇到了同樣的問題;-)。 –