DEBUG API Erreur: Descripteur non valide
DalKiT
Bonjour à tous,

Je suis en train de jouer avec les DEBUG API sous Windev.
Je colle direct le code pour que vous voyez ou ca cloche:

1) Je déclare des structures propres au Debug API:

STARTUPINFOA est une structure
	cb est un entier
	lpReserved est un entier
	lpDesktop est un entier
	lpTitle est un entier
	dwX est un entier
	dwY est un entier
	dwXSize est un entier
	dwYSize est un entier
	dwXCountChars est un entier
	dwYCountChars est un entier
	dwFillAttribute est un entier
	dwFlags est un entier
	wShowWindow est un entier sur 2 octets
	cbReserved2 est un entier sur 2 octets
	lpReserved2 est un entier
	hStdInput est un entier
	hStdOutput est un entier
	hStdError est un entier
FIN

PROCESS_INFORMATION est une structure
	hProcess est un entier
	hThread est un entier
	dwProcessId est un entier
	dwThreadId est un entier
FIN

EXCEPTION_RECORD est une structure
	ExceptionCode est un entier
	ExceptionFlags est un entier
	ExceptionRecord est un entier
	ExceptionAddress est un entier
	NumberParameters est un entier	ExceptionInformation est un entier
FIN

EXCEPTION_DEBUG_INFO est une structure
	ExceptionRecord est un EXCEPTION_RECORD 	dwFirstChance est un entier
FIN

LOAD_DLL_DEBUG_INFO est une structure
	hFile est un entier
	lpBaseOfDll est un entier
	dwDebugInfoFileOffset est un entier
	nDebugInfoSize est un entier
	lpImageName est un entier
	fUnicode est un entier
FIN

DEBUG_EVENT est une structure
	dwDebugEventCode est un entier
	dwProcessId est un entier
	dwThreadId est un entier
        uExceptionDI est un EXCEPTION_DEBUG_INFO
        uLoadDll est une LOAD_DLL_DEBUG_INFO
FIN


2) Je déclare mes objets:

dbEvent est une DEBUG_EVENT
lpStartupInfo est un STARTUPINFOA
lpProcessInformation est un  PROCESS_INFORMATION


3) Je cré le process:

RetourFonction=API("KERNEL32","CreateProcessA",lpApplicationName,"",Null,Null,Faux,OUBinaire(DEBUG_PROCESS,CREATE_NEW_CONSOLE), Null,Null,&lpStartupInfo,&lpProcessInformation)
SI RetourFonction=-1 ALORS
	Erreur (ErreurInfo())
	FinProgramme()
FIN


4) Si tout se passe bien je commence ma boucle de debuggage:

TANTQUE Vrai
	
	API("KERNEL32","WaitForDebugEvent",&dbEvent,0)
	SI (dbEvent:dwProcessId =  lpProcessInformation:dwProcessId) ALORS
		
		SELON  dbEvent:dwDebugEventCode
			
			CAS EXCEPTION_DEBUG_EVENT
				SELON dbEvent:uExceptionDI:ExceptionRecord:ExceptionCode
						
				FIN

				
			CAS CREATE_PROCESS_DEBUG_EVENT
				Trace ("create porocess: "+dbEvent:dwProcessId)

				
			CAS LOAD_DLL_DEBUG_EVENT
				Size est un entier=API ("KERNEL32","GetFileSize",dbEvent:uLoadDll:hFile,0)
                                //Size me retourne -1
// et l'erreur de erreurinfo est :
// GetLastError a renvoyé 6
// Descripteur non valide	
							
		FIN
	FIN
	
	Multitache(-1)
	API ("KERNEL32","ContinueDebugEvent",dbEvent:dwProcessId,dbEvent:dwThreadId,DBG_CONTINUE)
FIN


dbEvent:uLoadDll:hFile est égal à 0 lors de l'appel à GetFileSize. Donc la j'avoue que je ne vois pas.
J'ai fais la meme chose avec VC++ 6.0 et la ca marche nickel.
J'ai également essayé d'utiliser avec windev l'API CreateFileA me retournant un Handle, puis GetFileSize. Ce test me retourne bien la taille de l executable.

Alors pourquoi dbEvent:uLoadDll:hFile (Qui correspond au handle du module chargé par executable) est égal à 0 ?
Est ce une mauvaise déclaration d une structure ?
Un passage de pointeur oublié ?

Merci d'avances pour vos réponses.

Bonne journée

Contribution le : 11/03/2006 10:53
Créer un fichier PDF de la contribution Imprimer


Re: DEBUG API Erreur: Descripteur non valide
DalKiT
Je vais répondre tout seul à ma question ;)

Après maintes recherches, j'ai enfin trouvé la solution.

