加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

winapi – GetThreadContext在Windows 7中成功挂起后,失败

发布时间:2020-12-13 21:15:42 所属栏目:Windows 来源:网络整理
导读:Windows 7中的抽样分析器遇到了一个奇怪的问题(在以前的Windows操作系统上没有这样的问题AFAICT,不论是32位还是64位)。 分析器通过定期挂起一个带有 SuspendThread 的线程,然后在调用 ResumeThread 重新启动过程之前查看与 GetThreadContext 的上下文。所
Windows 7中的抽样分析器遇到了一个奇怪的问题(在以前的Windows操作系统上没有这样的问题AFAICT,不论是32位还是64位)。

分析器通过定期挂起一个带有SuspendThread的线程,然后在调用ResumeThread重新启动过程之前查看与GetThreadContext的上下文。所有这一切都是从多媒体定时器的线程(准确性,大约1kHZ,其在Windows 7之前的操作系统通常导致可忽略的性能损失)的上下文中完成。

仅在Windows 7和Windows 7下,即使对SuspendThread(和ResumeThread)的调用都成功,对GetThreadContext的调用失败,出现错误:

ERROR_NOACCESS
998 (0x3E6)
Invalid access to memory location.

有非常高的可能性,虽然不是所有的时间。

我的意思是,对于某些剖析运行,一切都将像在其他操作系统上一样工作(所有的GetThreadContext调用都会成功),但是对于其他运行,它们几乎都会失败(保存十几个可能是几千分之一) 。正是发生与完全相同的二进制文件,相同的参数。

我已经对模糊的类似的问题尝试了重复GetThreadContext调用的建议,没有更多的成功。我也尝试在SuspendThread和GetThreadContext之间做一个Sleep,然后GetThreadContext更经常地成功,尽管它导致剧烈的放缓。

然而,它建议Windows 7操作系统从SuspendThread返回,而线程可能尚未暂停 – 尽管如此,我不知道如何或如果正确等待暂停,循环线程并敲击GetThreadContext不这样做

编辑:16位字节对齐GetThreadContext的CONTEXT结构的地址,正如丹·巴特利特所建议的那样,似乎在诀窍!

看着 GetThreadContext的功能,它提到

The CONTEXT structure is highly processor specific. Refer to the WinNt.h header file for processor-specific definitions of this structures and any alignment requirements.

并查看此文件,_CONTEXT声明为

typedef struct DECLSPEC_ALIGN(16) _CONTEXT {
...

所以这可能是一个对齐问题。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读