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

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

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

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

在大多数情况下,获取调用堆栈的工作是正确的,速度非常快,但在某些情况下,我的逻辑失败,因为其中一个帧指针指向栈外的地址(不多,只是一点点)。

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

如何在windows上获取线程堆栈信息的代码? 可能解决了这个问题,但是由于这个调用了其他的函数,这可能会让我的代码运行速度慢得多(说实话,我没有testing它)。

在windows中hibernate整个过程

如何在linux上以编程方式杀死进程树

为什么malloc覆盖RSP和RSP + 8?

无法在运行windows 10的64位处理器PC上使用Netlogo 6.0.1和Mathematica 11.1之间的链接

使用VLC的虚拟接口时如何防止显示控制台

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

此外,内在__readfsqword似乎不能在64位上工作。

有关如何尽快获得64位TIB的其他build议?

在变成不可行之前,父母可以产生多less个subprocess?

windows显示驱动程序挂钩,64位

在64位机器上的VB6应用程序

如何在父母死后运行的C中创build一个进程?

构buildOpenSSL VC ++静态64位库

发现它,下面的代码就是这样做的:

#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()的定义,看起来这是一个非常低级别的函数,所以它可能会足够快以获得我想要的。

它应该是__readgsqword而不是64位的__readfsqword 。

总结

以上是内存溢出为你收集整理的在64位Windows应用程序中获取TID(线程信息块)的最快方法?全部内容,希望文章能够帮你解决在64位Windows应用程序中获取TID(线程信息块)的最快方法?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1154752.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存