2012-05-29 38 views
1

我有一個非常計算密集型的模塊,其中我添加了堆棧跟蹤以便能夠找到特定的問題。儘管啓用此堆棧跟蹤時允許應用程序運行速度較慢,但​​它的運行速度不得慢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的其他建議?

+0

有趣我現在對託管代碼也做同樣的事情,而且我遇到了同樣的問題;-)。 –

回答

2

發現,下面的代碼做的伎倆:

#include <windows.h> 
#include <winnt.h> 

struct _TEB 
    { 
    NT_TIB NtTib; 
    // Ignore rest of struct 
    }; 

void *startOfStack; 
startOfStack = NtCurrentTeb()->NtTib.StackBase; 
std::cout << "startOfStack = " << startOfStack << std::endl; 

我看着NtCurrentTeb()WINNT.H中的定義,它看起來像這是一個非常低的水平的功能,所以它可能會要足夠快以得到我想要的。

1

它應該是__readgsqword而不是在64位上的__readfsqword

相關問題