3

GetThreadContext を利用して、現在のデバッグ レジスタの設定を表示しようとしています。どのプログラムをデバッグしても、0xCCCCCCCC が返されます。ブレークポイント ctx.Dr0 を正常に設定し、カスタム例外ハンドラでこれらのブレークをキャッチできますが、ctx.Dr0 に保存されているアドレスを表示しようとすると、常に 0xCCCCCCCC と表示されます。何故ですか?

ありがとう

    CONTEXT ctx;
    GetThreadContext(GetCurrentThread(),&ctx);
    cout << hex << ctx.Eip << endl;

編集**

当時、自分の考えの誤りに気づいていなかったので、質問が十分ではなかったと思います。私は実際に、コンテキストを取得したいスレッド内から GetThreadContext を呼び出そうとしていました。これは明らかな理由で機能しません。代わりに、 CONTEXT ctx = {CONTEXT_FULL} が機能すると思います。最も役に立った回答は、以下の Hans Passant のコメントです。

4

2 に答える 2

10

実行中のスレッドの有効なコンテキストを取得できません。コンテキストを取得するスレッドを中断する必要があります。したがって、現在のスレッドでそれを実行しようとしてもうまくいきません。GetThreadContext()これは、ドキュメントに明確に記載されています。

実行中のスレッドの有効なコンテキストを取得できません。GetThreadContext を呼び出す前に、SuspendThread 関数を使用してスレッドを中断します。

現在のスレッドに対して GetThreadContext を呼び出すと、関数は正常に戻ります。ただし、返されたコンテキストは無効です。

于 2013-08-12T20:21:31.790 に答える
3

64 ビット プラットフォームでは、RtlCaptureContextを使用できます。ただし、これは 32 ビット プラットフォームでは利用できないため、別のソリューションが必要です。考えられるアプローチは、このブログ投稿現在のスレッドのスタックのウォーキングで説明されているように、アセンブリを使用することです。

CONTEXT Context;
ZeroMemory( &Context, sizeof( CONTEXT ) );
Context.ContextFlags = CONTEXT_CONTROL;

__asm
{
Label:
  mov [Context.Ebp], ebp;
  mov [Context.Esp], esp;
  mov eax, [Label];
  mov [Context.Eip], eax;
}
于 2013-08-12T22:35:07.653 に答える