Il faut déclarer une structure transitoire (que j'appelé _U) entre DEBUG_EVENT et LOAD_DLL_DEBUG_INFO, comme ceci:

_U est une structure
	uLoadDll est une LOAD_DLL_DEBUG_INFO
	ExceptionDI est un EXCEPTION_DEBUG_INFO
FIN

DEBUG_EVENT est une structure
	dwDebugEventCode est un entier
	dwProcessId est un entier
	dwThreadId est un entier
	u est un _U
FIN


Cette structure correspond en fait à l'union que Microsoft décrit dans la msdn:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/debug/base/debug_event_str.asp

Ce qui m'avait induit en erreur est que WDAPI, dans l'exemple de la structure DEBUG_EVENT, ne "gère" pas cette sorte d'union. J'avais donc suivi leur exemple sans vraiment faire attention.
Donc problème résolu.

Et encore chapeau bas pour votre site.

Bonne journée.

Contribution le : 11/03/2006 13:08
Créer un fichier PDF de la contribution Imprimer


Re: DEBUG API Erreur: Descripteur non valide
Animateur WDF
Inscrit:
02/03/2003 04:07
De Noisy le grand(93)
Post(s): 2745
Bonjour Dalkit,

Vous posez une question et en attendiez une réponse,
Vous avez continuer vos recherches, trouvé la solution et en faites profiter les membres.

Nous vous remercions de cette facon de faire que nous apprecions tout particulièrement.
Cela reflète bien l'esprit de communauté

Contribution le : 11/03/2006 13:55
_________________
@A+
Contact (privé)......
email : drcharly@wdforge.org
[DrCharly93]
Créer un fichier PDF de la contribution Imprimer


Re: DEBUG API Erreur: Descripteur non valide
DalKiT
C est encore moi :)

Alors j'ai encore un problème que je n'arrive pas à résoudre:

Ma boucle de debuggage (voir plus haut le code) fonctionne correctement.

Le code:
 API("KERNEL32","WaitForDebugEvent",&dbEvent,-1)


est bloquant lorsqu'il a fini de charger les module, etc....

Donc il faudrait mettre la boucle dans un Thread pour ne bloquer mon programme principal. C'est la que ca coince.

J'ai donc ajouter:
ThreadExécute("Thread1",threadNormal,DoDebugLoop)


avec DoDebugLoop une procédure regroupant ma boucle de debuggage.

Donc si je met le Thread, mon prog ne debugge plus rien du tout.
Le processus qu'il a chargé est égal à 0, ce qui n'est pas normal.

J'ai l'impression que le Thread de windev empeche de debugger le "bon" processus, ou le "tue" avant qu'il ne soit chargé.

J'ai bien entendu essayé avec vc++ et ca fonctionne.

Donc si une personne a des idée, je suis preneur

NB: Si quelqu'un a deja essayé d'utiliser l'API CreateThread avec windev, je suis preneur également ;)

Bonne soirée

Contribution le : 11/03/2006 19:52
Créer un fichier PDF de la contribution Imprimer


Re: DEBUG API Erreur: Descripteur non valide
Anonyme
Re bonsoir,

Après des recherches de codes sur le net, j'ai trouvé ceci en ce qui concerne l execution d un thread secondaire avec les API:

hThread est un entier=API ("KERNEL32","CreateThread",0,0,DoDebugLoop,0,0,0)


Avec ce qui est dis dans la MSDN, cela cré un thread secondaire, ce qui est exact. Mon executable chargé est bien débuggé mais la fenetre principale windev (Celle qui charge l exe à debugger) reste toujours figée sur l'appel à WaitForDebugEvent.

Je me pose donc deux questions:

1) Pourquoi WaitForDebugEvent bloque mon Thread ?
2) Pourquoi ThreadExecute ne fonctionne pas comme l API CreateThread ?. Pourtant, dans l'aide de windev il est dit que ThreadExecute cré un Thread secondaire au thread principal. A voir..

Bonne nuit ;)

Contribution le : 11/03/2006 23:08
Créer un fichier PDF de la contribution Imprimer


Re: DEBUG API Erreur: Descripteur non valide
Anonyme
Bonsoir,

Continuant mes tests sur les DEBUG API, je me suis rendu compte que la structure déclarée était incorrecte:

_U est une structure
	uException 			est un EXCEPTION_DEBUG_INFO
	uCreateThread 		est un CREATE_THREAD_DEBUG_INFO
	uCreateProcessInfo 	est un CREATE_PROCESS_DEBUG_INFO
	uExitThread 		est un EXIT_THREAD_DEBUG_INFO
	uExitProcess 		est un EXIT_PROCESS_DEBUG_INFO
	uLoadDll 			est un LOAD_DLL_DEBUG_INFO	
	uUnLoadDll 			est un UNLOAD_DLL_DEBUG_INFO
	uRipInfo 			est un RIP_INFO	
