在64位Windows应用程序中获取TID(线程信息块)的最快方法?

时间:2012-05-29 15:51:18

标签: windows 64-bit

我有一个非常计算密集的模块,我在其中添加了堆栈跟踪以便能够找到特定问题。尽管在启用此堆栈跟踪时允许应用程序运行较慢,但它的运行速度必须慢10倍。这就是为什么我没有使用DBGHELP.DLL中的StackWalk例程,但是我自己使用帧指针遍历堆栈(所以我不使用Frame Pointer Omission编译器选项)。

在大多数情况下,让调用堆栈正常运行并且非常快,但在某些情况下,我的逻辑失败,因为其中一个帧指针指向堆栈外的地址(不多,只是一点点)。 / p>

我知道这可能是某个地方的错误,但为了能够使我的代码更安全,我需要一种方法来检查帧指针是否指向当前线程堆栈中的内存位置。该应用程序是64位并在Windows下运行。

How to get thread stack information on Windows?处的代码可能解决了这个问题,但由于这会调用其他函数,因此可能会使我的代码运行得慢一些(说实话,我没有对它进行测试)。

我还发现了一些应该执行技巧的内联汇编代码(http://nasutechtips.blogspot.com/2011/01/thread-information-block-tib-and-fs.html),但微软的64位C ++编译器并不支持内联汇编。

内在的__readfsqword似乎也无法在64位上运行。

关于如何尽可能快地获得64位TIB的任何其他建议?

2 个答案:

答案 0 :(得分:3)

找到它,以下代码可以解决问题:

#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;

我在winnt.h中查看了NtCurrentTeb()的定义,看起来这是一个非常低级别的函数,所以它可能足够快以获得我想要的东西。

答案 1 :(得分:2)

在64位上应该是__readgsqword而不是__readfsqword