IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Programmation d'un débuggeur


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 32
    Par défaut Programmation d'un débuggeur
    Bonjour,

    Je dois programmer un débuggeur, tout simple et basé sur l'API Win32, qui doit juste être capable de faire du pas à pas.

    Voici mon code actuel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    #include <stdio.h>
    #include <windows.h>
     
    int main()
    {
     
    	DWORD dwStatus;
    	BOOL bFirstBreak;
    	CONTEXT Context = { 0 };
    	DEBUG_EVENT DebugEvent = { 0 };
    	STARTUPINFO StartupInfo = { 0 };
    	PROCESS_INFORMATION ProcessInformation = { 0 };
     
    	if (!CreateProcess(NULL, "c:\\a.exe", NULL, NULL, FALSE, DEBUG_PROCESS | DEBUG_ONLY_THIS_PROCESS, NULL, NULL, &StartupInfo, &ProcessInformation)) {
     
    		printf("Process failed\n");
    		return -1;
    	}
     
    	printf("Process created\n");
     
    	bFirstBreak = TRUE;
     
    	while (TRUE) {
     
    		WaitForDebugEvent(&DebugEvent, INFINITE);
    		dwStatus = DBG_EXCEPTION_NOT_HANDLED;
     
    		if (DebugEvent.dwDebugEventCode == CREATE_PROCESS_DEBUG_EVENT) {
     
    			printf("Debug start\n");
    		} else if (DebugEvent.dwDebugEventCode == EXIT_PROCESS_DEBUG_EVENT) {
     
    			printf("Debug end\n");
    			break;
    		} else if (DebugEvent.dwDebugEventCode == EXCEPTION_DEBUG_EVENT) {
     
    			EXCEPTION_RECORD ExceptionRecord = DebugEvent.u.Exception.ExceptionRecord;
     
    			if (ExceptionRecord.ExceptionCode == EXCEPTION_BREAKPOINT) {
     
    				if (bFirstBreak == TRUE) {
     
    					bFirstBreak = FALSE;
     
    					Context.ContextFlags = CONTEXT_CONTROL;
    					GetThreadContext(ProcessInformation.hThread, &Context);
    					Context.EFlags = Context.EFlags | 0x100;
    					SetThreadContext(ProcessInformation.hThread, &Context);
     
    					dwStatus = DBG_CONTINUE;
    				}
    			} else if (ExceptionRecord.ExceptionCode == EXCEPTION_SINGLE_STEP) {
     
    				dwStatus = DBG_CONTINUE;
     
    				if (ProcessInformation.dwThreadId == DebugEvent.dwThreadId) {
     
    					Context.ContextFlags = CONTEXT_CONTROL;
    					GetThreadContext(ProcessInformation.hThread, &Context);
    					printf("%08X %08X\n", Context.Eip, ExceptionRecord.ExceptionAddress);
    					Context.EFlags = Context.EFlags | 0x100;
    					SetThreadContext(ProcessInformation.hThread, &Context);
    				}
    			}
    		}
    		ContinueDebugEvent(DebugEvent.dwProcessId, DebugEvent.dwThreadId, dwStatus);
    	}
     
    	return 0;
    }
    Ce que je constate à l'exécution:
    - Au début le code marche sans problème, EXCEPTION_SINGLE_STEP intercepte bien les instructions préalables à l'exécution du main de a.exe.
    - Mais après, EXCEPTION_SINGLE_STEP n'intercepte pas les instructions du main, bien que celui-ci s'exécute (il s'agit d'un hello world, la console me confirme sa bonne exécution).
    - Pourtant, à chaque EXCEPTION_SINGLE_STEP, je remet bien le trap flag à 1.

    Est-ce quelqu'un aurait une piste à creuser ?

    Merci,
    Cordialement.

  2. #2
    Membre chevronné
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Par défaut
    Voilà un projet hyper intéressant.
    J'ai jamais essayé l'api de debug de win32 mais es tu sûr que l'appel à SetThreadContext(ProcessInformation.hThread, &Context);
    que tu fais fonctionne correctement ? vu que tu ne testes pas sa valeur de retour, rien ne prouve que ça marche.

    Edit : La doc n'est pas très précise sur le sujet, mais est-ce que la fonction GetThreadContext() n'écrase pas Context.ContextFlags ?
    Si c'est le cas, alors il faudra le remettre avant d'appeler SetThreadContext(), sinon ton appel n'a aucun effet.

Discussions similaires

  1. Programme de boot qui passe la main à Windows
    Par Bob dans le forum Assembleur
    Réponses: 7
    Dernier message: 25/11/2002, 03h08
  2. [Kylix] Probleme d'execution de programmes...
    Par yopziggy dans le forum EDI
    Réponses: 19
    Dernier message: 03/05/2002, 14h50
  3. communication entre programmes
    Par jérôme dans le forum C
    Réponses: 12
    Dernier message: 16/04/2002, 08h05
  4. Comment débuter en programmation ?
    Par Marc Lussac dans le forum Débuter
    Réponses: 0
    Dernier message: 08/04/2002, 11h29
  5. [Kylix] icone associée à un programme
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 22/03/2002, 09h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo