GetThreadContext завершается ошибкой после успешного SuspendThread в Windows 7 - PullRequest
19 голосов
/ 15 января 2011

Я сталкиваюсь со странной проблемой при использовании профилировщика выборки в Windows 7 (таких проблем не было в предыдущих ОС Windows, будь они 32- или 64-разрядными).

Профилировщик работает, периодически приостанавливая поток с SuspendThread, затем просматривает контекст с GetThreadContext, прежде чем вызывать ResumeThread для перезапустите процесс. Все это делается из контекста потока мультимедийного таймера (для точности, около 1 кГц, что на ОС до Windows 7 обычно влечет незначительное снижение производительности).

Только в Windows 7 и Windows 7, хотя вызовы SuspendThreadResumeThread) все успешны, вызовы GetThreadContext завершаются с ошибкой:

ERROR_NOACCESS
998 (0x3E6)
Неверный доступ к ячейке памяти.

с очень высокой вероятностью, хотя и не всегда.

Под этим я подразумеваю, что для некоторых запусков профилирования все будет работать так же, как и на других ОС (все вызовы GetThreadContext будут успешными), но для других запусков они почти все завершатся неудачно (может быть, десяток может быть десятков тысячных). Это происходит с теми же двоичными файлами, с теми же параметрами.

Я попробовал предложения по неопределенно похожим проблемам, чтобы повторить вызов GetThreadContext, но безуспешно. Я также пытался сделать Sleep между SuspendThread и GetThreadContext, тогда GetThreadContext чаще выполняется, хотя это приводит к резкому замедлению.

Тем не менее, предполагается, что ОС Windows 7 возвращается с SuspendThread, в то время как поток, вероятно, еще не был приостановлен - хотя, если это так, я не знаю, как или следует ли правильно ждать приостановки, зацикливаясь на нить и стучать GetThreadContext не делает этого.

Редактировать: 16-байтовое выравнивание адреса структуры CONTEXT для GetThreadContext, как полагает Дэн Бартлетт, похоже, делает свое дело!

1 Ответ

16 голосов
/ 16 января 2011

Рассматривая функцию GetThreadContext , в ней упоминается, что

Структура CONTEXT сильно зависит от процессора.Обратитесь к заголовочному файлу WinNt.h для специфических для процессора определений этих структур и любых требований выравнивания.

И, глядя на этот файл, _CONTEXT объявляется с

typedef struct DECLSPEC_ALIGN(16) _CONTEXT {
...

Таквозможно, это может быть проблема с выравниванием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...