Eri*_*nge 19 debugging winapi windows-7
我在Windows 7中的采样分析器上遇到了一个奇怪的问题(以前的Windows操作系统上没有AFAICT问题,无论是32位还是64位).
在调用重新启动进程之前SuspendThread
,探查器通过定期挂起线程,然后查看上下文来工作.所有这些都是从多媒体计时器的线程环境完成的(准确度大约为1kHZ,在Windows 7之前的操作系统通常会导致可忽略的性能损失).GetThreadContext
ResumeThread
在Windows 7和Windows 7下,即使对SuspendThread
(和ResumeThread
)的调用都成功,调用也会GetThreadContext
失败并显示错误:
ERROR_NOACCESS
998(0x3E6)
对内存位置的无效访问.
有很高的可能性,虽然不是所有的时间.
我的意思是,对于一些分析运行,一切都会像在其他操作系统上一样工作(所有的GetThreadContext
调用都会成功),但对于其他运行,它们几乎都会失败(除了数十万之外,可能会丢失十几个).它使用完全相同的二进制文件,相同的参数.
我已经尝试过关于重复GetThreadContext
调用的模糊相似问题的建议,但没有更多的成功.我也试过Sleep
在SuspendThread
和之间做一个GetThreadContext
,然后GetThreadContext
更频繁地成功,虽然它会导致剧烈的减速.
然而,它表明Windows 7操作系统正在返回,SuspendThread
而线程可能尚未暂停 - 但是,如果是这种情况,我不知道如何或是否正确等待暂停,在线程中循环并且敲击GetThreadContext
没有'做到了.
编辑: 16字节对齐CONTEXT
结构的地址GetThreadContext
为丹巴特利特建议似乎正在做的伎俩!
Dan*_*ett 16
看一下GetThreadContext函数,它提到了这一点
CONTEXT结构具有高度的处理器特性.有关此结构的特定于处理器的定义以及任何对齐要求,请参阅WinNt.h头文件.
查看此文件,_CONTEXT声明为
typedef struct DECLSPEC_ALIGN(16) _CONTEXT {
...
Run Code Online (Sandbox Code Playgroud)
所以它可能是一个对齐问题.
归档时间: |
|
查看次数: |
2077 次 |
最近记录: |