FIN

DEBUG_EVENT est une structure
	
	dwDebugEventCode est un entier sans signe sur 4 octets//Type C : DWORD
	dwProcessId est un entier sans signe sur 4 octets //Type C : DWORD
	dwThreadId est un entier sans signe sur 4 octets //Type C : DWORD
	u est un _u


Je pensais que déclarer une structure transitoire ferait comme le mot clé "union" déclaré dans le fichier WINBASE.H:

typedef struct _DEBUG_EVENT {
    DWORD dwDebugEventCode;
    DWORD dwProcessId;
    DWORD dwThreadId;
    union {
        EXCEPTION_DEBUG_INFO Exception;
        CREATE_THREAD_DEBUG_INFO CreateThread;
        CREATE_PROCESS_DEBUG_INFO CreateProcessInfo;
        EXIT_THREAD_DEBUG_INFO ExitThread;
        EXIT_PROCESS_DEBUG_INFO ExitProcess;
        LOAD_DLL_DEBUG_INFO LoadDll;
        UNLOAD_DLL_DEBUG_INFO UnloadDll;
        OUTPUT_DEBUG_STRING_INFO DebugString;
        RIP_INFO RipInfo;
    } u;
} DEBUG_EVENT, *LPDEBUG_EVENT;


Lors de la pratique, c'est autre chose. Je vais essayer d'etre le plus clair possible.
Prenons l'exemple de la structure _U déclarée plus haut: uException est mis en premier et plus loin nous trouvons uLoadDll. Je vais reprendre le corps du code de la boucle de debuggage:

TANTQUE bBoucle=Faux
	
	API("KERNEL32","WaitForDebugEvent",&dbEvent,DBG_INFINITE)
		
	SI (dbEvent:dwProcessId = lpProcessInformation:dwProcessId) ALORS
		
		SELON  dbEvent:dwDebugEventCode
			
			CAS EXCEPTION_DEBUG_EVENT
				SELON dbEvent:uException:ExceptionRecord:ExceptionCode
					
					CAS EXCEPTION_BREAKPOINT
					     //(1) L' evenement passe dans ce cas si uException est mis en 1er dans la structure _U.
					     //Pour info, dbEvent:uException:ExceptionRecord:ExceptionCode est bien égal à -2147483645 (0x80000003),
					     //sinon, il est égal à 1 !! (Je ne sais pas pourquoi).
				FIN

			CAS CREATE_PROCESS_DEBUG_EVENT
				ListeAjoute(LIST_LOG,"Process Created: "+dbEvent:dwProcessId)
				
			CAS LOAD_DLL_DEBUG_EVENT
				//(2) dbEvent:uLoadDll:hFile est correct si uLoadDll est mis en 1er dans la structure _U,
				//sinon, dbEvent:uLoadDll:hFile est incorrect (soit 0, etc ...)

			CAS UNLOAD_DLL_DEBUG_EVENT
				ListeAjoute(LIST_LOG,"Dll Unload: "+dbEvent:uLoadDll:hFile)
		FIN
	SINON

	FIN

	API ("KERNEL32","ContinueDebugEvent",dbEvent:dwProcessId,dbEvent:dwThreadId,DBG_CONTINUE)
FIN


Je récapitule:
-> uLoadDll en 1er: le (2) correct mais pas le (1)
-> uException en 1er: le (1) correct mais pas le (2).

J'ai vérifié en codant le meme programme en C, mais en modifiant dans WINBASE.H la structure DEBUG_EVENT comme ceci (En fait j'ai oté le "union" en le remplacant par une structure: _U):

typedef struct _U
{
    LOAD_DLL_DEBUG_INFO LoadDll;
    EXCEPTION_DEBUG_INFO Exception;
    CREATE_THREAD_DEBUG_INFO CreateThread;
    CREATE_PROCESS_DEBUG_INFO CreateProcessInfo;
    EXIT_THREAD_DEBUG_INFO ExitThread;
    EXIT_PROCESS_DEBUG_INFO ExitProcess;
    UNLOAD_DLL_DEBUG_INFO UnloadDll;
    OUTPUT_DEBUG_STRING_INFO DebugString;
    RIP_INFO RipInfo;	

} U, *LPU;

typedef struct _DEBUG_EVENT
{
    DWORD dwDebugEventCode;
    DWORD dwProcessId;
    DWORD dwThreadId;
    U u;
        
} DEBUG_EVENT, *LPDEBUG_EVENT;


Et le plus surprenant, c'est que le programme réagi comme celui de windev suivant si LOAD_DLL_DEBUG_INFO LoadDll est en 1er ou non (idem pour EXCEPTION_DEBUG_INFO Exception).

Donc au final, je pense que la déclaration d'une structure n'est pas la bonne idée (Vous l'aviez deviné je pense ;) )

Donc par quoi pourrais-je la remplacer ?

Merci d'avoir pris le temps de me lire.

Bonne soirée

Contribution le : 12/03/2006 18:39
Créer un fichier PDF de la contribution Imprimer


Re: DEBUG API Erreur: Descripteur non valide
DalKiT
Bonsoir,

J'ai enfin trouvé pourquoi le remplacement du UNION par une structure ne fonctionnait pas.

La manière la plus simple est bien de remplacer le UNION par une structure (Donc j'étais bien sur la bonne piste au départ):

_U est une structure
	uException 			est un EXCEPTION_DEBUG_INFO
	uCreateThread 		est un CREATE_THREAD_DEBUG_INFO
	uCreateProcessInfo 	est un CREATE_PROCESS_DEBUG_INFO
	uExitThread 		est un EXIT_THREAD_DEBUG_INFO
	uExitProcess 		est un EXIT_PROCESS_DEBUG_INFO
	uLoadDll 			est un LOAD_DLL_DEBUG_INFO	
	uUnLoadDll 			est un UNLOAD_DLL_DEBUG_INFO
	uRipInfo 			est un RIP_INFO	
FIN

DEBUG_EVENT est une structure
	
	dwDebugEventCode est un entier sans signe sur 4 octets//Type C : DWORD
	dwProcessId est un entier sans signe sur 4 octets //Type C : DWORD
	dwThreadId est un entier sans signe sur 4 octets //Type C : DWORD
	u est un _u


Ce qui change, c est la facon dont on recupere les valeurs de la nouvelle structure. En fait il faut créer un objet de chaque structure de la nouvelle structure et la "caster" (Comme en C). Un exemple pour EXCEPTION_DEBUG_INFO:

sException est un EXCEPTION_DEBUG_INFO 


Ensuite dans la cas de EXCEPTION_DEBUG_EVENT (Voir les autres messages pour plus de détails), il faut caster avec la fonction windev Transfert:

Transfert (&sException,&dbEvent:u,Dimension(sException))


Il ne nous reste plus qu'a récupérer le code de l exception:

sException:ExceptionRecord:ExceptionCode


Idem pour la structure LOAD_DLL_DEBUG_INFO.
Declaration d un objet:

sLoadDll est un LOAD_DLL_DEBUG_INFO


Puis récupération d une des valeurs de la structure en la "castant":

Transfert (&sLoadDll,&dbEvent:u,Dimension(sLoadDll))


Récupération du handle du module chargé:
sLoadDll:hFile


Ca pourra peut etre servir pour ceux qui souhaitent oter les UNION en utilisant windev.

Reste encore le problème du Thread bloquant

Bonne soirée

Contribution le : 14/03/2006 20:31
Créer un fichier PDF de la contribution Imprimer


Re: DEBUG API Erreur: Descripteur non valide
Animateur WDF
Inscrit:
02/03/2003 04:07
De Noisy le grand(93)
Post(s): 2745
Bonjour,

Citation :

API("KERNEL32","WaitForDebugEvent",&dbEvent,-1)


je ne connais pas et n'utilise pace cette api mais WaitForDebugEvent utilise 2 paramètres:
- DEBUG_EVENT_BUFFER qui doit correspondre à &dbEvent
- dwMilliseconds un entier qui représente la durée en miliseconde à attendre.

peur être en utilisant une valeur positive comme 100 cela eviterait de bloquer l'api.

Contribution le : 15/03/2006 10:16
_________________
@A+
Contact (privé)......
email : drcharly@wdforge.org
[DrCharly93]
Créer un fichier PDF de la contribution Imprimer



 Haut   Précédent   Suivant




Enregistrer votre réponse
CompteNom   Mot de passe   Authentification
Message:


Vous ne pouvez pas débuter de nouveaux sujets.
Vous pouvez voir les sujets.
Vous ne pouvez pas répondre aux contributions.
Vous ne pouvez pas éditer vos contributions.
Vous ne pouvez pas effacez vos contributions.
Vous ne pouvez pas ajouter de nouveaux sondages.
Vous ne pouvez pas voter en sondage.
Vous ne pouvez pas attacher des fichiers à vos contributions.
Vous ne pouvez pas poster sans approbation.

[Recherche avancée]


Connexion
Menu
Chercher WDForge
Chercher Web
Partenaires
Visualiser tous les Partenaires...
WinDev, WebDev, WinDev Mobile et HyperFile sont des marques déposées par PCSoft. |  Voter |  Legal |  Contact |   XOOPS 2.0.13.2