Я сталкиваюсь со странной проблемой при использовании профилировщика выборки в Windows 7 (таких проблем не было в предыдущих ОС Windows, будь они 32- или 64-разрядными).
Профилировщик работает, периодически приостанавливая поток с SuspendThread
, затем просматривает контекст с GetThreadContext
, прежде чем вызывать ResumeThread
для перезапустите процесс. Все это делается из контекста потока мультимедийного таймера (для точности, около 1 кГц, что на ОС до Windows 7 обычно влечет незначительное снижение производительности).
Только в Windows 7 и Windows 7, хотя вызовы SuspendThread
(и ResumeThread
) все успешны, вызовы GetThreadContext
завершаются с ошибкой:
ERROR_NOACCESS
998 (0x3E6)
Неверный доступ к ячейке памяти.
с очень высокой вероятностью, хотя и не всегда.
Под этим я подразумеваю, что для некоторых запусков профилирования все будет работать так же, как и на других ОС (все вызовы GetThreadContext
будут успешными), но для других запусков они почти все завершатся неудачно (может быть, десяток может быть десятков тысячных). Это происходит с теми же двоичными файлами, с теми же параметрами.
Я попробовал предложения по неопределенно похожим проблемам, чтобы повторить вызов GetThreadContext
, но безуспешно. Я также пытался сделать Sleep
между SuspendThread
и GetThreadContext
, тогда GetThreadContext
чаще выполняется, хотя это приводит к резкому замедлению.
Тем не менее, предполагается, что ОС Windows 7 возвращается с SuspendThread
, в то время как поток, вероятно, еще не был приостановлен - хотя, если это так, я не знаю, как или следует ли правильно ждать приостановки, зацикливаясь на нить и стучать GetThreadContext
не делает этого.
Редактировать: 16-байтовое выравнивание адреса структуры CONTEXT
для GetThreadContext
, как полагает Дэн Бартлетт, похоже, делает свое дело!