Windows 7のサンプリングプロファイラで奇妙な問題が発生しています(これまでのWindows OSでAFAICTは32または64ビットでした)。Windows 7のSuspendThreadが成功した後にGetThreadContextが失敗する
プロファイラは、スレッドをSuspendThread
に定期的に中断してから、ResumeThread
を呼び出す前にGetThreadContext
というコンテキストを調べ、プロセスを再開します。これはマルチメディアタイマーのスレッドのコンテキストから実行されます(精度は約1kHzで、Windows 7以前のOSでは通常は無視されるパフォーマンスペナルティがあります)。非常に高いらしさと
ERROR_NOACCESS
998 (0x3E6)
Invalid access to memory location.
、すべてではないものの:SuspendThread
(とResumeThread
)への呼び出しのすべてが成功にもかかわらず、唯一のWindows 7、およびWindows 7の下で
、GetThreadContext
への呼び出しがエラーで失敗します時間。
これは、プロファイリングのいくつかの実行では、他のOSと同様にすべてが機能することを意味します(GetThreadContext
の呼び出しはすべて成功します)が、他の実行ではほとんどすべてが失敗します数千分の1)。まったく同じバイナリ、同じパラメータで起こっています。
ぼんやりと似たような見た目の問題については、GetThreadContext
コールを繰り返すための提案を試みましたが、これ以上の成功はありません。私はまた、SuspendThread
とGetThreadContext
の間でSleep
を実行しようとしましたが、GetThreadContext
がより頻繁に成功しますが、それは劇的な減速をもたらします。
Windows 7 OSがSuspendThread
から復帰していることを示唆していますが、スレッドがまだ停止されていない可能性がありますが、その場合はどうしたら停止するか、スレッドと叩きをGetThreadContext
はしません。
編集:ダン・バートレットにより示唆されるようにGetThreadContext
ためCONTEXT
構造体のアドレスを合わせる 16バイトは、トリックをやっているようです!
非常に具体的に見えます。おそらく、問題を見つけるためにWindowsのチェックビルドを見つけるべきでしょうか? MSDN開発者フォーラムでこの問題について説明しましたか?あるいはMSに直接バグを報告することもできます。 – ChristianWimmer
プロセスの作成時にTHREAD_ALL_ACCESSプロパティを使用しましたか? http://msdn.microsoft.com/en-us/library/ms686769(v=vs.85).aspxを参照してください。「Windows Server 2008およびWindows VistaではTHREAD_ALL_ACCESSフラグの値が増加しました」... –
CONTEXTはWinNT.hの "DECLSPEC_ALIGN(16)"で宣言されています。 –