3 votes

Les registres GetThreadContext retournent toujours 0xCCCCCCCC

Je suis en train d'essayer d'utiliser GetThreadContext pour voir à quoi les registres de débogage actuels sont définis. Peu importe le programme que je débogue, il renvoie 0xCCCCCCCC. Je suis capable de définir avec succès des points d'arrêt ctx.Dr0 et de les attraper avec un gestionnaire d'exceptions personnalisé, mais si j'essaie de voir l'adresse stockée à ctx.Dr0, elle apparaît toujours comme 0xCCCCCCCC. Pourquoi?

Merci

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

EDIT**

Je pense que je n'ai pas bien posé ma question, car à ce moment-là, je n'avais pas réalisé mon erreur de réflexion. J'essayais en fait d'appeler GetThreadContext à partir du thread dont je voulais obtenir le contexte. Cela ne fonctionne pas pour des raisons évidentes. À la place, je pense que CONTEXT ctx = {CONTEXT_FULL} fonctionne. La réponse la plus utile était le commentaire de Hans Passant ci-dessous.

11voto

Petr Budnik Points 2434

Vous ne pouvez pas obtenir un contexte valide pour un thread en cours d'exécution. Vous devez suspendre le thread pour lequel vous souhaitez obtenir le contexte. Par conséquent, essayer de le faire dans un thread en cours d'exécution ne fonctionnera pas. Cela est clairement indiqué dans la documentation de GetThreadContext():

Vous ne pouvez pas obtenir un contexte valide pour un thread en cours d'exécution. Utilisez la fonction SuspendThread pour suspendre le thread avant d'appeler GetThreadContext.

Si vous appelez GetThreadContext pour le thread en cours, la fonction retourne avec succès; cependant, le contexte retourné n'est pas valide.

3voto

Marius Bancila Points 9184

Sur les plateformes 64 bits, vous pouvez utiliser RtlCaptureContext. Cependant, cela n'est pas disponible sur les plateformes 32 bits, donc vous avez besoin d'une solution différente. Une approche possible est d'utiliser l'assembleur comme décrit dans ce billet de blog Parcourir la pile du thread actuel.

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;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X