|
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
|
|
|
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.aspCe 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
|
|
|
Re: DEBUG API Erreur: Descripteur non valide |
|
Animateur WDF ![](http://old.wdforge.org/uploads/rank3f7d78368d45f.gif)
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
|
|
|
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
|
|
|
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
|
|
|
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
|
|
|
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é: 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
|
|
|
Re: DEBUG API Erreur: Descripteur non valide |
|
Animateur WDF ![](http://old.wdforge.org/uploads/rank3f7d78368d45f.gif)
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
|
|
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.
|
Connexion
Menu
Chercher WDForge
Chercher Web
Partenaires
|