Najszybszy sposób na uzyskanie TID (Thread Information Block) w 64-bitowej aplikacji Windows?

Mam bardzo intensywny obliczeniowo moduł, w którym dodałem śledzenie stosu, aby móc znaleźć określone problemy. Chociaż aplikacja może działać wolniej, gdy włączone jest śledzenie stosu, nie może działać 10 razy wolniej. Dlatego nie używam procedur StackWalk z DBGHELP.DLL, ale sam przechodzę przez stos za pomocą wskaźników ramek (więc nie używam opcji kompilatora Omówienie ramki).

W większości przypadków uzyskanie stosu wywołań działa poprawnie i jest bardzo szybkie, ale w niektórych przypadkach moja logika kończy się niepowodzeniem, ponieważ jeden ze wskaźników ramki wskazuje adres poza stosem (niewiele, tylko trochę).

Wiem, że jest to prawdopodobnie błąd gdzieś, ale aby uczynić mój kod bezpieczniejszym, potrzebuję sposobu sprawdzenia, czy wskaźnik ramki wskazuje na lokalizację pamięci w stosie bieżącego wątku, czy nie. Aplikacja jest 64-bitowa i działa w systemie Windows.

Kod wJak uzyskać informacje o stosie wątków w systemie Windows? prawdopodobnie rozwiązuje problem, ale ponieważ wywołuje inne funkcje, prawdopodobnie mój kod działa znacznie wolniej (szczerze mówiąc, nie testowałem go).

Znalazłem również kod inline, który powinien wykonać sztuczkę (http://nasutechtips.blogspot.com/2011/01/thread-information-block-tib-and-fs.html), ale montaż inline nie jest obsługiwany przez 64-bitowy kompilator C ++ Microsoftu.

Również wewnętrzna __readfsqword nie działa na 64-bitowym.

Wszelkie inne sugestie, jak uzyskać TIB w 64-bitowym trybie tak szybko, jak to możliwe?

questionAnswers(2)

yourAnswerToTheQuestion