我有一个非常计算密集型的模块,我在其中添加了堆栈跟踪,以便能够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(线程信息块)的最快方法?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)